| Index: android_webview/native/aw_contents.cc
|
| diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc
|
| index 4bd68b78f36e9b75adc375c53483e595963252bf..b10eeba2e56eabc78a47c4cd4f1ec05e15f60dfa 100644
|
| --- a/android_webview/native/aw_contents.cc
|
| +++ b/android_webview/native/aw_contents.cc
|
| @@ -11,7 +11,6 @@
|
| #include "android_webview/browser/aw_resource_context.h"
|
| #include "android_webview/browser/browser_view_renderer.h"
|
| #include "android_webview/browser/deferred_gpu_command_service.h"
|
| -#include "android_webview/browser/hardware_renderer.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"
|
| @@ -264,7 +263,6 @@ void AwContents::SetAwAutofillClient(jobject client) {
|
|
|
| AwContents::~AwContents() {
|
| DCHECK_EQ(this, AwContents::FromWebContents(web_contents_.get()));
|
| - DCHECK(!hardware_renderer_.get());
|
| web_contents_->RemoveUserData(kAwContentsUserDataKey);
|
| if (find_helper_.get())
|
| find_helper_->SetListener(NULL);
|
| @@ -340,65 +338,8 @@ jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) {
|
| return reinterpret_cast<intptr_t>(this);
|
| }
|
|
|
| -// TODO(hush): move this function to SharedRendererState.
|
| void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
|
| - if (draw_info->mode == AwDrawGLInfo::kModeSync) {
|
| - if (hardware_renderer_)
|
| - hardware_renderer_->CommitFrame();
|
| - return;
|
| - }
|
| -
|
| - {
|
| - 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
|
| - ? ScopedAppGLStateRestore::MODE_DRAW
|
| - : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT);
|
| - ScopedAllowGL allow_gl;
|
| -
|
| - if (draw_info->mode == AwDrawGLInfo::kModeProcessNoContext) {
|
| - LOG(ERROR) << "Received unexpected kModeProcessNoContext";
|
| - }
|
| -
|
| - // kModeProcessNoContext should never happen because we tear down hardware
|
| - // in onTrimMemory. However that guarantee is maintained outside of chromium
|
| - // code. Not notifying shared state in kModeProcessNoContext can lead to
|
| - // immediate deadlock, which is slightly more catastrophic than leaks or
|
| - // corruption.
|
| - if (draw_info->mode == AwDrawGLInfo::kModeProcess ||
|
| - draw_info->mode == AwDrawGLInfo::kModeProcessNoContext) {
|
| - shared_renderer_state_->DidDrawGLProcess();
|
| - }
|
| -
|
| - if (shared_renderer_state_->IsInsideHardwareRelease()) {
|
| - hardware_renderer_.reset();
|
| - // Flush the idle queue in tear down.
|
| - DeferredGpuCommandService::GetInstance()->PerformAllIdleWork();
|
| - return;
|
| - }
|
| -
|
| - 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_));
|
| - hardware_renderer_->CommitFrame();
|
| - }
|
| -
|
| - hardware_renderer_->DrawGL(state_restore.stencil_enabled(),
|
| - state_restore.framebuffer_binding_ext(),
|
| - draw_info);
|
| - DeferredGpuCommandService::GetInstance()->PerformIdleWork(false);
|
| + shared_renderer_state_->DrawGL(draw_info);
|
| }
|
|
|
| namespace {
|
| @@ -880,13 +821,7 @@ 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()) {
|
| - renderer_manager_key_ = manager->PushBack(shared_renderer_state_);
|
| - DeferredGpuCommandService::SetInstance();
|
| - }
|
| + shared_renderer_state_->InitializeHardwareDrawIfNeededOnUI();
|
| }
|
|
|
| void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
|
| @@ -896,41 +831,14 @@ void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
|
| }
|
|
|
| void AwContents::ReleaseHardwareDrawIfNeeded() {
|
| - InsideHardwareReleaseReset inside_reset(shared_renderer_state_);
|
| + shared_renderer_state_->ReleaseHardwareDrawIfNeededOnUI();
|
| +}
|
|
|
| +void AwContents::InvalidateOnFunctorDestroy() {
|
| JNIEnv* env = AttachCurrentThread();
|
| ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
|
| if (!obj.is_null())
|
| Java_AwContents_invalidateOnFunctorDestroy(env, obj.obj());
|
| -
|
| - bool hardware_initialized = browser_view_renderer_.hardware_enabled();
|
| - if (hardware_initialized) {
|
| - bool draw_functor_succeeded = RequestDrawGL(true);
|
| - if (!draw_functor_succeeded) {
|
| - LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?";
|
| - // Calling release on wrong thread intentionally.
|
| - AwDrawGLInfo info;
|
| - info.mode = AwDrawGLInfo::kModeProcess;
|
| - DrawGL(&info);
|
| - }
|
| - browser_view_renderer_.ReleaseHardware();
|
| - }
|
| - DCHECK(!hardware_renderer_);
|
| -
|
| - GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
|
| -
|
| - {
|
| - base::AutoLock lock(render_thread_lock_);
|
| - if (renderer_manager_key_ != manager->NullKey()) {
|
| - manager->Remove(renderer_manager_key_);
|
| - renderer_manager_key_ = manager->NullKey();
|
| - }
|
| - }
|
| -
|
| - if (hardware_initialized) {
|
| - // Flush any invoke functors that's caused by OnDetachedFromWindow.
|
| - RequestDrawGL(true);
|
| - }
|
| }
|
|
|
| base::android::ScopedJavaLocalRef<jbyteArray>
|
|
|