Index: android_webview/browser/shared_renderer_state.cc |
diff --git a/android_webview/browser/shared_renderer_state.cc b/android_webview/browser/shared_renderer_state.cc |
index 184c86dfff14da71eb9e2cd889f2d8097a075250..0a9e75faea2fd453394c96d528c038f4152613dd 100644 |
--- a/android_webview/browser/shared_renderer_state.cc |
+++ b/android_webview/browser/shared_renderer_state.cc |
@@ -69,7 +69,7 @@ void RequestDrawGLTracker::ResetPending() { |
void RequestDrawGLTracker::SetQueuedFunctorOnUi(SharedRendererState* state) { |
base::AutoLock lock(lock_); |
DCHECK(state); |
- DCHECK(pending_ui_ == state || pending_non_ui_ == state); |
+ // DCHECK(pending_ui_ == state || pending_non_ui_ == state); |
boliu
2015/02/05 17:10:22
Just remove it.
We usually don't comment things o
|
pending_ui_ = state; |
pending_non_ui_ = NULL; |
} |
@@ -279,16 +279,6 @@ void SharedRendererState::DrawGL(AwDrawGLInfo* draw_info) { |
return; |
} |
- // 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) { |
- DidDrawGLProcess(); |
- } |
- |
{ |
GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); |
base::AutoLock lock(lock_); |
@@ -303,51 +293,69 @@ void SharedRendererState::DrawGL(AwDrawGLInfo* draw_info) { |
: ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); |
ScopedAllowGL allow_gl; |
- if (draw_info->mode == AwDrawGLInfo::kModeProcessNoContext) { |
+ switch (draw_info->mode) { |
+ case AwDrawGLInfo::kModeProcessNoContext: { |
boliu
2015/02/05 17:10:22
Indent here is wrong.
See http://google-styleguid
Tobias Sargeant
2015/02/05 17:29:39
Done.
|
LOG(ERROR) << "Received unexpected kModeProcessNoContext"; |
+ DidDrawGLProcess(); |
+ break; |
} |
- if (IsInsideHardwareRelease()) { |
- hardware_renderer_.reset(); |
- // Flush the idle queue in tear down. |
- DeferredGpuCommandService::GetInstance()->PerformAllIdleWork(); |
- return; |
- } |
+ case AwDrawGLInfo::kModeProcess: { |
+ // kModeProcessNoContext should never happen because we tear down hardware |
boliu
2015/02/05 17:10:22
Move this comment up.
Tobias Sargeant
2015/02/05 17:29:39
Done.
|
+ // 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. |
+ DidDrawGLProcess(); |
- if (draw_info->mode != AwDrawGLInfo::kModeDraw) { |
- if (draw_info->mode == AwDrawGLInfo::kModeProcess) { |
+ if (IsInsideHardwareRelease()) { |
+ hardware_renderer_.reset(); |
+ // Flush the idle queue in tear down. |
+ DeferredGpuCommandService::GetInstance()->PerformAllIdleWork(); |
+ } else { |
DeferredGpuCommandService::GetInstance()->PerformIdleWork(true); |
} |
- return; |
+ break; |
} |
- if (!hardware_renderer_) { |
- hardware_renderer_.reset(new HardwareRenderer(this)); |
- hardware_renderer_->CommitFrame(); |
+ case AwDrawGLInfo::kModeDraw: { |
+ if (browser_view_renderer_->IsVisible()) { |
boliu
2015/02/05 17:10:22
Not thread safe. BVR is a UI thread only object, a
Tobias Sargeant
2015/02/05 17:29:39
The problem is that it seems possible to get draw
boliu
2015/02/05 17:36:17
And that call is kModeDraw (not kModeProcess)? The
|
+ if (!hardware_renderer_) { |
+ hardware_renderer_.reset(new HardwareRenderer(this)); |
+ hardware_renderer_->CommitFrame(); |
+ } |
+ |
+ hardware_renderer_->DrawGL(state_restore.stencil_enabled(), |
+ state_restore.framebuffer_binding_ext(), |
+ draw_info); |
+ DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); |
+ } |
+ break; |
} |
- hardware_renderer_->DrawGL(state_restore.stencil_enabled(), |
- state_restore.framebuffer_binding_ext(), |
- draw_info); |
- DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); |
+ default: { |
+ break; |
+ } |
+ } |
} |
void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() { |
DCHECK(ui_loop_->BelongsToCurrentThread()); |
- InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); |
- |
browser_view_renderer_->InvalidateOnFunctorDestroy(); |
bool hardware_initialized = browser_view_renderer_->hardware_enabled(); |
if (hardware_initialized) { |
- bool draw_functor_succeeded = browser_view_renderer_->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); |
+ { |
+ InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); |
boliu
2015/02/05 17:10:22
This used to wrap BVR::ReleaseHardware too.
|
+ |
+ bool draw_functor_succeeded = browser_view_renderer_->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(); |
} |