Avi Drissman | 05dfbc82 | 2022-09-13 21:25:34 | [diff] [blame] | 1 | // Copyright 2012 The Chromium Authors |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | // This file contains the GPUTrace class. |
| 6 | #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_ |
| 7 | #define GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_ |
| 8 | |
avi | f15d60a | 2015-12-21 17:06:33 | [diff] [blame] | 9 | #include <stdint.h> |
| 10 | |
Kalvin Lee | 9e2c2e8 | 2025-04-16 22:37:42 | [diff] [blame] | 11 | #include <array> |
mostynb | 6682b1c4 | 2016-04-19 10:17:30 | [diff] [blame] | 12 | #include <memory> |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 13 | #include <string> |
dcastagna | 82922f8 | 2015-02-12 19:21:30 | [diff] [blame] | 14 | #include <vector> |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 15 | |
Brett Wilson | 55ff1475e | 2017-09-26 00:28:48 | [diff] [blame] | 16 | #include "base/containers/circular_deque.h" |
Brett Wilson | 1f07f20e | 2017-10-02 18:55:28 | [diff] [blame] | 17 | #include "base/containers/stack.h" |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 18 | #include "base/memory/raw_ptr.h" |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 19 | #include "base/threading/thread.h" |
Gabriel Charette | d87f10f | 2022-03-31 00:44:22 | [diff] [blame] | 20 | #include "base/time/time.h" |
Antoine Labour | 83a0aed1 | 2018-01-10 04:52:38 | [diff] [blame] | 21 | #include "gpu/gpu_gles2_export.h" |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 22 | |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 23 | namespace gl { |
| 24 | class GPUTimingClient; |
| 25 | class GPUTimer; |
Jonathan Backer | e26739c | 2018-05-15 13:27:07 | [diff] [blame] | 26 | } // namespace gl |
dyen | 5b1c02ff | 2015-02-26 01:54:00 | [diff] [blame] | 27 | |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 28 | namespace gpu { |
Jonathan Backer | e26739c | 2018-05-15 13:27:07 | [diff] [blame] | 29 | |
| 30 | class DecoderContext; |
| 31 | |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 32 | namespace gles2 { |
| 33 | |
dyen@chromium.org | b4af07d | 2014-08-20 00:11:57 | [diff] [blame] | 34 | class Outputter; |
| 35 | class GPUTrace; |
| 36 | |
vmiura@chromium.org | cac1654 | 2014-01-15 17:53:51 | [diff] [blame] | 37 | // Id used to keep trace namespaces separate |
| 38 | enum GpuTracerSource { |
dyen@chromium.org | b4af07d | 2014-08-20 00:11:57 | [diff] [blame] | 39 | kTraceGroupInvalid = -1, |
| 40 | |
dyen | 53749b4 | 2015-06-12 20:53:11 | [diff] [blame] | 41 | kTraceCHROMIUM, |
| 42 | kTraceDecoder, |
Jonathan Backer | e26739c | 2018-05-15 13:27:07 | [diff] [blame] | 43 | kTraceDisjoint, // Used internally. |
dyen@chromium.org | b4af07d | 2014-08-20 00:11:57 | [diff] [blame] | 44 | |
| 45 | NUM_TRACER_SOURCES |
| 46 | }; |
| 47 | |
| 48 | // Marker structure for a Trace. |
| 49 | struct TraceMarker { |
dyen | cb86f2f | 2014-12-09 18:35:41 | [diff] [blame] | 50 | TraceMarker(const std::string& category, const std::string& name); |
vmpstr | 3b7b8b2 | 2016-03-01 23:00:20 | [diff] [blame] | 51 | TraceMarker(const TraceMarker& other); |
dyen@chromium.org | b4af07d | 2014-08-20 00:11:57 | [diff] [blame] | 52 | ~TraceMarker(); |
| 53 | |
dyen | cb86f2f | 2014-12-09 18:35:41 | [diff] [blame] | 54 | std::string category_; |
dyen@chromium.org | b4af07d | 2014-08-20 00:11:57 | [diff] [blame] | 55 | std::string name_; |
| 56 | scoped_refptr<GPUTrace> trace_; |
vmiura@chromium.org | cac1654 | 2014-01-15 17:53:51 | [diff] [blame] | 57 | }; |
| 58 | |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 59 | // Traces GPU Commands. |
Antoine Labour | 83a0aed1 | 2018-01-10 04:52:38 | [diff] [blame] | 60 | class GPU_GLES2_EXPORT GPUTracer { |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 61 | public: |
Kramer Ge | 254a8ff | 2020-02-03 20:01:58 | [diff] [blame] | 62 | explicit GPUTracer(DecoderContext* decoder, bool context_is_gl = true); |
Peter BostrΓΆm | dbacdc2 | 2021-09-23 22:11:46 | [diff] [blame] | 63 | |
| 64 | GPUTracer(const GPUTracer&) = delete; |
| 65 | GPUTracer& operator=(const GPUTracer&) = delete; |
| 66 | |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 67 | virtual ~GPUTracer(); |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 68 | |
dyen | dbfb90d | 2015-03-26 02:41:46 | [diff] [blame] | 69 | void Destroy(bool have_context); |
| 70 | |
vmiura@chromium.org | cac1654 | 2014-01-15 17:53:51 | [diff] [blame] | 71 | // Scheduled processing in decoder begins. |
dyen@chromium.org | b4af07d | 2014-08-20 00:11:57 | [diff] [blame] | 72 | bool BeginDecoding(); |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 73 | |
vmiura@chromium.org | cac1654 | 2014-01-15 17:53:51 | [diff] [blame] | 74 | // Scheduled processing in decoder ends. |
dyen@chromium.org | b4af07d | 2014-08-20 00:11:57 | [diff] [blame] | 75 | bool EndDecoding(); |
vmiura@chromium.org | cac1654 | 2014-01-15 17:53:51 | [diff] [blame] | 76 | |
| 77 | // Begin a trace marker. |
dyen | cb86f2f | 2014-12-09 18:35:41 | [diff] [blame] | 78 | bool Begin(const std::string& category, const std::string& name, |
| 79 | GpuTracerSource source); |
vmiura@chromium.org | cac1654 | 2014-01-15 17:53:51 | [diff] [blame] | 80 | |
| 81 | // End the last started trace marker. |
dyen@chromium.org | b4af07d | 2014-08-20 00:11:57 | [diff] [blame] | 82 | bool End(GpuTracerSource source); |
vmiura@chromium.org | cac1654 | 2014-01-15 17:53:51 | [diff] [blame] | 83 | |
dyen | ed04ca3e | 2015-08-26 21:05:01 | [diff] [blame] | 84 | bool HasTracesToProcess(); |
| 85 | void ProcessTraces(); |
| 86 | |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 87 | virtual bool IsTracing(); |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 88 | |
| 89 | // Retrieve the name of the current open trace. |
| 90 | // Returns empty string if no current open trace. |
dyen | 4bb4328 | 2015-01-08 01:09:56 | [diff] [blame] | 91 | const std::string& CurrentCategory(GpuTracerSource source) const; |
| 92 | const std::string& CurrentName(GpuTracerSource source) const; |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 93 | |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 94 | protected: |
Kramer Ge | 254a8ff | 2020-02-03 20:01:58 | [diff] [blame] | 95 | bool is_gpu_service_tracing_enabled() { |
| 96 | return *gpu_trace_srv_category_ != 0; |
| 97 | } |
| 98 | bool is_gpu_device_tracing_enabled() { |
| 99 | return *gpu_trace_dev_category_ != 0 && can_trace_dev_; |
| 100 | } |
| 101 | |
Chandan Padhi | 07f05c0 | 2017-09-19 02:52:53 | [diff] [blame] | 102 | scoped_refptr<gl::GPUTimingClient> gpu_timing_client_; |
Ali Hijazi | f5d8b74 | 2024-05-29 16:10:43 | [diff] [blame] | 103 | raw_ptr<const unsigned char> gpu_trace_srv_category_; |
| 104 | raw_ptr<const unsigned char> gpu_trace_dev_category_; |
Kramer Ge | 254a8ff | 2020-02-03 20:01:58 | [diff] [blame] | 105 | // Disable gpu.device tracing if context is corrupted or not GL. |
| 106 | bool can_trace_dev_; |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 107 | |
Chandan Padhi | 07f05c0 | 2017-09-19 02:52:53 | [diff] [blame] | 108 | private: |
dyen | 53749b4 | 2015-06-12 20:53:11 | [diff] [blame] | 109 | bool CheckDisjointStatus(); |
| 110 | void ClearOngoingTraces(bool have_context); |
dyen@chromium.org | b4af07d | 2014-08-20 00:11:57 | [diff] [blame] | 111 | |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 112 | raw_ptr<Outputter> outputter_ = nullptr; |
Kalvin Lee | 9e2c2e8 | 2025-04-16 22:37:42 | [diff] [blame] | 113 | std::array<std::vector<TraceMarker>, NUM_TRACER_SOURCES> markers_; |
Brett Wilson | 55ff1475e | 2017-09-26 00:28:48 | [diff] [blame] | 114 | base::circular_deque<scoped_refptr<GPUTrace>> finished_traces_; |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 115 | raw_ptr<DecoderContext> decoder_; |
avi | f15d60a | 2015-12-21 17:06:33 | [diff] [blame] | 116 | int64_t disjoint_time_ = 0; |
dyen | 53749b4 | 2015-06-12 20:53:11 | [diff] [blame] | 117 | bool gpu_executing_ = false; |
dyen | a56208c | 2015-06-25 01:43:40 | [diff] [blame] | 118 | bool began_device_traces_ = false; |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 119 | }; |
| 120 | |
Antoine Labour | 83a0aed1 | 2018-01-10 04:52:38 | [diff] [blame] | 121 | class GPU_GLES2_EXPORT Outputter { |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 122 | public: |
Chris Watkins | 8103077 | 2017-12-07 01:20:56 | [diff] [blame] | 123 | virtual ~Outputter() = default; |
Chandan Padhi | 07f05c0 | 2017-09-19 02:52:53 | [diff] [blame] | 124 | |
dyen | 06ae0b2 | 2015-05-07 03:45:52 | [diff] [blame] | 125 | virtual void TraceDevice(GpuTracerSource source, |
| 126 | const std::string& category, |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 127 | const std::string& name, |
avi | f15d60a | 2015-12-21 17:06:33 | [diff] [blame] | 128 | int64_t start_time, |
| 129 | int64_t end_time) = 0; |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 130 | |
dyen | 06ae0b2 | 2015-05-07 03:45:52 | [diff] [blame] | 131 | virtual void TraceServiceBegin(GpuTracerSource source, |
| 132 | const std::string& category, |
dyen | 81aaafd | 2015-01-16 21:51:11 | [diff] [blame] | 133 | const std::string& name) = 0; |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 134 | |
dyen | 06ae0b2 | 2015-05-07 03:45:52 | [diff] [blame] | 135 | virtual void TraceServiceEnd(GpuTracerSource source, |
| 136 | const std::string& category, |
dyen | 81aaafd | 2015-01-16 21:51:11 | [diff] [blame] | 137 | const std::string& name) = 0; |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 138 | }; |
| 139 | |
Antoine Labour | 83a0aed1 | 2018-01-10 04:52:38 | [diff] [blame] | 140 | class GPU_GLES2_EXPORT TraceOutputter : public Outputter { |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 141 | public: |
Chandan Padhi | 07f05c0 | 2017-09-19 02:52:53 | [diff] [blame] | 142 | TraceOutputter(); |
| 143 | explicit TraceOutputter(const std::string& name); |
Peter BostrΓΆm | dbacdc2 | 2021-09-23 22:11:46 | [diff] [blame] | 144 | |
| 145 | TraceOutputter(const TraceOutputter&) = delete; |
| 146 | TraceOutputter& operator=(const TraceOutputter&) = delete; |
| 147 | |
Chandan Padhi | 07f05c0 | 2017-09-19 02:52:53 | [diff] [blame] | 148 | ~TraceOutputter() override; |
| 149 | |
dyen | 06ae0b2 | 2015-05-07 03:45:52 | [diff] [blame] | 150 | void TraceDevice(GpuTracerSource source, |
| 151 | const std::string& category, |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 152 | const std::string& name, |
avi | f15d60a | 2015-12-21 17:06:33 | [diff] [blame] | 153 | int64_t start_time, |
| 154 | int64_t end_time) override; |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 155 | |
dyen | 06ae0b2 | 2015-05-07 03:45:52 | [diff] [blame] | 156 | void TraceServiceBegin(GpuTracerSource source, |
| 157 | const std::string& category, |
dyen | 81aaafd | 2015-01-16 21:51:11 | [diff] [blame] | 158 | const std::string& name) override; |
dyen | 75755fa | 2015-01-07 22:55:07 | [diff] [blame] | 159 | |
dyen | 06ae0b2 | 2015-05-07 03:45:52 | [diff] [blame] | 160 | void TraceServiceEnd(GpuTracerSource source, |
| 161 | const std::string& category, |
dyen | 81aaafd | 2015-01-16 21:51:11 | [diff] [blame] | 162 | const std::string& name) override; |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 163 | |
Chandan Padhi | 07f05c0 | 2017-09-19 02:52:53 | [diff] [blame] | 164 | private: |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 165 | base::Thread named_thread_; |
Chandan Padhi | da920217 | 2018-06-05 19:02:20 | [diff] [blame] | 166 | base::PlatformThreadId named_thread_id_ = base::kInvalidThreadId; |
avi | f15d60a | 2015-12-21 17:06:33 | [diff] [blame] | 167 | uint64_t local_trace_device_id_ = 0; |
| 168 | uint64_t local_trace_service_id_ = 0; |
dyen | 151b6d69 | 2015-05-11 16:30:21 | [diff] [blame] | 169 | |
Kalvin Lee | 9e2c2e8 | 2025-04-16 22:37:42 | [diff] [blame] | 170 | std::array<base::stack<uint64_t>, NUM_TRACER_SOURCES> trace_service_id_stack_; |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 171 | }; |
| 172 | |
Antoine Labour | 83a0aed1 | 2018-01-10 04:52:38 | [diff] [blame] | 173 | class GPU_GLES2_EXPORT GPUTrace : public base::RefCounted<GPUTrace> { |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 174 | public: |
Chandan Padhi | 07f05c0 | 2017-09-19 02:52:53 | [diff] [blame] | 175 | GPUTrace(Outputter* outputter, |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 176 | gl::GPUTimingClient* gpu_timing_client, |
dyen | 06ae0b2 | 2015-05-07 03:45:52 | [diff] [blame] | 177 | const GpuTracerSource source, |
dyen | cb86f2f | 2014-12-09 18:35:41 | [diff] [blame] | 178 | const std::string& category, |
dyen@chromium.org | fde50c7 | 2014-07-29 23:26:32 | [diff] [blame] | 179 | const std::string& name, |
dyen | 052dacb | 2015-04-11 01:09:04 | [diff] [blame] | 180 | const bool tracing_service, |
| 181 | const bool tracing_device); |
dyen | cb86f2f | 2014-12-09 18:35:41 | [diff] [blame] | 182 | |
Peter BostrΓΆm | 1ab741d | 2021-10-05 22:49:41 | [diff] [blame] | 183 | GPUTrace(const GPUTrace&) = delete; |
| 184 | GPUTrace& operator=(const GPUTrace&) = delete; |
| 185 | |
dyen | dbfb90d | 2015-03-26 02:41:46 | [diff] [blame] | 186 | void Destroy(bool have_context); |
| 187 | |
dyen | 052dacb | 2015-04-11 01:09:04 | [diff] [blame] | 188 | void Start(); |
| 189 | void End(); |
dyen@chromium.org | fde50c7 | 2014-07-29 23:26:32 | [diff] [blame] | 190 | bool IsAvailable(); |
dyen | 052dacb | 2015-04-11 01:09:04 | [diff] [blame] | 191 | bool IsServiceTraceEnabled() const { return service_enabled_; } |
| 192 | bool IsDeviceTraceEnabled() const { return device_enabled_; } |
dyen@chromium.org | fde50c7 | 2014-07-29 23:26:32 | [diff] [blame] | 193 | void Process(); |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 194 | |
| 195 | private: |
dyen@chromium.org | fde50c7 | 2014-07-29 23:26:32 | [diff] [blame] | 196 | ~GPUTrace(); |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 197 | |
| 198 | void Output(); |
| 199 | |
dyen@chromium.org | fde50c7 | 2014-07-29 23:26:32 | [diff] [blame] | 200 | friend class base::RefCounted<GPUTrace>; |
| 201 | |
dyen | 06ae0b2 | 2015-05-07 03:45:52 | [diff] [blame] | 202 | const GpuTracerSource source_ = kTraceGroupInvalid; |
| 203 | const std::string category_; |
| 204 | const std::string name_; |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 205 | raw_ptr<Outputter> outputter_ = nullptr; |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 206 | std::unique_ptr<gl::GPUTimer> gpu_timer_; |
dyen | 052dacb | 2015-04-11 01:09:04 | [diff] [blame] | 207 | const bool service_enabled_ = false; |
| 208 | const bool device_enabled_ = false; |
vmiura@chromium.org | f71dc36 | 2014-01-08 21:50:50 | [diff] [blame] | 209 | }; |
| 210 | |
dyen | b547eff6 | 2015-01-17 00:14:56 | [diff] [blame] | 211 | class ScopedGPUTrace { |
dcastagna | 82922f8 | 2015-02-12 19:21:30 | [diff] [blame] | 212 | public: |
| 213 | ScopedGPUTrace(GPUTracer* gpu_tracer, |
| 214 | GpuTracerSource source, |
| 215 | const std::string& category, |
| 216 | const std::string& name) |
| 217 | : gpu_tracer_(gpu_tracer), source_(source) { |
| 218 | gpu_tracer_->Begin(category, name, source_); |
| 219 | } |
dyen | b547eff6 | 2015-01-17 00:14:56 | [diff] [blame] | 220 | |
dcastagna | 82922f8 | 2015-02-12 19:21:30 | [diff] [blame] | 221 | ~ScopedGPUTrace() { gpu_tracer_->End(source_); } |
dyen | b547eff6 | 2015-01-17 00:14:56 | [diff] [blame] | 222 | |
dcastagna | 82922f8 | 2015-02-12 19:21:30 | [diff] [blame] | 223 | private: |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 224 | raw_ptr<GPUTracer> gpu_tracer_; |
dcastagna | 82922f8 | 2015-02-12 19:21:30 | [diff] [blame] | 225 | GpuTracerSource source_; |
dyen | b547eff6 | 2015-01-17 00:14:56 | [diff] [blame] | 226 | }; |
| 227 | |
dsinclair@chromium.org | fb97b66 | 2013-02-20 23:02:14 | [diff] [blame] | 228 | } // namespace gles2 |
| 229 | } // namespace gpu |
| 230 | |
| 231 | #endif // GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_ |