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
3 // found in the LICENSE file.
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_
13 #include "base/basictypes.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/threading/thread.h"
17 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
18 #include "gpu/gpu_export.h"
21 class GPUTimingClient
;
31 // Id used to keep trace namespaces separate
32 enum GpuTracerSource
{
33 kTraceGroupInvalid
= -1,
35 kTraceGroupMarker
= 0,
42 // Marker structure for a Trace.
44 TraceMarker(const std::string
& category
, const std::string
& name
);
47 std::string category_
;
49 scoped_refptr
<GPUTrace
> trace_
;
52 // Traces GPU Commands.
53 class GPU_EXPORT GPUTracer
54 : public base::SupportsWeakPtr
<GPUTracer
> {
56 explicit GPUTracer(gles2::GLES2Decoder
* decoder
);
59 void Destroy(bool have_context
);
61 // Scheduled processing in decoder begins.
64 // Scheduled processing in decoder ends.
67 // Begin a trace marker.
68 bool Begin(const std::string
& category
, const std::string
& name
,
69 GpuTracerSource source
);
71 // End the last started trace marker.
72 bool End(GpuTracerSource source
);
74 virtual bool IsTracing();
76 // Retrieve the name of the current open trace.
77 // Returns empty string if no current open trace.
78 const std::string
& CurrentCategory(GpuTracerSource source
) const;
79 const std::string
& CurrentName(GpuTracerSource source
) const;
83 virtual scoped_refptr
<Outputter
> CreateOutputter(const std::string
& name
);
84 virtual void PostTask();
88 void ClearFinishedTraces(bool have_context
);
90 void IssueProcessTask();
92 scoped_refptr
<gfx::GPUTimingClient
> gpu_timing_client_
;
93 scoped_refptr
<Outputter
> outputter_
;
94 std::vector
<TraceMarker
> markers_
[NUM_TRACER_SOURCES
];
95 std::deque
<scoped_refptr
<GPUTrace
> > finished_traces_
;
97 const unsigned char* gpu_trace_srv_category
;
98 const unsigned char* gpu_trace_dev_category
;
99 gles2::GLES2Decoder
* decoder_
;
102 bool process_posted_
;
105 DISALLOW_COPY_AND_ASSIGN(GPUTracer
);
108 class Outputter
: public base::RefCounted
<Outputter
> {
110 virtual void TraceDevice(const std::string
& category
,
111 const std::string
& name
,
115 virtual void TraceServiceBegin(const std::string
& category
,
116 const std::string
& name
) = 0;
118 virtual void TraceServiceEnd(const std::string
& category
,
119 const std::string
& name
) = 0;
122 virtual ~Outputter() {}
123 friend class base::RefCounted
<Outputter
>;
126 class TraceOutputter
: public Outputter
{
128 static scoped_refptr
<TraceOutputter
> Create(const std::string
& name
);
129 void TraceDevice(const std::string
& category
,
130 const std::string
& name
,
132 int64 end_time
) override
;
134 void TraceServiceBegin(const std::string
& category
,
135 const std::string
& name
) override
;
137 void TraceServiceEnd(const std::string
& category
,
138 const std::string
& name
) override
;
141 friend class base::RefCounted
<Outputter
>;
142 explicit TraceOutputter(const std::string
& name
);
143 ~TraceOutputter() override
;
145 base::Thread named_thread_
;
146 uint64 local_trace_id_
;
149 DISALLOW_COPY_AND_ASSIGN(TraceOutputter
);
152 class GPU_EXPORT GPUTrace
153 : public base::RefCounted
<GPUTrace
> {
155 GPUTrace(scoped_refptr
<Outputter
> outputter
,
156 gfx::GPUTimingClient
* gpu_timing_client
,
157 const std::string
& category
,
158 const std::string
& name
,
161 void Destroy(bool have_context
);
163 void Start(bool trace_service
);
164 void End(bool tracing_service
);
166 bool IsEnabled() { return enabled_
; }
174 friend class base::RefCounted
<GPUTrace
>;
176 std::string category_
;
178 scoped_refptr
<Outputter
> outputter_
;
179 scoped_ptr
<gfx::GPUTimer
> gpu_timer_
;
180 const bool enabled_
= false;
182 DISALLOW_COPY_AND_ASSIGN(GPUTrace
);
185 class ScopedGPUTrace
{
187 ScopedGPUTrace(GPUTracer
* gpu_tracer
,
188 GpuTracerSource source
,
189 const std::string
& category
,
190 const std::string
& name
)
191 : gpu_tracer_(gpu_tracer
), source_(source
) {
192 gpu_tracer_
->Begin(category
, name
, source_
);
195 ~ScopedGPUTrace() { gpu_tracer_
->End(source_
); }
198 GPUTracer
* gpu_tracer_
;
199 GpuTracerSource source_
;
205 #endif // GPU_COMMAND_BUFFER_SERVICE_GPU_TRACER_H_