diff options
author | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-08 09:43:57 +0000 |
---|---|---|
committer | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-08 09:45:30 +0000 |
commit | 8c016b610caded6dea9354e88515025e6ad52ab9 (patch) | |
tree | fe19cc750f29f999b417f935d45abc0e6e65ff73 /android_webview/browser/deferred_gpu_command_service.cc | |
parent | eb7928a731f7f9a7282fcb503295d37e5a8ce1eb (diff) | |
download | chromium_src-8c016b610caded6dea9354e88515025e6ad52ab9.zip chromium_src-8c016b610caded6dea9354e88515025e6ad52ab9.tar.gz chromium_src-8c016b610caded6dea9354e88515025e6ad52ab9.tar.bz2 |
aw: Improve idle task scheduling
Three related changes:
* Only run idle tasks in the queue, not newly added ones.
* Move g_request_pending logic to SharedRendererState. This
allows pending tasks to be cancelled correctly.
* Wait for kModeProcess to happen first before trying to
request another to avoid a queue of pending tasks.
BUG=401712
Review URL: https://codereview.chromium.org/444173003
Cr-Commit-Position: refs/heads/master@{#288285}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@288285 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview/browser/deferred_gpu_command_service.cc')
-rw-r--r-- | android_webview/browser/deferred_gpu_command_service.cc | 76 |
1 files changed, 15 insertions, 61 deletions
diff --git a/android_webview/browser/deferred_gpu_command_service.cc b/android_webview/browser/deferred_gpu_command_service.cc index 93f6c16..bc1eec0 100644 --- a/android_webview/browser/deferred_gpu_command_service.cc +++ b/android_webview/browser/deferred_gpu_command_service.cc @@ -7,6 +7,7 @@ #include "android_webview/browser/gl_view_renderer_manager.h" #include "android_webview/browser/shared_renderer_state.h" #include "base/debug/trace_event.h" +#include "base/lazy_instance.h" #include "base/synchronization/lock.h" #include "content/public/browser/android/synchronous_compositor.h" #include "gpu/command_buffer/service/shader_translator_cache.h" @@ -14,49 +15,6 @@ namespace android_webview { namespace { - -// TODO(boliu): Consider using base/atomicops.h. -class ThreadSafeBool { - public: - ThreadSafeBool(); - void Set(bool boolean); - bool Get(); - bool GetAndSet(); - - private: - base::Lock lock_; - bool boolean_; - DISALLOW_COPY_AND_ASSIGN(ThreadSafeBool); -}; - -ThreadSafeBool::ThreadSafeBool() : boolean_(false) { -} - -void ThreadSafeBool::Set(bool boolean) { - base::AutoLock lock(lock_); - boolean_ = boolean; -} - -bool ThreadSafeBool::GetAndSet() { - base::AutoLock lock(lock_); - bool rv = boolean_; - boolean_ = true; - return rv; -} - -bool ThreadSafeBool::Get() { - base::AutoLock lock(lock_); - return boolean_; -} - -base::LazyInstance<ThreadSafeBool> g_request_pending = - LAZY_INSTANCE_INITIALIZER; - -// Because request is posted to UI thread, have to treat requests on UI thread -// specifically because UI can immediately block waiting for the request. -base::LazyInstance<ThreadSafeBool> g_request_pending_on_ui = - LAZY_INSTANCE_INITIALIZER; - base::LazyInstance<scoped_refptr<DeferredGpuCommandService> > g_service = LAZY_INSTANCE_INITIALIZER; } // namespace @@ -78,13 +36,11 @@ ScopedAllowGL::ScopedAllowGL() { ScopedAllowGL::~ScopedAllowGL() { allow_gl.Get().Set(false); - g_request_pending.Get().Set(false); - g_request_pending_on_ui.Get().Set(false); DeferredGpuCommandService* service = g_service.Get(); if (service) { service->RunTasks(); - if (service->HasIdleWork()) { + if (service->IdleQueueSize()) { service->RequestProcessGL(); } } @@ -95,10 +51,6 @@ void DeferredGpuCommandService::SetInstance() { if (!g_service.Get()) { g_service.Get() = new DeferredGpuCommandService; content::SynchronousCompositor::SetGpuService(g_service.Get()); - - // Initialize global booleans. - g_request_pending.Get().Set(false); - g_request_pending_on_ui.Get().Set(false); } } @@ -124,14 +76,7 @@ void DeferredGpuCommandService::RequestProcessGL() { LOG(ERROR) << "No hardware renderer. Deadlock likely"; return; } - - bool on_ui_thread = renderer_state->CurrentlyOnUIThread(); - bool need_request = on_ui_thread ? !g_request_pending_on_ui.Get().GetAndSet() - : !g_request_pending.Get().GetAndSet(); - if (need_request) { - g_request_pending.Get().Set(true); - renderer_state->ClientRequestDrawGL(); - } + renderer_state->ClientRequestDrawGL(); } // Called from different threads! @@ -147,9 +92,9 @@ void DeferredGpuCommandService::ScheduleTask(const base::Closure& task) { } } -bool DeferredGpuCommandService::HasIdleWork() { +size_t DeferredGpuCommandService::IdleQueueSize() { base::AutoLock lock(tasks_lock_); - return idle_tasks_.size() > 0; + return idle_tasks_.size(); } void DeferredGpuCommandService::ScheduleIdleWork( @@ -171,7 +116,8 @@ void DeferredGpuCommandService::PerformIdleWork(bool is_idle) { base::TimeDelta::FromMilliseconds(16); const base::Time now = base::Time::Now(); - while (HasIdleWork()) { + size_t queue_size = IdleQueueSize(); + while (queue_size--) { base::Closure task; { base::AutoLock lock(tasks_lock_); @@ -188,6 +134,14 @@ void DeferredGpuCommandService::PerformIdleWork(bool is_idle) { } } +void DeferredGpuCommandService::PerformAllIdleWork() { + TRACE_EVENT0("android_webview", + "DeferredGpuCommandService::PerformAllIdleWork"); + while (IdleQueueSize()) { + PerformIdleWork(true); + } +} + bool DeferredGpuCommandService::UseVirtualizedGLContexts() { return true; } scoped_refptr<gpu::gles2::ShaderTranslatorCache> |