| Index: gpu/command_buffer/service/gpu_tracer.cc
|
| diff --git a/gpu/command_buffer/service/gpu_tracer.cc b/gpu/command_buffer/service/gpu_tracer.cc
|
| index 413dc68739f024fa0b44d68c104788beb6cec210..c9bb50938ba499ef99511929af1c4f92af7346d9 100644
|
| --- a/gpu/command_buffer/service/gpu_tracer.cc
|
| +++ b/gpu/command_buffer/service/gpu_tracer.cc
|
| @@ -8,103 +8,45 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/debug/trace_event.h"
|
| -#include "base/memory/weak_ptr.h"
|
| #include "base/strings/string_util.h"
|
| -#include "base/threading/thread.h"
|
| #include "base/time/time.h"
|
| -#include "ui/gl/gl_bindings.h"
|
|
|
| namespace gpu {
|
| namespace gles2 {
|
| -namespace {
|
| -
|
| -class Outputter;
|
|
|
| static const unsigned int kProcessInterval = 16;
|
| -static Outputter* g_outputter_thread = NULL;
|
| -
|
| -class Outputter
|
| - : private base::Thread,
|
| - public base::RefCounted<Outputter> {
|
| - public:
|
| - static scoped_refptr<Outputter> Create(const std::string& name) {
|
| - if (!g_outputter_thread) {
|
| - g_outputter_thread = new Outputter(name);
|
| - g_outputter_thread->Start();
|
| - g_outputter_thread->Stop();
|
| - }
|
| - return g_outputter_thread;
|
| - }
|
| -
|
| - uint64 Id() { return thread_id(); }
|
| -
|
| - private:
|
| - friend class base::RefCounted<Outputter>;
|
| -
|
| - explicit Outputter(const std::string& name) : base::Thread(name.c_str()) {}
|
| -
|
| - virtual ~Outputter() {
|
| - g_outputter_thread = NULL;
|
| - }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Outputter);
|
| -};
|
| -
|
| -class Trace : public base::RefCounted<Trace> {
|
| - public:
|
| - explicit Trace(const std::string& name) : name_(name) {}
|
| -
|
| - virtual void Start() = 0;
|
| - virtual void End() = 0;
|
| -
|
| - // True if the the results of this query are available.
|
| - virtual bool IsAvailable() = 0;
|
| -
|
| - virtual bool IsProcessable() { return true; }
|
| - virtual void Process() = 0;
|
| +static TraceOutputter* g_outputter_thread = NULL;
|
|
|
| - virtual const std::string& name() {
|
| - return name_;
|
| +scoped_refptr<TraceOutputter> TraceOutputter::Create(const std::string& name) {
|
| + if (!g_outputter_thread) {
|
| + g_outputter_thread = new TraceOutputter(name);
|
| }
|
| + return g_outputter_thread;
|
| +}
|
|
|
| - protected:
|
| - virtual ~Trace() {}
|
| -
|
| - private:
|
| - friend class base::RefCounted<Trace>;
|
| -
|
| - std::string name_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Trace);
|
| -};
|
| -
|
| -class GLARBTimerTrace : public Trace {
|
| - public:
|
| - GLARBTimerTrace(scoped_refptr<Outputter> outputter, const std::string& name,
|
| - int64 offset);
|
| -
|
| - // Implementation of Tracer
|
| - virtual void Start() OVERRIDE;
|
| - virtual void End() OVERRIDE;
|
| - virtual bool IsAvailable() OVERRIDE;
|
| - virtual void Process() OVERRIDE;
|
| -
|
| - private:
|
| - virtual ~GLARBTimerTrace();
|
| -
|
| - void Output();
|
| -
|
| - scoped_refptr<Outputter> outputter_;
|
| -
|
| - int64 offset_;
|
| - int64 start_time_;
|
| - int64 end_time_;
|
| - bool end_requested_;
|
| -
|
| - GLuint queries_[2];
|
| +TraceOutputter::TraceOutputter(const std::string& name)
|
| + : named_thread_(name.c_str()), local_trace_id_(0) {
|
| + named_thread_.Start();
|
| + named_thread_.Stop();
|
| +}
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(GLARBTimerTrace);
|
| -};
|
| +TraceOutputter::~TraceOutputter() { g_outputter_thread = NULL; }
|
| +
|
| +void TraceOutputter::Trace(const std::string& name,
|
| + int64 start_time,
|
| + int64 end_time) {
|
| + TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("gpu",
|
| + name.c_str(),
|
| + local_trace_id_,
|
| + named_thread_.thread_id(),
|
| + start_time);
|
| + TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0("gpu",
|
| + name.c_str(),
|
| + local_trace_id_,
|
| + named_thread_.thread_id(),
|
| + end_time);
|
| + ++local_trace_id_;
|
| +}
|
|
|
| class NoopTrace : public Trace {
|
| public:
|
| @@ -181,8 +123,13 @@ class GPUTracerARBTimerQuery : public GPUTracerImpl {
|
| DISALLOW_COPY_AND_ASSIGN(GPUTracerARBTimerQuery);
|
| };
|
|
|
| +bool Trace::IsProcessable() { return true; }
|
| +
|
| +const std::string& Trace::name() { return name_; }
|
| +
|
| GLARBTimerTrace::GLARBTimerTrace(scoped_refptr<Outputter> outputter,
|
| - const std::string& name, int64 offset)
|
| + const std::string& name,
|
| + int64 offset)
|
| : Trace(name),
|
| outputter_(outputter),
|
| offset_(offset),
|
| @@ -216,23 +163,19 @@ bool GLARBTimerTrace::IsAvailable() {
|
| void GLARBTimerTrace::Process() {
|
| DCHECK(IsAvailable());
|
|
|
| - GLint64 timestamp;
|
| + GLuint64 timestamp;
|
|
|
| // TODO(dsinclair): It's possible for the timer to wrap during the start/end.
|
| // We need to detect if the end is less then the start and correct for the
|
| // wrapping.
|
| - glGetQueryObjecti64v(queries_[0], GL_QUERY_RESULT, ×tamp);
|
| + glGetQueryObjectui64v(queries_[0], GL_QUERY_RESULT, ×tamp);
|
| start_time_ = (timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_;
|
|
|
| - glGetQueryObjecti64v(queries_[1], GL_QUERY_RESULT, ×tamp);
|
| + glGetQueryObjectui64v(queries_[1], GL_QUERY_RESULT, ×tamp);
|
| end_time_ = (timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_;
|
|
|
| glDeleteQueries(2, queries_);
|
| -
|
| - TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("gpu", name().c_str(),
|
| - this, outputter_->Id(), start_time_);
|
| - TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0("gpu", name().c_str(),
|
| - this, outputter_->Id(), end_time_);
|
| + outputter_->Trace(name(), start_time_, end_time_);
|
| }
|
|
|
| bool GPUTracerImpl::Begin(const std::string& name) {
|
| @@ -295,7 +238,7 @@ GPUTracerARBTimerQuery::GPUTracerARBTimerQuery()
|
| timer_offset_(0),
|
| last_offset_check_(0) {
|
| CalculateTimerOffset();
|
| - outputter_ = Outputter::Create("GL_ARB_timer_query");
|
| + outputter_ = TraceOutputter::Create("GL_ARB_timer_query");
|
| }
|
|
|
| GPUTracerARBTimerQuery::~GPUTracerARBTimerQuery() {
|
| @@ -335,11 +278,10 @@ void GPUTracerARBTimerQuery::CalculateTimerOffset() {
|
| last_offset_check_ = system_now.ToInternalValue();
|
| }
|
|
|
| -} // namespace
|
| -
|
| scoped_ptr<GPUTracer> GPUTracer::Create() {
|
| - if (gfx::g_driver_gl.ext.b_GL_ARB_timer_query)
|
| + if (gfx::g_driver_gl.ext.b_GL_ARB_timer_query) {
|
| return scoped_ptr<GPUTracer>(new GPUTracerARBTimerQuery());
|
| + }
|
| return scoped_ptr<GPUTracer>(new GPUTracerImpl());
|
| }
|
|
|
|
|