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

Unified Diff: android_webview/native/aw_contents.cc

Issue 266353003: aw: Ubercomp mega patch (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: r272176 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
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | android_webview/native/aw_contents_io_thread_client_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: android_webview/native/aw_contents.cc
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc
index c0f7b1b9191600c5921c1c656107b3c58cacbc22..3aa2674850cce9fee5e0e628a33718c95716d820 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"
@@ -326,7 +328,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
@@ -334,21 +342,36 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
: ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT);
ScopedAllowGL allow_gl;
- for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null();
- c = shared_renderer_state_.PopFrontClosure()) {
- c.Run();
+ if (shared_renderer_state_.IsInsideTeardown()) {
+ hardware_renderer_.reset();
+ shared_renderer_state_.SetHardwareInitialized(false);
+ return;
}
- 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());
+ }
}
}
@@ -782,30 +805,18 @@ 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));
+ shared_renderer_state_.SetInsideTeardown(true);
- shared_renderer_state_.ClearClosureQueue();
- shared_renderer_state_.AppendClosure(base::Bind(
- &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this)));
bool draw_functor_succeeded = RequestDrawGL(NULL, true);
if (!draw_functor_succeeded &&
shared_renderer_state_.IsHardwareInitialized()) {
@@ -814,27 +825,25 @@ void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
AwDrawGLInfo info;
info.mode = AwDrawGLInfo::kModeProcess;
DrawGL(&info);
- } else {
- 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();
+ }
}
-}
-void AwContents::ReleaseHardwareDrawOnRenderThread() {
- // No point in running any other commands if we released hardware already.
- shared_renderer_state_.ClearClosureQueue();
- if (!shared_renderer_state_.IsHardwareInitialized())
- return;
+ // Flush any invoke functors that's caused by OnDetachedFromWindow.
+ RequestDrawGL(NULL, true);
- hardware_renderer_.reset();
- shared_renderer_state_.SetHardwareInitialized(false);
+ shared_renderer_state_.SetInsideTeardown(false);
}
base::android::ScopedJavaLocalRef<jbyteArray>
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | android_webview/native/aw_contents_io_thread_client_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698