From ed04ca3ef4560f5d85d4ee788e6716d37c7be644 Mon Sep 17 00:00:00 2001 From: dyen Date: Wed, 26 Aug 2015 14:05:01 -0700 Subject: [PATCH] Have GPUTracer process traces during CommandBuffer Idle time. ThreadTaskRunnerHandle is not always available to execute GPUTracer process commands (IE on android webview), switch to use the command buffer idle time instead. R=vmiura@chromium.org BUG=None TEST=trybots Review URL: https://codereview.chromium.org/1314053002 Cr-Commit-Position: refs/heads/master@{#345672} --- gpu/command_buffer/service/gles2_cmd_decoder.cc | 4 +- gpu/command_buffer/service/gpu_tracer.cc | 75 +++++++++-------------- gpu/command_buffer/service/gpu_tracer.h | 9 +-- gpu/command_buffer/service/gpu_tracer_unittest.cc | 11 ++-- 4 files changed, 38 insertions(+), 61 deletions(-) diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 82e9052c63b7..3132b4d6eca6 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -11735,10 +11735,12 @@ void GLES2DecoderImpl::ProcessPendingReadPixels(bool did_finish) { bool GLES2DecoderImpl::HasMoreIdleWork() { return !pending_readpixel_fences_.empty() || - async_pixel_transfer_manager_->NeedsProcessMorePendingTransfers(); + async_pixel_transfer_manager_->NeedsProcessMorePendingTransfers() || + gpu_tracer_->HasTracesToProcess(); } void GLES2DecoderImpl::PerformIdleWork() { + gpu_tracer_->ProcessTraces(); ProcessPendingReadPixels(false); if (!async_pixel_transfer_manager_->NeedsProcessMorePendingTransfers()) return; diff --git a/gpu/command_buffer/service/gpu_tracer.cc b/gpu/command_buffer/service/gpu_tracer.cc index bbfcc09c1c24..3ea2adee14d4 100644 --- a/gpu/command_buffer/service/gpu_tracer.cc +++ b/gpu/command_buffer/service/gpu_tracer.cc @@ -24,7 +24,6 @@ namespace gpu { namespace gles2 { -static const unsigned int kProcessInterval = 16; static const char* kGpuTraceSourceNames[] = { "TraceCHROMIUM", // kTraceCHROMIUM, "TraceCmd", // kTraceDecoder, @@ -251,7 +250,6 @@ bool GPUTracer::EndDecoding() { } } } - IssueProcessTask(); } gpu_executing_ = false; @@ -297,7 +295,6 @@ bool GPUTracer::End(GpuTracerSource source) { } finished_traces_.push_back(trace); - IssueProcessTask(); } markers_[source].pop_back(); @@ -306,42 +303,8 @@ bool GPUTracer::End(GpuTracerSource source) { return false; } -bool GPUTracer::IsTracing() { - return (*gpu_trace_srv_category != 0) || (*gpu_trace_dev_category != 0); -} - -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(GpuTracerSource source) const { - if (source >= 0 && - source < NUM_TRACER_SOURCES && - !markers_[source].empty()) { - return markers_[source].back().name_; - } - return base::EmptyString(); -} - -scoped_refptr GPUTracer::CreateOutputter(const std::string& name) { - return TraceOutputter::Create(name); -} - -void GPUTracer::PostTask() { - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, base::Bind(&GPUTracer::Process, base::AsWeakPtr(this)), - base::TimeDelta::FromMilliseconds(kProcessInterval)); -} - -void GPUTracer::Process() { - process_posted_ = false; - ProcessTraces(); - IssueProcessTask(); +bool GPUTracer::HasTracesToProcess() { + return !finished_traces_.empty(); } void GPUTracer::ProcessTraces() { @@ -386,6 +349,32 @@ void GPUTracer::ProcessTraces() { DCHECK(GL_NO_ERROR == glGetError()); } +bool GPUTracer::IsTracing() { + return (*gpu_trace_srv_category != 0) || (*gpu_trace_dev_category != 0); +} + +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(GpuTracerSource source) const { + if (source >= 0 && + source < NUM_TRACER_SOURCES && + !markers_[source].empty()) { + return markers_[source].back().name_; + } + return base::EmptyString(); +} + +scoped_refptr GPUTracer::CreateOutputter(const std::string& name) { + return TraceOutputter::Create(name); +} + bool GPUTracer::CheckDisjointStatus() { const int64 current_time = gpu_timing_client_->GetCurrentCPUTime(); if (*gpu_trace_dev_category == 0) @@ -423,13 +412,5 @@ void GPUTracer::ClearOngoingTraces(bool have_context) { } } -void GPUTracer::IssueProcessTask() { - if (finished_traces_.empty() || process_posted_) - return; - - process_posted_ = true; - PostTask(); -} - } // namespace gles2 } // namespace gpu diff --git a/gpu/command_buffer/service/gpu_tracer.h b/gpu/command_buffer/service/gpu_tracer.h index 596e60bfa761..cb3f8902cac9 100644 --- a/gpu/command_buffer/service/gpu_tracer.h +++ b/gpu/command_buffer/service/gpu_tracer.h @@ -72,6 +72,9 @@ class GPU_EXPORT GPUTracer // End the last started trace marker. bool End(GpuTracerSource source); + bool HasTracesToProcess(); + void ProcessTraces(); + virtual bool IsTracing(); // Retrieve the name of the current open trace. @@ -82,15 +85,10 @@ class GPU_EXPORT GPUTracer protected: // Trace Processing. virtual scoped_refptr CreateOutputter(const std::string& name); - virtual void PostTask(); - void Process(); - void ProcessTraces(); bool CheckDisjointStatus(); void ClearOngoingTraces(bool have_context); - void IssueProcessTask(); - scoped_refptr gpu_timing_client_; scoped_refptr outputter_; std::vector markers_[NUM_TRACER_SOURCES]; @@ -102,7 +100,6 @@ class GPU_EXPORT GPUTracer int64 disjoint_time_ = 0; bool gpu_executing_ = false; - bool process_posted_ = false; bool began_device_traces_ = false; private: diff --git a/gpu/command_buffer/service/gpu_tracer_unittest.cc b/gpu/command_buffer/service/gpu_tracer_unittest.cc index f636edd969e5..59ed6625bb18 100644 --- a/gpu/command_buffer/service/gpu_tracer_unittest.cc +++ b/gpu/command_buffer/service/gpu_tracer_unittest.cc @@ -76,13 +76,7 @@ class GPUTracerTester : public GPUTracer { return new MockOutputter(); } - void PostTask() override { - // Process synchronously. - Process(); - } - unsigned char tracing_enabled_; - scoped_refptr set_outputter_; }; @@ -426,7 +420,6 @@ class BaseGpuTracerTest : public BaseGpuTest { std::string source_trace_name = trace_name + num_char; const bool valid_timer = gpu_timing_client_->IsAvailable(); - const GpuTracerSource source = static_cast(i); ExpectOutputterEndMocks(outputter_ref_.get(), source, source_category, source_trace_name, expect_start_time + i, @@ -438,6 +431,7 @@ class BaseGpuTracerTest : public BaseGpuTest { ASSERT_TRUE(tracer.End(source)); } ASSERT_TRUE(tracer.EndDecoding()); + tracer.ProcessTraces(); outputter_ref_ = NULL; } @@ -513,6 +507,7 @@ class BaseGpuTracerTest : public BaseGpuTest { (5 * base::Time::kNanosecondsPerMicrosecond)); g_fakeCPUTime = expect_start_time + 5; ASSERT_TRUE(tracer.EndDecoding()); + tracer.ProcessTraces(); } void DoDisjointTest() { @@ -573,6 +568,7 @@ class BaseGpuTracerTest : public BaseGpuTest { ASSERT_TRUE(tracer.End(source)); ASSERT_TRUE(tracer.EndDecoding()); + tracer.ProcessTraces(); outputter_ref_ = NULL; } @@ -629,6 +625,7 @@ class BaseGpuTracerTest : public BaseGpuTest { ASSERT_TRUE(tracer.End(source)); ASSERT_TRUE(tracer.EndDecoding()); + tracer.ProcessTraces(); } }; -- 2.11.4.GIT