Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(757)

Unified Diff: android_webview/native/aw_contents.cc

Issue 287993004: [Android WebView] Implement Ubercomp for Render Thread support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/native/aw_contents.cc
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc
index 91f6f9d2508bf20e004ebc2c619a4c3373bd764b..409c3b01f7892e4bb57cd4519c40df2e73e85b85 100644
--- a/android_webview/native/aw_contents.cc
+++ b/android_webview/native/aw_contents.cc
@@ -13,10 +13,12 @@
#include "android_webview/browser/deferred_gpu_command_service.h"
#include "android_webview/browser/gpu_memory_buffer_factory_impl.h"
#include "android_webview/browser/hardware_renderer.h"
+#include "android_webview/browser/hardware_renderer_legacy.h"
#include "android_webview/browser/net_disk_cache_remover.h"
#include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_delegate.h"
#include "android_webview/browser/scoped_app_gl_state_restore.h"
#include "android_webview/common/aw_hit_test_data.h"
+#include "android_webview/common/aw_switches.h"
#include "android_webview/common/devtools_instrumentation.h"
#include "android_webview/native/aw_autofill_manager_delegate.h"
#include "android_webview/native/aw_browser_dependency_factory.h"
@@ -325,7 +327,13 @@ jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) {
}
void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
- GLViewRendererManager::GetInstance()->DidDrawGL(renderer_manager_key_);
+ {
+ GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
+ base::AutoLock lock(render_thread_lock_);
+ if (renderer_manager_key_ != manager->NullKey()) {
+ manager->DidDrawGL(renderer_manager_key_);
+ }
+ }
ScopedAppGLStateRestore state_restore(
draw_info->mode == AwDrawGLInfo::kModeDraw
@@ -338,16 +346,30 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
c.Run();
}
- if (!hardware_renderer_)
+ if (draw_info->mode != AwDrawGLInfo::kModeDraw)
return;
- // TODO(boliu): Make this a task as well.
- DrawGLResult result;
+ if (!hardware_renderer_) {
+ DCHECK(!shared_renderer_state_.IsHardwareInitialized());
+ if (switches::UbercompEnabled()) {
+ hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
+ } else {
+ hardware_renderer_.reset(
+ new HardwareRendererLegacy(&shared_renderer_state_));
+ }
+ shared_renderer_state_.SetHardwareInitialized(true);
+ }
+
+ scoped_ptr<DrawGLResult> result(new DrawGLResult);
if (hardware_renderer_->DrawGL(state_restore.stencil_enabled(),
state_restore.framebuffer_binding_ext(),
draw_info,
- &result)) {
- browser_view_renderer_.DidDrawGL(result);
+ result.get())) {
+ if (switches::UbercompEnabled()) {
+ browser_view_renderer_.DidDrawDelegated(result.Pass());
+ } else {
+ browser_view_renderer_.DidDrawGL(result.Pass());
+ }
}
}
@@ -781,24 +803,14 @@ void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) {
void AwContents::InitializeHardwareDrawIfNeeded() {
GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
+
+ base::AutoLock lock(render_thread_lock_);
if (renderer_manager_key_ == manager->NullKey()) {
- // Add task but don't schedule it. It will run when DrawGL is called for
- // the first time.
- shared_renderer_state_.AppendClosure(
- base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread,
- base::Unretained(this)));
renderer_manager_key_ = manager->PushBack(&shared_renderer_state_);
DeferredGpuCommandService::SetInstance();
}
}
-void AwContents::InitializeHardwareDrawOnRenderThread() {
- DCHECK(!hardware_renderer_);
- DCHECK(!shared_renderer_state_.IsHardwareInitialized());
- hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_));
- shared_renderer_state_.SetHardwareInitialized(true);
-}
-
void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -817,13 +829,21 @@ void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
shared_renderer_state_.ClearClosureQueue();
}
+ DCHECK(!hardware_renderer_);
browser_view_renderer_.OnDetachedFromWindow();
GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
- if (renderer_manager_key_ != manager->NullKey()) {
- manager->Remove(renderer_manager_key_);
- renderer_manager_key_ = manager->NullKey();
+
+ {
+ base::AutoLock lock(render_thread_lock_);
+ if (renderer_manager_key_ != manager->NullKey()) {
+ manager->Remove(renderer_manager_key_);
+ renderer_manager_key_ = manager->NullKey();
+ }
}
+
+ // Flush any invoke functors that's caused by OnDetachedFromWindow.
+ RequestDrawGL(NULL, true);
}
void AwContents::ReleaseHardwareDrawOnRenderThread() {

Powered by Google App Engine
This is Rietveld 408576698