blob: cb3f8902cac9720122b79dc9532870c02ec9056d [file] [log] [blame]
dsinclair@chromium.orgfb97b662013-02-20 23:02:141// 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
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
dcastagna82922f82015-02-12 19:21:309#include <deque>
dyen151b6d692015-05-11 16:30:2110#include <stack>
dsinclair@chromium.orgfb97b662013-02-20 23:02:1411#include <string>
dcastagna82922f82015-02-12 19:21:3012#include <vector>
dsinclair@chromium.orgfb97b662013-02-20 23:02:1413
14#include "base/basictypes.h"
15#include "base/memory/scoped_ptr.h"
vmiura@chromium.orgf71dc362014-01-08 21:50:5016#include "base/memory/weak_ptr.h"
17#include "base/threading/thread.h"
vmiura@chromium.orgbccc0f32014-01-10 03:18:0818#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
vmiura@chromium.orgf71dc362014-01-08 21:50:5019#include "gpu/gpu_export.h"
dsinclair@chromium.orgfb97b662013-02-20 23:02:1420
dyen5b1c02ff2015-02-26 01:54:0021namespace gfx {
22 class GPUTimingClient;
23 class GPUTimer;
24}
25
dsinclair@chromium.orgfb97b662013-02-20 23:02:1426namespace gpu {
27namespace gles2 {
28
dyen@chromium.orgb4af07d2014-08-20 00:11:5729class Outputter;
30class GPUTrace;
31
vmiura@chromium.orgcac16542014-01-15 17:53:5132// Id used to keep trace namespaces separate
33enum GpuTracerSource {
dyen@chromium.orgb4af07d2014-08-20 00:11:5734 kTraceGroupInvalid = -1,
35
dyen53749b42015-06-12 20:53:1136 kTraceCHROMIUM,
37 kTraceDecoder,
38 kTraceDisjoint, // Used internally.
dyen@chromium.orgb4af07d2014-08-20 00:11:5739
40 NUM_TRACER_SOURCES
41};
42
43// Marker structure for a Trace.
44struct TraceMarker {
dyencb86f2f2014-12-09 18:35:4145 TraceMarker(const std::string& category, const std::string& name);
dyen@chromium.orgb4af07d2014-08-20 00:11:5746 ~TraceMarker();
47
dyencb86f2f2014-12-09 18:35:4148 std::string category_;
dyen@chromium.orgb4af07d2014-08-20 00:11:5749 std::string name_;
50 scoped_refptr<GPUTrace> trace_;
vmiura@chromium.orgcac16542014-01-15 17:53:5151};
52
dsinclair@chromium.orgfb97b662013-02-20 23:02:1453// Traces GPU Commands.
dyen75755fa2015-01-07 22:55:0754class GPU_EXPORT GPUTracer
55 : public base::SupportsWeakPtr<GPUTracer> {
dsinclair@chromium.orgfb97b662013-02-20 23:02:1456 public:
dyen@chromium.orgb4af07d2014-08-20 00:11:5757 explicit GPUTracer(gles2::GLES2Decoder* decoder);
dyen75755fa2015-01-07 22:55:0758 virtual ~GPUTracer();
dsinclair@chromium.orgfb97b662013-02-20 23:02:1459
dyendbfb90d2015-03-26 02:41:4660 void Destroy(bool have_context);
61
vmiura@chromium.orgcac16542014-01-15 17:53:5162 // Scheduled processing in decoder begins.
dyen@chromium.orgb4af07d2014-08-20 00:11:5763 bool BeginDecoding();
dsinclair@chromium.orgfb97b662013-02-20 23:02:1464
vmiura@chromium.orgcac16542014-01-15 17:53:5165 // Scheduled processing in decoder ends.
dyen@chromium.orgb4af07d2014-08-20 00:11:5766 bool EndDecoding();
vmiura@chromium.orgcac16542014-01-15 17:53:5167
68 // Begin a trace marker.
dyencb86f2f2014-12-09 18:35:4169 bool Begin(const std::string& category, const std::string& name,
70 GpuTracerSource source);
vmiura@chromium.orgcac16542014-01-15 17:53:5171
72 // End the last started trace marker.
dyen@chromium.orgb4af07d2014-08-20 00:11:5773 bool End(GpuTracerSource source);
vmiura@chromium.orgcac16542014-01-15 17:53:5174
dyened04ca3e2015-08-26 21:05:0175 bool HasTracesToProcess();
76 void ProcessTraces();
77
dyen75755fa2015-01-07 22:55:0778 virtual bool IsTracing();
dsinclair@chromium.orgfb97b662013-02-20 23:02:1479
80 // Retrieve the name of the current open trace.
81 // Returns empty string if no current open trace.
dyen4bb43282015-01-08 01:09:5682 const std::string& CurrentCategory(GpuTracerSource source) const;
83 const std::string& CurrentName(GpuTracerSource source) const;
dsinclair@chromium.orgfb97b662013-02-20 23:02:1484
dyen75755fa2015-01-07 22:55:0785 protected:
dyen@chromium.orgb4af07d2014-08-20 00:11:5786 // Trace Processing.
dyen75755fa2015-01-07 22:55:0787 virtual scoped_refptr<Outputter> CreateOutputter(const std::string& name);
dyen75755fa2015-01-07 22:55:0788
dyen53749b42015-06-12 20:53:1189 bool CheckDisjointStatus();
90 void ClearOngoingTraces(bool have_context);
dyen@chromium.orgb4af07d2014-08-20 00:11:5791
dyen5b1c02ff2015-02-26 01:54:0092 scoped_refptr<gfx::GPUTimingClient> gpu_timing_client_;
dyen@chromium.orgb4af07d2014-08-20 00:11:5793 scoped_refptr<Outputter> outputter_;
94 std::vector<TraceMarker> markers_[NUM_TRACER_SOURCES];
dyendbfb90d2015-03-26 02:41:4695 std::deque<scoped_refptr<GPUTrace> > finished_traces_;
dyen@chromium.orgb4af07d2014-08-20 00:11:5796
97 const unsigned char* gpu_trace_srv_category;
98 const unsigned char* gpu_trace_dev_category;
99 gles2::GLES2Decoder* decoder_;
dyen53749b42015-06-12 20:53:11100 int64 disjoint_time_ = 0;
dyen@chromium.orgb4af07d2014-08-20 00:11:57101
dyen53749b42015-06-12 20:53:11102 bool gpu_executing_ = false;
dyena56208c2015-06-25 01:43:40103 bool began_device_traces_ = false;
dyen@chromium.orgb4af07d2014-08-20 00:11:57104
dcastagna82922f82015-02-12 19:21:30105 private:
dsinclair@chromium.orgfb97b662013-02-20 23:02:14106 DISALLOW_COPY_AND_ASSIGN(GPUTracer);
107};
108
vmiura@chromium.orgf71dc362014-01-08 21:50:50109class Outputter : public base::RefCounted<Outputter> {
110 public:
dyen06ae0b22015-05-07 03:45:52111 virtual void TraceDevice(GpuTracerSource source,
112 const std::string& category,
dyen75755fa2015-01-07 22:55:07113 const std::string& name,
114 int64 start_time,
115 int64 end_time) = 0;
116
dyen06ae0b22015-05-07 03:45:52117 virtual void TraceServiceBegin(GpuTracerSource source,
118 const std::string& category,
dyen81aaafd2015-01-16 21:51:11119 const std::string& name) = 0;
dyen75755fa2015-01-07 22:55:07120
dyen06ae0b22015-05-07 03:45:52121 virtual void TraceServiceEnd(GpuTracerSource source,
122 const std::string& category,
dyen81aaafd2015-01-16 21:51:11123 const std::string& name) = 0;
vmiura@chromium.orgf71dc362014-01-08 21:50:50124
125 protected:
126 virtual ~Outputter() {}
127 friend class base::RefCounted<Outputter>;
128};
129
130class TraceOutputter : public Outputter {
131 public:
132 static scoped_refptr<TraceOutputter> Create(const std::string& name);
dyen06ae0b22015-05-07 03:45:52133 void TraceDevice(GpuTracerSource source,
134 const std::string& category,
dyen75755fa2015-01-07 22:55:07135 const std::string& name,
136 int64 start_time,
137 int64 end_time) override;
138
dyen06ae0b22015-05-07 03:45:52139 void TraceServiceBegin(GpuTracerSource source,
140 const std::string& category,
dyen81aaafd2015-01-16 21:51:11141 const std::string& name) override;
dyen75755fa2015-01-07 22:55:07142
dyen06ae0b22015-05-07 03:45:52143 void TraceServiceEnd(GpuTracerSource source,
144 const std::string& category,
dyen81aaafd2015-01-16 21:51:11145 const std::string& name) override;
vmiura@chromium.orgf71dc362014-01-08 21:50:50146
147 protected:
148 friend class base::RefCounted<Outputter>;
149 explicit TraceOutputter(const std::string& name);
dcheng1f4d1d72014-10-21 16:21:58150 ~TraceOutputter() override;
vmiura@chromium.orgf71dc362014-01-08 21:50:50151
152 base::Thread named_thread_;
dyen151b6d692015-05-11 16:30:21153 uint64 local_trace_device_id_ = 0;
154 uint64 local_trace_service_id_ = 0;
155
156 std::stack<uint64> trace_service_id_stack_[NUM_TRACER_SOURCES];
vmiura@chromium.orgf71dc362014-01-08 21:50:50157
dcastagna82922f82015-02-12 19:21:30158 private:
vmiura@chromium.orgf71dc362014-01-08 21:50:50159 DISALLOW_COPY_AND_ASSIGN(TraceOutputter);
160};
161
dyen@chromium.orgfde50c72014-07-29 23:26:32162class GPU_EXPORT GPUTrace
163 : public base::RefCounted<GPUTrace> {
vmiura@chromium.orgf71dc362014-01-08 21:50:50164 public:
dyen@chromium.orgfde50c72014-07-29 23:26:32165 GPUTrace(scoped_refptr<Outputter> outputter,
dyen5b1c02ff2015-02-26 01:54:00166 gfx::GPUTimingClient* gpu_timing_client,
dyen06ae0b22015-05-07 03:45:52167 const GpuTracerSource source,
dyencb86f2f2014-12-09 18:35:41168 const std::string& category,
dyen@chromium.orgfde50c72014-07-29 23:26:32169 const std::string& name,
dyen052dacb2015-04-11 01:09:04170 const bool tracing_service,
171 const bool tracing_device);
dyencb86f2f2014-12-09 18:35:41172
dyendbfb90d2015-03-26 02:41:46173 void Destroy(bool have_context);
174
dyen052dacb2015-04-11 01:09:04175 void Start();
176 void End();
dyen@chromium.orgfde50c72014-07-29 23:26:32177 bool IsAvailable();
dyen052dacb2015-04-11 01:09:04178 bool IsServiceTraceEnabled() const { return service_enabled_; }
179 bool IsDeviceTraceEnabled() const { return device_enabled_; }
dyen@chromium.orgfde50c72014-07-29 23:26:32180 void Process();
vmiura@chromium.orgf71dc362014-01-08 21:50:50181
182 private:
dyen@chromium.orgfde50c72014-07-29 23:26:32183 ~GPUTrace();
vmiura@chromium.orgf71dc362014-01-08 21:50:50184
185 void Output();
186
dyen@chromium.orgfde50c72014-07-29 23:26:32187 friend class base::RefCounted<GPUTrace>;
188
dyen06ae0b22015-05-07 03:45:52189 const GpuTracerSource source_ = kTraceGroupInvalid;
190 const std::string category_;
191 const std::string name_;
vmiura@chromium.orgf71dc362014-01-08 21:50:50192 scoped_refptr<Outputter> outputter_;
dyen5b1c02ff2015-02-26 01:54:00193 scoped_ptr<gfx::GPUTimer> gpu_timer_;
dyen052dacb2015-04-11 01:09:04194 const bool service_enabled_ = false;
195 const bool device_enabled_ = false;
vmiura@chromium.orgf71dc362014-01-08 21:50:50196
dyen@chromium.orgfde50c72014-07-29 23:26:32197 DISALLOW_COPY_AND_ASSIGN(GPUTrace);
vmiura@chromium.orgf71dc362014-01-08 21:50:50198};
199
dyenb547eff62015-01-17 00:14:56200class ScopedGPUTrace {
dcastagna82922f82015-02-12 19:21:30201 public:
202 ScopedGPUTrace(GPUTracer* gpu_tracer,
203 GpuTracerSource source,
204 const std::string& category,
205 const std::string& name)
206 : gpu_tracer_(gpu_tracer), source_(source) {
207 gpu_tracer_->Begin(category, name, source_);
208 }
dyenb547eff62015-01-17 00:14:56209
dcastagna82922f82015-02-12 19:21:30210 ~ScopedGPUTrace() { gpu_tracer_->End(source_); }
dyenb547eff62015-01-17 00:14:56211
dcastagna82922f82015-02-12 19:21:30212 private:
213 GPUTracer* gpu_tracer_;
214 GpuTracerSource source_;
dyenb547eff62015-01-17 00:14:56215};
216
dsinclair@chromium.orgfb97b662013-02-20 23:02:14217} // namespace gles2
218} // namespace gpu
219
220#endif // GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_