summaryrefslogtreecommitdiffstats
path: root/android_webview/browser/deferred_gpu_command_service.cc
diff options
context:
space:
mode:
authorboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-08 09:43:57 +0000
committerboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-08 09:45:30 +0000
commit8c016b610caded6dea9354e88515025e6ad52ab9 (patch)
treefe19cc750f29f999b417f935d45abc0e6e65ff73 /android_webview/browser/deferred_gpu_command_service.cc
parenteb7928a731f7f9a7282fcb503295d37e5a8ce1eb (diff)
downloadchromium_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.cc76
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>