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

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

Issue 1018773002: Added Destroy() functions for GPUTimer and GPUTracer/GPUTrace. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Delete GPU Tracer after destroying it in decoder Created 5 years, 9 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 d00deb0a2ff8d747341b51446365bdbe43dcbfb7..a633959f385d11f9ff0ad72f543bc3bd5d2b8543 100644
--- a/gpu/command_buffer/service/gpu_tracer.cc
+++ b/gpu/command_buffer/service/gpu_tracer.cc
@@ -99,6 +99,12 @@ GPUTrace::GPUTrace(scoped_refptr<Outputter> outputter,
GPUTrace::~GPUTrace() {
}
+void GPUTrace::Destroy(bool have_context) {
+ if (gpu_timer_.get()) {
+ gpu_timer_->Destroy(have_context);
+ }
+}
+
void GPUTrace::Start(bool trace_service) {
if (trace_service) {
outputter_->TraceServiceBegin(category_, name_);
@@ -152,6 +158,20 @@ GPUTracer::GPUTracer(gles2::GLES2Decoder* decoder)
GPUTracer::~GPUTracer() {
}
+void GPUTracer::Destroy(bool have_context) {
+ for (int n = 0; n < NUM_TRACER_SOURCES; n++) {
+ for (size_t i = 0; i < markers_[n].size(); i++) {
+ TraceMarker& marker = markers_[n][i];
+ if (marker.trace_.get()) {
+ marker.trace_->Destroy(have_context);
+ marker.trace_ = 0;
+ }
+ }
+ }
+
+ ClearFinishedTraces(have_context);
+}
+
bool GPUTracer::BeginDecoding() {
if (gpu_executing_)
return false;
@@ -194,10 +214,9 @@ bool GPUTracer::EndDecoding() {
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;
+ finished_traces_.push_back(marker.trace_);
+ marker.trace_ = 0;
}
}
}
@@ -241,14 +260,14 @@ bool GPUTracer::End(GpuTracerSource source) {
// Pop last marker with matching 'source'
if (!markers_[source].empty()) {
- if (IsTracing()) {
- scoped_refptr<GPUTrace> trace = markers_[source].back().trace_;
- if (trace.get()) {
+ scoped_refptr<GPUTrace> trace = markers_[source].back().trace_;
+ if (trace.get()) {
+ if (IsTracing()) {
trace->End(*gpu_trace_srv_category != 0);
- if (trace->IsEnabled())
- traces_.push_back(trace);
- IssueProcessTask();
}
+
+ finished_traces_.push_back(trace);
+ IssueProcessTask();
}
markers_[source].pop_back();
@@ -298,7 +317,7 @@ void GPUTracer::Process() {
void GPUTracer::ProcessTraces() {
if (!gpu_timing_client_->IsAvailable()) {
- traces_.clear();
+ ClearFinishedTraces(false);
return;
}
@@ -307,28 +326,42 @@ void GPUTracer::ProcessTraces() {
// Make owning decoder's GL context current
if (!decoder_->MakeCurrent()) {
// Skip subsequent GL calls if MakeCurrent fails
- traces_.clear();
+ ClearFinishedTraces(false);
return;
}
// Check if timers are still valid (e.g: a disjoint operation
// might have occurred.)
- if (gpu_timing_client_->CheckAndResetTimerErrors())
- traces_.clear();
+ if (gpu_timing_client_->CheckAndResetTimerErrors()) {
+ ClearFinishedTraces(true);
+ }
- while (!traces_.empty() && traces_.front()->IsAvailable()) {
- traces_.front()->Process();
- traces_.pop_front();
+ while (!finished_traces_.empty()) {
+ scoped_refptr<GPUTrace>& trace = finished_traces_.front();
+ if (trace->IsEnabled()) {
+ if (!finished_traces_.front()->IsAvailable())
+ break;
+ finished_traces_.front()->Process();
+ }
+ finished_traces_.front()->Destroy(true);
+ finished_traces_.pop_front();
}
// Clear pending traces if there were are any errors
GLenum err = glGetError();
if (err != GL_NO_ERROR)
- traces_.clear();
+ ClearFinishedTraces(true);
+}
+
+void GPUTracer::ClearFinishedTraces(bool have_context) {
+ while (!finished_traces_.empty()) {
+ finished_traces_.front()->Destroy(have_context);
+ finished_traces_.pop_front();
+ }
}
void GPUTracer::IssueProcessTask() {
- if (traces_.empty() || process_posted_)
+ if (finished_traces_.empty() || process_posted_)
return;
process_posted_ = true;
« 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