Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Unified Diff: gpu/command_buffer/service/gpu_tracer.cc

Issue 839143002: Roll Chrome into Mojo. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/gpu_tracer.h ('k') | gpu/command_buffer/service/gpu_tracer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 d7cd1b8b747957e2599c60b95eb418f39fb8f6d6..2853e96ccf651dd2954582ac6ef3839e2dff9c83 100644
--- a/gpu/command_buffer/service/gpu_tracer.cc
+++ b/gpu/command_buffer/service/gpu_tracer.cc
@@ -18,6 +18,16 @@ namespace gles2 {
static const unsigned int kProcessInterval = 16;
static TraceOutputter* g_outputter_thread = NULL;
+CPUTime::CPUTime() {
+}
+
+int64 CPUTime::GetCurrentTime() {
+ return base::TimeTicks::NowFromSystemTraceTime().ToInternalValue();
+}
+
+CPUTime::~CPUTime() {
+}
+
TraceMarker::TraceMarker(const std::string& category, const std::string& name)
: category_(category),
name_(name),
@@ -42,24 +52,47 @@ TraceOutputter::TraceOutputter(const std::string& name)
TraceOutputter::~TraceOutputter() { g_outputter_thread = NULL; }
-void TraceOutputter::Trace(const std::string& category,
- const std::string& name,
- int64 start_time,
- int64 end_time) {
- TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(category.c_str(),
- name.c_str(),
- local_trace_id_,
- named_thread_.thread_id(),
- start_time);
- TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0(category.c_str(),
- name.c_str(),
- local_trace_id_,
- named_thread_.thread_id(),
- end_time);
+void TraceOutputter::TraceDevice(const std::string& category,
+ const std::string& name,
+ int64 start_time,
+ int64 end_time) {
+ TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP1(
+ TRACE_DISABLED_BY_DEFAULT("gpu.device"),
+ name.c_str(),
+ local_trace_id_,
+ named_thread_.thread_id(),
+ start_time,
+ "gl_category",
+ category.c_str());
+ TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP1(
+ TRACE_DISABLED_BY_DEFAULT("gpu.device"),
+ name.c_str(),
+ local_trace_id_,
+ named_thread_.thread_id(),
+ end_time,
+ "gl_category",
+ category.c_str());
++local_trace_id_;
}
+void TraceOutputter::TraceServiceBegin(const std::string& category,
+ const std::string& name,
+ void* id) {
+ TRACE_EVENT_COPY_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("gpu.service"),
+ name.c_str(), this,
+ "gl_category", category.c_str());
+}
+
+void TraceOutputter::TraceServiceEnd(const std::string& category,
+ const std::string& name,
+ void* id) {
+ TRACE_EVENT_COPY_ASYNC_END1(TRACE_DISABLED_BY_DEFAULT("gpu.service"),
+ name.c_str(), this,
+ "gl_category", category.c_str());
+}
+
GPUTrace::GPUTrace(scoped_refptr<Outputter> outputter,
+ scoped_refptr<CPUTime> cpu_time,
const std::string& category,
const std::string& name,
int64 offset,
@@ -67,6 +100,7 @@ GPUTrace::GPUTrace(scoped_refptr<Outputter> outputter,
: category_(category),
name_(name),
outputter_(outputter),
+ cpu_time_(cpu_time),
offset_(offset),
start_time_(0),
end_time_(0),
@@ -98,7 +132,7 @@ GPUTrace::~GPUTrace() {
void GPUTrace::Start(bool trace_service) {
if (trace_service) {
- TRACE_EVENT_COPY_ASYNC_BEGIN0(category().c_str(), name().c_str(), this);
+ outputter_->TraceServiceBegin(category_, name_, this);
}
switch (tracer_type_) {
@@ -115,7 +149,7 @@ void GPUTrace::Start(bool trace_service) {
if (offset_ == 0) {
GLint64 gl_now = 0;
glGetInteger64v(GL_TIMESTAMP, &gl_now);
- offset_ = base::TimeTicks::NowFromSystemTraceTime().ToInternalValue() -
+ offset_ = cpu_time_->GetCurrentTime() -
gl_now / base::Time::kNanosecondsPerMicrosecond;
}
// Intentionally fall through to kTracerTypeARBTimer case.xs
@@ -140,7 +174,7 @@ void GPUTrace::End(bool tracing_service) {
}
if (tracing_service) {
- TRACE_EVENT_COPY_ASYNC_END0(category().c_str(), name().c_str(), this);
+ outputter_->TraceServiceEnd(category_, name_, this);
}
}
@@ -175,7 +209,7 @@ void GPUTrace::Process() {
start_time_ = (begin_stamp / base::Time::kNanosecondsPerMicrosecond) +
offset_;
end_time_ = (end_stamp / base::Time::kNanosecondsPerMicrosecond) + offset_;
- outputter_->Trace(category(), name(), start_time_, end_time_);
+ outputter_->TraceDevice(category_, name_, start_time_, end_time_);
}
GPUTracer::GPUTracer(gles2::GLES2Decoder* decoder)
@@ -185,18 +219,10 @@ GPUTracer::GPUTracer(gles2::GLES2Decoder* decoder)
TRACE_DISABLED_BY_DEFAULT("gpu.device"))),
decoder_(decoder),
timer_offset_(0),
- last_tracer_source_(kTraceGroupInvalid),
tracer_type_(kTracerTypeInvalid),
gpu_timing_synced_(false),
gpu_executing_(false),
process_posted_(false) {
- if (gfx::g_driver_gl.ext.b_GL_EXT_disjoint_timer_query) {
- tracer_type_ = kTracerTypeDisjointTimer;
- outputter_ = TraceOutputter::Create("GL_EXT_disjoint_timer_query");
- } else if (gfx::g_driver_gl.ext.b_GL_ARB_timer_query) {
- tracer_type_ = kTracerTypeARBTimer;
- outputter_ = TraceOutputter::Create("GL_ARB_timer_query");
- }
}
GPUTracer::~GPUTracer() {
@@ -206,6 +232,28 @@ bool GPUTracer::BeginDecoding() {
if (gpu_executing_)
return false;
+ if (outputter_ == NULL) {
+ tracer_type_ = DetermineTracerType();
+ const char* tracer_type_name = "Unknown";
+ switch (tracer_type_) {
+ case kTracerTypeDisjointTimer:
+ tracer_type_name = "GL_EXT_disjoint_timer_query";
+ break;
+ case kTracerTypeARBTimer:
+ tracer_type_name = "GL_ARB_timer_query";
+ break;
+
+ default:
+ break;
+ }
+
+ outputter_ = CreateOutputter(tracer_type_name);
+ }
+
+ if (cpu_time_ == NULL) {
+ cpu_time_ = CreateCPUTime();
+ }
+
CalculateTimerOffset();
gpu_executing_ = true;
@@ -237,10 +285,12 @@ bool GPUTracer::EndDecoding() {
if (IsTracing()) {
for (int n = 0; n < NUM_TRACER_SOURCES; n++) {
for (size_t i = 0; i < markers_[n].size(); i++) {
- if (markers_[n][i].trace_.get()) {
- markers_[n][i].trace_->End(*gpu_trace_srv_category != 0);
- if (markers_[n][i].trace_->IsEnabled())
- traces_.push_back(markers_[n][i].trace_);
+ TraceMarker& marker = markers_[n][i];
+ if (marker.trace_.get()) {
+ marker.trace_->End(*gpu_trace_srv_category != 0);
+ if (marker.trace_->IsEnabled())
+ traces_.push_back(marker.trace_);
+
markers_[n][i].trace_ = 0;
}
}
@@ -263,7 +313,6 @@ bool GPUTracer::Begin(const std::string& category, const std::string& name,
DCHECK(source >= 0 && source < NUM_TRACER_SOURCES);
// Push new marker from given 'source'
- last_tracer_source_ = source;
markers_[source].push_back(TraceMarker(category, name));
// Create trace
@@ -304,20 +353,20 @@ bool GPUTracer::IsTracing() {
return (*gpu_trace_srv_category != 0) || (*gpu_trace_dev_category != 0);
}
-const std::string& GPUTracer::CurrentCategory() const {
- if (last_tracer_source_ >= 0 &&
- last_tracer_source_ < NUM_TRACER_SOURCES &&
- !markers_[last_tracer_source_].empty()) {
- return markers_[last_tracer_source_].back().category_;
+const std::string& GPUTracer::CurrentCategory(GpuTracerSource source) const {
+ if (source >= 0 &&
+ source < NUM_TRACER_SOURCES &&
+ !markers_[source].empty()) {
+ return markers_[source].back().category_;
}
return base::EmptyString();
}
-const std::string& GPUTracer::CurrentName() const {
- if (last_tracer_source_ >= 0 &&
- last_tracer_source_ < NUM_TRACER_SOURCES &&
- !markers_[last_tracer_source_].empty()) {
- return markers_[last_tracer_source_].back().name_;
+const std::string& GPUTracer::CurrentName(GpuTracerSource source) const {
+ if (source >= 0 &&
+ source < NUM_TRACER_SOURCES &&
+ !markers_[source].empty()) {
+ return markers_[source].back().name_;
}
return base::EmptyString();
}
@@ -327,7 +376,33 @@ scoped_refptr<GPUTrace> GPUTracer::CreateTrace(const std::string& category,
GpuTracerType tracer_type = *gpu_trace_dev_category ? tracer_type_ :
kTracerTypeInvalid;
- return new GPUTrace(outputter_, category, name, timer_offset_, tracer_type);
+ return new GPUTrace(outputter_, cpu_time_, category, name,
+ timer_offset_, tracer_type);
+}
+
+scoped_refptr<Outputter> GPUTracer::CreateOutputter(const std::string& name) {
+ return TraceOutputter::Create(name);
+}
+
+scoped_refptr<CPUTime> GPUTracer::CreateCPUTime() {
+ return new CPUTime();
+}
+
+GpuTracerType GPUTracer::DetermineTracerType() {
+ if (gfx::g_driver_gl.ext.b_GL_EXT_disjoint_timer_query) {
+ return kTracerTypeDisjointTimer;
+ } else if (gfx::g_driver_gl.ext.b_GL_ARB_timer_query) {
+ return kTracerTypeARBTimer;
+ }
+
+ return kTracerTypeInvalid;
+}
+
+void GPUTracer::PostTask() {
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&GPUTracer::Process, base::AsWeakPtr(this)),
+ base::TimeDelta::FromMilliseconds(kProcessInterval));
}
void GPUTracer::Process() {
@@ -401,10 +476,8 @@ void GPUTracer::CalculateTimerOffset() {
glGetQueryObjectui64v(query, GL_QUERY_RESULT, &gl_now);
glDeleteQueriesARB(1, &query);
- base::TimeTicks system_now = base::TimeTicks::NowFromSystemTraceTime();
-
gl_now /= base::Time::kNanosecondsPerMicrosecond;
- timer_offset_ = system_now.ToInternalValue() - gl_now;
+ timer_offset_ = cpu_time_->GetCurrentTime() - gl_now;
gpu_timing_synced_ = true;
}
}
@@ -414,10 +487,7 @@ void GPUTracer::IssueProcessTask() {
return;
process_posted_ = true;
- base::MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- base::Bind(&GPUTracer::Process, base::AsWeakPtr(this)),
- base::TimeDelta::FromMilliseconds(kProcessInterval));
+ PostTask();
}
} // namespace gles2
« no previous file with comments | « gpu/command_buffer/service/gpu_tracer.h ('k') | gpu/command_buffer/service/gpu_tracer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698