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); |