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 9f91213dd0e5b74313ac33d20db2821491d28f87..ce6ecf54a61404a47a4b66ca57c77745b3e4f347 100644 |
--- a/android_webview/browser/browser_view_renderer.cc |
+++ b/android_webview/browser/browser_view_renderer.cc |
@@ -92,7 +92,7 @@ BrowserViewRenderer::BrowserViewRenderer( |
bool disable_page_visibility) |
: client_(client), |
ui_task_runner_(ui_task_runner), |
- render_thread_manager_(nullptr), |
+ compositor_frame_consumer_(nullptr), |
disable_page_visibility_(disable_page_visibility), |
compositor_(NULL), |
is_paused_(false), |
@@ -111,11 +111,23 @@ BrowserViewRenderer::BrowserViewRenderer( |
BrowserViewRenderer::~BrowserViewRenderer() { |
DCHECK(compositor_map_.empty()); |
+ if (compositor_frame_consumer_) { |
+ compositor_frame_consumer_->OnCompositorFrameProducerWillDestroy(); |
boliu
2016/04/21 17:05:39
This seems redundant. Just do SetCompositorFrameCo
Tobias Sargeant
2016/04/21 17:21:12
OK.
Tobias Sargeant
2016/04/21 17:48:27
Done.
|
+ } |
} |
-void BrowserViewRenderer::SetRenderThreadManager( |
- RenderThreadManager* render_thread_manager) { |
- render_thread_manager_ = render_thread_manager; |
+void BrowserViewRenderer::SetCompositorFrameConsumer( |
+ CompositorFrameConsumer* compositor_frame_consumer) { |
+ if (compositor_frame_consumer == compositor_frame_consumer_) { |
+ return; |
+ } |
+ if (compositor_frame_consumer_) { |
+ compositor_frame_consumer_->SetCompositorFrameProducer(nullptr); |
+ } |
+ compositor_frame_consumer_ = compositor_frame_consumer; |
+ if (compositor_frame_consumer_) { |
+ compositor_frame_consumer_->SetCompositorFrameProducer(this); |
+ } |
} |
void BrowserViewRenderer::RegisterWithWebContents( |
@@ -132,8 +144,8 @@ void BrowserViewRenderer::TrimMemory() { |
// TODO(hush): need to setMemoryPolicy to 0 for non-current compositors too. |
// But WebView only has non-current compositors temporarily. So don't have to |
// do it now. |
- if (!offscreen_pre_raster_) |
- ReleaseHardware(); |
+ if (compositor_frame_consumer_ && !offscreen_pre_raster_) |
+ ReleaseHardware(compositor_frame_consumer_); |
boliu
2016/04/21 17:05:39
This code smells bad..
ReleaseHardware "mostly" m
Tobias Sargeant
2016/04/21 17:21:11
Yes. The test for whether there is a consumer shou
Tobias Sargeant
2016/04/21 17:48:27
Done.
|
} |
void BrowserViewRenderer::UpdateMemoryPolicy() { |
@@ -187,22 +199,24 @@ bool BrowserViewRenderer::CanOnDraw() { |
} |
bool BrowserViewRenderer::OnDrawHardware() { |
- DCHECK(render_thread_manager_); |
TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); |
+ if (!compositor_frame_consumer_) { |
boliu
2016/04/21 17:05:39
why did a DCHECK become a null check..? bad code s
Tobias Sargeant
2016/04/21 17:21:12
If RTM is destroyed before BVR, then unless there'
boliu
2016/04/21 17:25:46
hmm, should the gurantee should be that BVRClient
boliu
2016/04/21 18:01:32
No change?
For now at least, RTM is guaranteed to
|
+ return false; |
+ } |
- render_thread_manager_->InitializeHardwareDrawIfNeededOnUI(); |
+ compositor_frame_consumer_->InitializeHardwareDrawIfNeededOnUI(); |
if (!CanOnDraw()) { |
return false; |
} |
- render_thread_manager_->SetScrollOffsetOnUI(last_on_draw_scroll_offset_); |
+ compositor_frame_consumer_->SetScrollOffsetOnUI(last_on_draw_scroll_offset_); |
hardware_enabled_ = true; |
external_draw_constraints_ = |
- render_thread_manager_->GetParentDrawConstraintsOnUI(); |
+ compositor_frame_consumer_->GetParentDrawConstraintsOnUI(); |
- ReturnResourceFromParent(); |
+ ReturnResourceFromParent(compositor_frame_consumer_); |
UpdateMemoryPolicy(); |
gfx::Size surface_size(size_); |
@@ -231,7 +245,7 @@ bool BrowserViewRenderer::OnDrawHardware() { |
if (!frame.frame.get()) { |
TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
TRACE_EVENT_SCOPE_THREAD); |
- hardware_enabled_ = render_thread_manager_->HasFrameOnUI(); |
+ hardware_enabled_ = compositor_frame_consumer_->HasFrameOnUI(); |
if (!hardware_enabled_) |
UpdateMemoryPolicy(); |
return hardware_enabled_; |
@@ -243,19 +257,26 @@ bool BrowserViewRenderer::OnDrawHardware() { |
transform_for_tile_priority, offscreen_pre_raster_, |
external_draw_constraints_.is_layer)); |
- ReturnUnusedResource(render_thread_manager_->PassUncommittedFrameOnUI()); |
- render_thread_manager_->SetFrameOnUI(std::move(child_frame)); |
+ ReturnUnusedResource(compositor_frame_consumer_->PassUncommittedFrameOnUI()); |
+ compositor_frame_consumer_->SetFrameOnUI(std::move(child_frame)); |
return true; |
} |
-void BrowserViewRenderer::OnParentDrawConstraintsUpdated() { |
- DCHECK(render_thread_manager_); |
+void BrowserViewRenderer::OnParentDrawConstraintsUpdated( |
+ CompositorFrameConsumer* compositor_frame_consumer) { |
+ DCHECK(compositor_frame_consumer_ == compositor_frame_consumer); |
boliu
2016/04/21 17:05:39
there is DCHECK_EQ
boliu
2016/04/21 17:07:42
If it's supposed to be 1:many, how are these DCHEC
Tobias Sargeant
2016/04/21 17:21:12
Eventually I was envisaging that we have an active
boliu
2016/04/21 17:25:46
That's fine, but you need to make this CL consiste
Tobias Sargeant
2016/04/21 17:48:27
Done.
|
PostInvalidate(); |
external_draw_constraints_ = |
- render_thread_manager_->GetParentDrawConstraintsOnUI(); |
+ compositor_frame_consumer_->GetParentDrawConstraintsOnUI(); |
UpdateMemoryPolicy(); |
} |
+void BrowserViewRenderer::OnCompositorFrameConsumerWillDestroy( |
+ CompositorFrameConsumer* compositor_frame_consumer) { |
+ DCHECK(compositor_frame_consumer_ == compositor_frame_consumer); |
+ compositor_frame_consumer_ = nullptr; |
boliu
2016/04/21 17:05:39
SetCompositorFrameConsumer(nullptr)
Tobias Sargeant
2016/04/21 17:48:27
Done.
|
+} |
+ |
void BrowserViewRenderer::ReturnUnusedResource( |
std::unique_ptr<ChildFrame> child_frame) { |
if (!child_frame.get() || !child_frame->frame.get()) |
@@ -271,10 +292,10 @@ void BrowserViewRenderer::ReturnUnusedResource( |
compositor->ReturnResources(child_frame->output_surface_id, frame_ack); |
} |
-void BrowserViewRenderer::ReturnResourceFromParent() { |
- DCHECK(render_thread_manager_); |
- RenderThreadManager::ReturnedResourcesMap returned_resource_map; |
- render_thread_manager_->SwapReturnedResourcesOnUI(&returned_resource_map); |
+void BrowserViewRenderer::ReturnResourceFromParent( |
+ CompositorFrameConsumer* compositor_frame_consumer) { |
+ CompositorFrameConsumer::ReturnedResourcesMap returned_resource_map; |
+ compositor_frame_consumer->SwapReturnedResourcesOnUI(&returned_resource_map); |
for (auto iterator = returned_resource_map.begin(); |
iterator != returned_resource_map.end(); iterator++) { |
uint32_t compositor_id = iterator->first; |
@@ -401,7 +422,9 @@ void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { |
void BrowserViewRenderer::OnDetachedFromWindow() { |
TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); |
attached_to_window_ = false; |
- ReleaseHardware(); |
+ if (compositor_frame_consumer_) { |
boliu
2016/04/21 17:05:39
ditto
Tobias Sargeant
2016/04/21 17:48:27
Done.
|
+ ReleaseHardware(compositor_frame_consumer_); |
+ } |
UpdateCompositorIsActive(); |
} |
@@ -419,10 +442,11 @@ void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) { |
compositor_->OnComputeScroll(animation_time); |
} |
-void BrowserViewRenderer::ReleaseHardware() { |
- ReturnUnusedResource(render_thread_manager_->PassUncommittedFrameOnUI()); |
- ReturnResourceFromParent(); |
- DCHECK(render_thread_manager_->ReturnedResourcesEmptyOnUI()); |
+void BrowserViewRenderer::ReleaseHardware( |
+ CompositorFrameConsumer* compositor_frame_consumer) { |
+ ReturnUnusedResource(compositor_frame_consumer->PassUncommittedFrameOnUI()); |
+ ReturnResourceFromParent(compositor_frame_consumer); |
+ DCHECK(compositor_frame_consumer->ReturnedResourcesEmptyOnUI()); |
hardware_enabled_ = false; |
UpdateMemoryPolicy(); |
} |