Chromium Code Reviews| Index: android_webview/browser/browser_view_renderer.cc |
| diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc |
| index cf6b4b4f6fc9262776adad9e860cc7dbf020bb83..284c41e9723dedffacbd4af5b0a27c876c96f395 100644 |
| --- a/android_webview/browser/browser_view_renderer.cc |
| +++ b/android_webview/browser/browser_view_renderer.cc |
| @@ -88,7 +88,7 @@ BrowserViewRenderer::BrowserViewRenderer( |
| const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner, |
| bool disable_page_visibility) |
| : client_(client), |
| - shared_renderer_state_(ui_task_runner, this), |
| + shared_renderer_state_(nullptr), |
| ui_task_runner_(ui_task_runner), |
| disable_page_visibility_(disable_page_visibility), |
| compositor_(NULL), |
| @@ -108,6 +108,7 @@ BrowserViewRenderer::BrowserViewRenderer( |
| BrowserViewRenderer::~BrowserViewRenderer() { |
| DCHECK(compositor_map_.empty()); |
| + SetSharedRendererState(nullptr); |
| } |
| void BrowserViewRenderer::RegisterWithWebContents( |
| @@ -116,8 +117,21 @@ void BrowserViewRenderer::RegisterWithWebContents( |
| new BrowserViewRendererUserData(this)); |
| } |
| +void BrowserViewRenderer::SetSharedRendererState( |
| + SharedRendererState* shared_renderer_state) { |
| + if (shared_renderer_state_ == shared_renderer_state) return; |
| + |
| + if (shared_renderer_state_) { |
| + shared_renderer_state_->SetBrowserViewRendererOnUI(nullptr); |
| + } |
| + shared_renderer_state_ = shared_renderer_state; |
| + if (shared_renderer_state_) { |
| + shared_renderer_state_->SetBrowserViewRendererOnUI(this); |
| + } |
| +} |
| + |
| SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { |
| - return &shared_renderer_state_; |
| + return shared_renderer_state_; |
| } |
| bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { |
| @@ -152,11 +166,11 @@ void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { |
| // If offscreen pre-raster is disabled, drop everything in hardware. Otherwise |
| // keep the tiles and just delete the HardwareRenderer. |
| - if (level >= TRIM_MEMORY_MODERATE) { |
| + if (level >= TRIM_MEMORY_MODERATE && shared_renderer_state_) { |
|
boliu
2016/03/23 15:47:20
this should just be aw_contents -> SRS call, no ne
|
| if (offscreen_pre_raster_) |
| - shared_renderer_state_.DeleteHardwareRendererOnUI(); |
| + shared_renderer_state_->DeleteHardwareRendererOnUI(); |
| else |
| - shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); |
| + shared_renderer_state_->ReleaseHardwareDrawIfNeededOnUI(); |
| return; |
| } |
| @@ -170,7 +184,7 @@ void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { |
| } |
| void BrowserViewRenderer::UpdateMemoryPolicy() { |
| - if (!hardware_enabled_) { |
| + if (!hardware_enabled_ || !shared_renderer_state_) { |
| compositor_->SetMemoryPolicy(0u); |
| return; |
| } |
| @@ -180,7 +194,7 @@ void BrowserViewRenderer::UpdateMemoryPolicy() { |
| bytes_limit = static_cast<size_t>(g_memory_override_in_bytes); |
| } else { |
| ParentCompositorDrawConstraints parent_draw_constraints = |
| - shared_renderer_state_.GetParentDrawConstraintsOnUI(); |
| + shared_renderer_state_->GetParentDrawConstraintsOnUI(); |
| gfx::Rect interest_rect = |
| offscreen_pre_raster_ || parent_draw_constraints.is_layer |
| ? gfx::Rect(size_) |
| @@ -218,22 +232,22 @@ bool BrowserViewRenderer::CanOnDraw() { |
| } |
| bool BrowserViewRenderer::OnDrawHardware() { |
| + DCHECK(shared_renderer_state_); |
| TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); |
| - |
| - shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); |
| + shared_renderer_state_->InitializeHardwareDrawIfNeededOnUI(); |
| if (!CanOnDraw()) { |
| return false; |
| } |
| - shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_); |
| + shared_renderer_state_->SetScrollOffsetOnUI(last_on_draw_scroll_offset_); |
| hardware_enabled_ = true; |
| ReturnResourceFromParent(); |
| UpdateMemoryPolicy(); |
| ParentCompositorDrawConstraints parent_draw_constraints = |
| - shared_renderer_state_.GetParentDrawConstraintsOnUI(); |
| + shared_renderer_state_->GetParentDrawConstraintsOnUI(); |
| gfx::Size surface_size(size_); |
| gfx::Rect viewport(surface_size); |
| gfx::Rect clip = viewport; |
| @@ -260,7 +274,7 @@ bool BrowserViewRenderer::OnDrawHardware() { |
| if (!frame.frame.get()) { |
| TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
| TRACE_EVENT_SCOPE_THREAD); |
| - return shared_renderer_state_.HasFrameOnUI(); |
| + return shared_renderer_state_->HasFrameOnUI(); |
| } |
| scoped_ptr<ChildFrame> child_frame = make_scoped_ptr(new ChildFrame( |
| @@ -269,15 +283,16 @@ bool BrowserViewRenderer::OnDrawHardware() { |
| transform_for_tile_priority, offscreen_pre_raster_, |
| parent_draw_constraints.is_layer)); |
| - ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); |
| - shared_renderer_state_.SetCompositorFrameOnUI(std::move(child_frame)); |
| + ReturnUnusedResource(shared_renderer_state_->PassUncommittedFrameOnUI()); |
| + shared_renderer_state_->SetCompositorFrameOnUI(std::move(child_frame)); |
| return true; |
| } |
| void BrowserViewRenderer::UpdateParentDrawConstraints() { |
| + DCHECK(shared_renderer_state_); |
| PostInvalidate(); |
| ParentCompositorDrawConstraints parent_draw_constraints = |
| - shared_renderer_state_.GetParentDrawConstraintsOnUI(); |
| + shared_renderer_state_->GetParentDrawConstraintsOnUI(); |
| client_->ParentDrawConstraintsUpdated(parent_draw_constraints); |
| } |
| @@ -297,8 +312,9 @@ void BrowserViewRenderer::ReturnUnusedResource( |
| } |
| void BrowserViewRenderer::ReturnResourceFromParent() { |
| + DCHECK(shared_renderer_state_); |
| SharedRendererState::ReturnedResourcesMap returned_resource_map; |
| - shared_renderer_state_.SwapReturnedResourcesOnUI(&returned_resource_map); |
| + shared_renderer_state_->SwapReturnedResourcesOnUI(&returned_resource_map); |
| for (auto iterator = returned_resource_map.begin(); |
| iterator != returned_resource_map.end(); iterator++) { |
| uint32_t compositor_id = iterator->first; |
| @@ -423,8 +439,9 @@ void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { |
| } |
| void BrowserViewRenderer::OnDetachedFromWindow() { |
| + DCHECK(shared_renderer_state_); |
| TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); |
| - shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); |
| + shared_renderer_state_->ReleaseHardwareDrawIfNeededOnUI(); |
| attached_to_window_ = false; |
| DCHECK(!hardware_enabled_); |
| UpdateCompositorIsActive(); |
| @@ -438,10 +455,11 @@ void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) { |
| } |
| void BrowserViewRenderer::ReleaseHardware() { |
| + DCHECK(shared_renderer_state_); |
| DCHECK(hardware_enabled_); |
| - ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); |
| + ReturnUnusedResource(shared_renderer_state_->PassUncommittedFrameOnUI()); |
| ReturnResourceFromParent(); |
| - DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI()); |
| + DCHECK(shared_renderer_state_->ReturnedResourcesEmptyOnUI()); |
| if (compositor_) { |
| compositor_->SetMemoryPolicy(0u); |