summaryrefslogtreecommitdiff
path: root/android_webview
diff options
context:
space:
mode:
authorsievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-29 11:17:47 +0000
committerBo Liu <boliu@google.com>2014-08-13 10:59:28 -0700
commitb6c6d705b09bf6e997634261bc0234bd744a39bb (patch)
tree58b3adbd32fef1d8c2f79f3bc5196dc1a80abc0c /android_webview
parentfeacb0fee2ad84ac8ca0669a1b15d6839fa306ac (diff)
downloadchromium_org-b6c6d705b09bf6e997634261bc0234bd744a39bb.tar.gz
Cherry-pick: Android WebView: Perform idle gpu service work
Clean cherry-pick of chromium crrev.com/r286171 BUG: 16550863 Change-Id: Ifd76210139e28280030b30756e821900313b2f8a
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/browser/deferred_gpu_command_service.cc43
-rw-r--r--android_webview/browser/deferred_gpu_command_service.h7
-rw-r--r--android_webview/native/aw_contents.cc7
3 files changed, 53 insertions, 4 deletions
diff --git a/android_webview/browser/deferred_gpu_command_service.cc b/android_webview/browser/deferred_gpu_command_service.cc
index cb31954c18..8a137a8e78 100644
--- a/android_webview/browser/deferred_gpu_command_service.cc
+++ b/android_webview/browser/deferred_gpu_command_service.cc
@@ -66,8 +66,13 @@ ScopedAllowGL::~ScopedAllowGL() {
allow_gl.Get().Set(false);
g_request_pending.Get().Set(false);
- if (g_service.Get())
- g_service.Get()->RunTasks();
+ DeferredGpuCommandService* service = g_service.Get();
+ if (service) {
+ service->RunTasks();
+ if (service->HasIdleWork()) {
+ service->RequestProcessGL();
+ }
+ }
}
// static
@@ -123,9 +128,41 @@ void DeferredGpuCommandService::ScheduleTask(const base::Closure& task) {
}
}
+bool DeferredGpuCommandService::HasIdleWork() {
+ base::AutoLock lock(tasks_lock_);
+ return idle_tasks_.size() > 0;
+}
+
void DeferredGpuCommandService::ScheduleIdleWork(
const base::Closure& callback) {
- // TODO(sievers): Should this do anything?
+ {
+ base::AutoLock lock(tasks_lock_);
+ idle_tasks_.push(std::make_pair(base::Time::Now(), callback));
+ }
+ RequestProcessGL();
+}
+
+void DeferredGpuCommandService::PerformIdleWork(bool is_idle) {
+ DCHECK(ScopedAllowGL::IsAllowed());
+ static const base::TimeDelta kMaxIdleAge =
+ base::TimeDelta::FromMilliseconds(16);
+
+ const base::Time now = base::Time::Now();
+ while (HasIdleWork()) {
+ base::Closure task;
+ {
+ base::AutoLock lock(tasks_lock_);
+ if (!is_idle) {
+ // Only run old tasks if we are not really idle right now.
+ base::TimeDelta age(now - idle_tasks_.front().first);
+ if (age < kMaxIdleAge)
+ break;
+ }
+ task = idle_tasks_.front().second;
+ idle_tasks_.pop();
+ }
+ task.Run();
+ }
}
bool DeferredGpuCommandService::UseVirtualizedGLContexts() { return true; }
diff --git a/android_webview/browser/deferred_gpu_command_service.h b/android_webview/browser/deferred_gpu_command_service.h
index 696854db99..9a19fdd3d9 100644
--- a/android_webview/browser/deferred_gpu_command_service.h
+++ b/android_webview/browser/deferred_gpu_command_service.h
@@ -6,10 +6,12 @@
#define ANDROID_WEBVIEW_BROWSER_DEFERRED_GPU_COMMAND_SERVICE_H_
#include <queue>
+#include <utility>
#include "base/lazy_instance.h"
#include "base/memory/ref_counted.h"
#include "base/threading/thread_local.h"
+#include "base/time/time.h"
#include "gpu/command_buffer/service/in_process_command_buffer.h"
namespace android_webview {
@@ -41,6 +43,9 @@ class DeferredGpuCommandService
shader_translator_cache() OVERRIDE;
void RunTasks();
+ // If |is_idle| is false, this will only run older idle tasks.
+ void PerformIdleWork(bool is_idle);
+ bool HasIdleWork();
virtual void AddRef() const OVERRIDE;
virtual void Release() const OVERRIDE;
@@ -50,12 +55,14 @@ class DeferredGpuCommandService
friend class base::RefCountedThreadSafe<DeferredGpuCommandService>;
private:
+ friend class ScopedAllowGL;
static void RequestProcessGL();
DeferredGpuCommandService();
base::Lock tasks_lock_;
std::queue<base::Closure> tasks_;
+ std::queue<std::pair<base::Time, base::Closure> > idle_tasks_;
scoped_refptr<gpu::gles2::ShaderTranslatorCache> shader_translator_cache_;
DISALLOW_COPY_AND_ASSIGN(DeferredGpuCommandService);
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc
index 04b6da1972..5cecb00bd1 100644
--- a/android_webview/native/aw_contents.cc
+++ b/android_webview/native/aw_contents.cc
@@ -367,8 +367,12 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
return;
}
- if (draw_info->mode != AwDrawGLInfo::kModeDraw)
+ if (draw_info->mode != AwDrawGLInfo::kModeDraw) {
+ if (draw_info->mode == AwDrawGLInfo::kModeProcess) {
+ DeferredGpuCommandService::GetInstance()->PerformIdleWork(true);
+ }
return;
+ }
if (!hardware_renderer_) {
hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
@@ -378,6 +382,7 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
hardware_renderer_->DrawGL(state_restore.stencil_enabled(),
state_restore.framebuffer_binding_ext(),
draw_info);
+ DeferredGpuCommandService::GetInstance()->PerformIdleWork(false);
}
namespace {