Index: gpu/ipc/service/gpu_command_buffer_stub.cc |
diff --git a/gpu/ipc/service/gpu_command_buffer_stub.cc b/gpu/ipc/service/gpu_command_buffer_stub.cc |
index 412d9a97182600dd249a90304302123b615ba887..3e206101b2eceb4f4a93ec5eb13c2dc21543f088 100644 |
--- a/gpu/ipc/service/gpu_command_buffer_stub.cc |
+++ b/gpu/ipc/service/gpu_command_buffer_stub.cc |
@@ -26,6 +26,7 @@ |
#include "gpu/command_buffer/service/logger.h" |
#include "gpu/command_buffer/service/mailbox_manager.h" |
#include "gpu/command_buffer/service/memory_tracking.h" |
+#include "gpu/command_buffer/service/progress_reporter.h" |
#include "gpu/command_buffer/service/query_manager.h" |
#include "gpu/command_buffer/service/sync_point_manager.h" |
#include "gpu/command_buffer/service/transfer_buffer_manager.h" |
@@ -105,6 +106,35 @@ class GpuCommandBufferMemoryTracker : public gles2::MemoryTracker { |
DISALLOW_COPY_AND_ASSIGN(GpuCommandBufferMemoryTracker); |
}; |
+// GpuCommandBufferProgressReporter is used as a bridge between the |
+// ContextGroup and the GpuChannel's GpuWatchdogThread. |
+class GpuCommandBufferProgressReporter : public gles2::ProgressReporter { |
+ public: |
+ GpuCommandBufferProgressReporter(GpuChannel* channel) : channel_(channel) {} |
+ |
+ void ReportProgress() override { |
+ if (auto* watchdog = channel_->watchdog()) { |
+ // CheckArmed posts a task. Throttle this so we don't post more than |
vmiura
2016/09/30 18:24:35
Rather than adding throttling here, it seems we co
ericrk
2016/10/01 06:19:27
Good point - I don't want to overload this CL, so
|
+ // one task per second. |
+ base::TimeTicks now = base::TimeTicks::Now(); |
+ if (now < next_check_time_) |
+ return; |
+ |
+ next_check_time_ = now + base::TimeDelta::FromSeconds(kMaxCheckRateS); |
+ watchdog->CheckArmed(); |
+ } |
+ } |
+ |
+ private: |
+ // The max rate at which we will signal the watchdog thread. |
+ static const int kMaxCheckRateS = 1; |
+ |
+ // The GpuChannel always outlives the GpuCommandBufferStub and the |
+ // ContextGroups it creates, so it's safe to hold by raw pointer here. |
+ GpuChannel* channel_; |
+ base::TimeTicks next_check_time_; |
+}; |
+ |
// FastSetActiveURL will shortcut the expensive call to SetActiveURL when the |
// url_hash matches. |
void FastSetActiveURL(const GURL& url, size_t url_hash, GpuChannel* channel) { |
@@ -469,7 +499,8 @@ bool GpuCommandBufferStub::Initialize( |
manager->shader_translator_cache(), |
manager->framebuffer_completeness_cache(), feature_info, |
init_params.attribs.bind_generates_resource, |
- gmb_factory ? gmb_factory->AsImageFactory() : nullptr); |
+ gmb_factory ? gmb_factory->AsImageFactory() : nullptr, |
+ base::MakeUnique<GpuCommandBufferProgressReporter>(channel_)); |
} |
#if defined(OS_MACOSX) |