| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This file contains the GPUTrace class. | 5 // This file contains the GPUTrace class. |
| 6 #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_ | 6 #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_ |
| 7 #define GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_ | 7 #define GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_ |
| 8 | 8 |
| 9 #include <deque> |
| 9 #include <string> | 10 #include <string> |
| 11 #include <vector> |
| 10 | 12 |
| 11 #include "base/basictypes.h" | 13 #include "base/basictypes.h" |
| 12 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
| 14 #include "base/threading/thread.h" | 16 #include "base/threading/thread.h" |
| 15 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 17 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 18 #include "gpu/command_buffer/service/gpu_timing.h" |
| 16 #include "gpu/gpu_export.h" | 19 #include "gpu/gpu_export.h" |
| 17 #include "ui/gl/gl_bindings.h" | 20 #include "ui/gl/gl_bindings.h" |
| 18 | 21 |
| 19 namespace gpu { | 22 namespace gpu { |
| 20 namespace gles2 { | 23 namespace gles2 { |
| 21 | 24 |
| 22 class Outputter; | 25 class Outputter; |
| 23 class GPUTrace; | 26 class GPUTrace; |
| 24 | 27 |
| 25 // Id used to keep trace namespaces separate | 28 // Id used to keep trace namespaces separate |
| 26 enum GpuTracerSource { | 29 enum GpuTracerSource { |
| 27 kTraceGroupInvalid = -1, | 30 kTraceGroupInvalid = -1, |
| 28 | 31 |
| 29 kTraceGroupMarker = 0, | 32 kTraceGroupMarker = 0, |
| 30 kTraceCHROMIUM = 1, | 33 kTraceCHROMIUM = 1, |
| 31 kTraceDecoder = 2, | 34 kTraceDecoder = 2, |
| 32 | 35 |
| 33 NUM_TRACER_SOURCES | 36 NUM_TRACER_SOURCES |
| 34 }; | 37 }; |
| 35 | 38 |
| 36 enum GpuTracerType { | |
| 37 kTracerTypeInvalid = -1, | |
| 38 | |
| 39 kTracerTypeARBTimer, | |
| 40 kTracerTypeDisjointTimer | |
| 41 }; | |
| 42 | |
| 43 // Central accesser to CPU Time | |
| 44 class GPU_EXPORT CPUTime | |
| 45 : public base::RefCounted<CPUTime> { | |
| 46 public: | |
| 47 CPUTime(); | |
| 48 | |
| 49 virtual int64 GetCurrentTime(); | |
| 50 | |
| 51 protected: | |
| 52 virtual ~CPUTime(); | |
| 53 friend class base::RefCounted<CPUTime>; | |
| 54 | |
| 55 DISALLOW_COPY_AND_ASSIGN(CPUTime); | |
| 56 }; | |
| 57 | |
| 58 // Marker structure for a Trace. | 39 // Marker structure for a Trace. |
| 59 struct TraceMarker { | 40 struct TraceMarker { |
| 60 TraceMarker(const std::string& category, const std::string& name); | 41 TraceMarker(const std::string& category, const std::string& name); |
| 61 ~TraceMarker(); | 42 ~TraceMarker(); |
| 62 | 43 |
| 63 std::string category_; | 44 std::string category_; |
| 64 std::string name_; | 45 std::string name_; |
| 65 scoped_refptr<GPUTrace> trace_; | 46 scoped_refptr<GPUTrace> trace_; |
| 66 }; | 47 }; |
| 67 | 48 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 87 | 68 |
| 88 virtual bool IsTracing(); | 69 virtual bool IsTracing(); |
| 89 | 70 |
| 90 // Retrieve the name of the current open trace. | 71 // Retrieve the name of the current open trace. |
| 91 // Returns empty string if no current open trace. | 72 // Returns empty string if no current open trace. |
| 92 const std::string& CurrentCategory(GpuTracerSource source) const; | 73 const std::string& CurrentCategory(GpuTracerSource source) const; |
| 93 const std::string& CurrentName(GpuTracerSource source) const; | 74 const std::string& CurrentName(GpuTracerSource source) const; |
| 94 | 75 |
| 95 protected: | 76 protected: |
| 96 // Trace Processing. | 77 // Trace Processing. |
| 97 scoped_refptr<GPUTrace> CreateTrace(const std::string& category, | |
| 98 const std::string& name); | |
| 99 virtual scoped_refptr<Outputter> CreateOutputter(const std::string& name); | 78 virtual scoped_refptr<Outputter> CreateOutputter(const std::string& name); |
| 100 virtual scoped_refptr<CPUTime> CreateCPUTime(); | |
| 101 virtual GpuTracerType DetermineTracerType(); | |
| 102 virtual void PostTask(); | 79 virtual void PostTask(); |
| 103 | 80 |
| 104 void Process(); | 81 void Process(); |
| 105 void ProcessTraces(); | 82 void ProcessTraces(); |
| 106 | 83 |
| 107 void CalculateTimerOffset(); | |
| 108 void IssueProcessTask(); | 84 void IssueProcessTask(); |
| 109 | 85 |
| 110 scoped_refptr<Outputter> outputter_; | 86 scoped_refptr<Outputter> outputter_; |
| 111 scoped_refptr<CPUTime> cpu_time_; | |
| 112 std::vector<TraceMarker> markers_[NUM_TRACER_SOURCES]; | 87 std::vector<TraceMarker> markers_[NUM_TRACER_SOURCES]; |
| 113 std::deque<scoped_refptr<GPUTrace> > traces_; | 88 std::deque<scoped_refptr<GPUTrace> > traces_; |
| 114 | 89 |
| 115 const unsigned char* gpu_trace_srv_category; | 90 const unsigned char* gpu_trace_srv_category; |
| 116 const unsigned char* gpu_trace_dev_category; | 91 const unsigned char* gpu_trace_dev_category; |
| 117 gles2::GLES2Decoder* decoder_; | 92 gles2::GLES2Decoder* decoder_; |
| 93 gpu::GPUTiming gpu_timing_; |
| 118 | 94 |
| 119 int64 timer_offset_; | |
| 120 | |
| 121 GpuTracerType tracer_type_; | |
| 122 bool gpu_timing_synced_; | |
| 123 bool gpu_executing_; | 95 bool gpu_executing_; |
| 124 bool process_posted_; | 96 bool process_posted_; |
| 125 | 97 |
| 98 private: |
| 126 DISALLOW_COPY_AND_ASSIGN(GPUTracer); | 99 DISALLOW_COPY_AND_ASSIGN(GPUTracer); |
| 127 }; | 100 }; |
| 128 | 101 |
| 129 class Outputter : public base::RefCounted<Outputter> { | 102 class Outputter : public base::RefCounted<Outputter> { |
| 130 public: | 103 public: |
| 131 virtual void TraceDevice(const std::string& category, | 104 virtual void TraceDevice(const std::string& category, |
| 132 const std::string& name, | 105 const std::string& name, |
| 133 int64 start_time, | 106 int64 start_time, |
| 134 int64 end_time) = 0; | 107 int64 end_time) = 0; |
| 135 | 108 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 159 const std::string& name) override; | 132 const std::string& name) override; |
| 160 | 133 |
| 161 protected: | 134 protected: |
| 162 friend class base::RefCounted<Outputter>; | 135 friend class base::RefCounted<Outputter>; |
| 163 explicit TraceOutputter(const std::string& name); | 136 explicit TraceOutputter(const std::string& name); |
| 164 ~TraceOutputter() override; | 137 ~TraceOutputter() override; |
| 165 | 138 |
| 166 base::Thread named_thread_; | 139 base::Thread named_thread_; |
| 167 uint64 local_trace_id_; | 140 uint64 local_trace_id_; |
| 168 | 141 |
| 142 private: |
| 169 DISALLOW_COPY_AND_ASSIGN(TraceOutputter); | 143 DISALLOW_COPY_AND_ASSIGN(TraceOutputter); |
| 170 }; | 144 }; |
| 171 | 145 |
| 172 class GPU_EXPORT GPUTrace | 146 class GPU_EXPORT GPUTrace |
| 173 : public base::RefCounted<GPUTrace> { | 147 : public base::RefCounted<GPUTrace> { |
| 174 public: | 148 public: |
| 175 GPUTrace(scoped_refptr<Outputter> outputter, | 149 GPUTrace(scoped_refptr<Outputter> outputter, |
| 176 scoped_refptr<CPUTime> cpu_time, | 150 gpu::GPUTiming* gpu_timing, |
| 177 const std::string& category, | 151 const std::string& category, |
| 178 const std::string& name, | 152 const std::string& name, |
| 179 int64 offset, | 153 const bool enabled); |
| 180 GpuTracerType tracer_type); | |
| 181 | |
| 182 bool IsEnabled() { return tracer_type_ != kTracerTypeInvalid; } | |
| 183 | 154 |
| 184 void Start(bool trace_service); | 155 void Start(bool trace_service); |
| 185 void End(bool tracing_service); | 156 void End(bool tracing_service); |
| 186 bool IsAvailable(); | 157 bool IsAvailable(); |
| 158 bool IsEnabled() { return enabled_; } |
| 187 void Process(); | 159 void Process(); |
| 188 | 160 |
| 189 private: | 161 private: |
| 190 ~GPUTrace(); | 162 ~GPUTrace(); |
| 191 | 163 |
| 192 void Output(); | 164 void Output(); |
| 193 | 165 |
| 194 friend class base::RefCounted<GPUTrace>; | 166 friend class base::RefCounted<GPUTrace>; |
| 195 | 167 |
| 196 std::string category_; | 168 std::string category_; |
| 197 std::string name_; | 169 std::string name_; |
| 198 scoped_refptr<Outputter> outputter_; | 170 scoped_refptr<Outputter> outputter_; |
| 199 scoped_refptr<CPUTime> cpu_time_; | 171 scoped_ptr<gpu::GPUTimer> gpu_timer_; |
| 200 | 172 const bool enabled_ = false; |
| 201 int64 offset_; | |
| 202 int64 start_time_; | |
| 203 int64 end_time_; | |
| 204 GpuTracerType tracer_type_; | |
| 205 bool end_requested_; | |
| 206 | |
| 207 GLuint queries_[2]; | |
| 208 | 173 |
| 209 DISALLOW_COPY_AND_ASSIGN(GPUTrace); | 174 DISALLOW_COPY_AND_ASSIGN(GPUTrace); |
| 210 }; | 175 }; |
| 211 | 176 |
| 212 class ScopedGPUTrace { | 177 class ScopedGPUTrace { |
| 213 public: | 178 public: |
| 214 ScopedGPUTrace(GPUTracer* gpu_tracer, GpuTracerSource source, | 179 ScopedGPUTrace(GPUTracer* gpu_tracer, |
| 215 const std::string& category, const std::string& name) | 180 GpuTracerSource source, |
| 216 : gpu_tracer_(gpu_tracer), | 181 const std::string& category, |
| 217 source_(source) { | 182 const std::string& name) |
| 218 gpu_tracer_->Begin(category, name, source_); | 183 : gpu_tracer_(gpu_tracer), source_(source) { |
| 219 } | 184 gpu_tracer_->Begin(category, name, source_); |
| 185 } |
| 220 | 186 |
| 221 ~ScopedGPUTrace() { | 187 ~ScopedGPUTrace() { gpu_tracer_->End(source_); } |
| 222 gpu_tracer_->End(source_); | |
| 223 } | |
| 224 | 188 |
| 225 private: | 189 private: |
| 226 GPUTracer* gpu_tracer_; | 190 GPUTracer* gpu_tracer_; |
| 227 GpuTracerSource source_; | 191 GpuTracerSource source_; |
| 228 }; | 192 }; |
| 229 | 193 |
| 230 } // namespace gles2 | 194 } // namespace gles2 |
| 231 } // namespace gpu | 195 } // namespace gpu |
| 232 | 196 |
| 233 #endif // GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_ | 197 #endif // GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_ |
| OLD | NEW |