Chromium Code Reviews| Index: content/browser/android/synchronous_compositor_host.cc |
| diff --git a/content/browser/android/synchronous_compositor_host.cc b/content/browser/android/synchronous_compositor_host.cc |
| index 6cb4907973b1ba8afb46db17d29d55ef56cd004b..36c9500d91889da0a36229a710042c54faa4950b 100644 |
| --- a/content/browser/android/synchronous_compositor_host.cc |
| +++ b/content/browser/android/synchronous_compositor_host.cc |
| @@ -42,6 +42,7 @@ SynchronousCompositorHost::SynchronousCompositorHost( |
| use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), |
| is_active_(false), |
| bytes_limit_(0u), |
| + output_surface_id_from_last_draw_(0u), |
| root_scroll_offset_updated_by_browser_(false), |
| renderer_param_version_(0u), |
| need_animate_scroll_(false), |
| @@ -72,7 +73,7 @@ void SynchronousCompositorHost::DidBecomeCurrent() { |
| client_->DidBecomeCurrent(this); |
| } |
| -scoped_ptr<cc::CompositorFrame> SynchronousCompositorHost::DemandDrawHw( |
| +SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw( |
| const gfx::Size& surface_size, |
| const gfx::Transform& transform, |
| const gfx::Rect& viewport, |
| @@ -82,22 +83,27 @@ scoped_ptr<cc::CompositorFrame> SynchronousCompositorHost::DemandDrawHw( |
| SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport, |
| clip, viewport_rect_for_tile_priority, |
| transform_for_tile_priority); |
| - scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
| + SynchronousCompositor::Frame frame; |
| + frame.frame.reset(new cc::CompositorFrame); |
| SyncCompositorCommonBrowserParams common_browser_params; |
| PopulateCommonParams(&common_browser_params); |
| SyncCompositorCommonRendererParams common_renderer_params; |
| if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( |
| routing_id_, common_browser_params, params, &common_renderer_params, |
| - frame.get()))) { |
| - return nullptr; |
| + &frame.output_surface_id, frame.frame.get()))) { |
| + return SynchronousCompositor::Frame(); |
| } |
| ProcessCommonParams(common_renderer_params); |
| - if (!frame->delegated_frame_data) { |
| + if (!frame.frame->delegated_frame_data) { |
| // This can happen if compositor did not swap in this draw. |
| - frame.reset(); |
| + frame.frame.reset(); |
| + } |
| + if (frame.frame) { |
| + UpdateFrameMetaData(frame.frame->metadata); |
| + if (output_surface_id_from_last_draw_ != frame.output_surface_id) |
| + returned_resources_.clear(); |
| + output_surface_id_from_last_draw_ = frame.output_surface_id; |
| } |
| - if (frame) |
| - UpdateFrameMetaData(frame->metadata); |
| return frame; |
| } |
| @@ -269,7 +275,10 @@ void SynchronousCompositorHost::SendZeroMemory() { |
| } |
| void SynchronousCompositorHost::ReturnResources( |
| + uint32_t output_surface_id, |
| const cc::CompositorFrameAck& frame_ack) { |
| + if (output_surface_id_from_last_draw_ != output_surface_id) |
|
no sievers
2016/03/21 19:56:12
nit: maybe worth a comment saying that in that cas
boliu
2016/03/21 21:35:49
Done.
|
| + return; |
| returned_resources_.insert(returned_resources_.end(), |
| frame_ack.resources.begin(), |
| frame_ack.resources.end()); |
| @@ -389,6 +398,8 @@ void SynchronousCompositorHost::PopulateCommonParams( |
| DCHECK(params); |
| DCHECK(params->ack.resources.empty()); |
| params->bytes_limit = bytes_limit_; |
| + params->output_surface_id_for_returned_resources = |
| + output_surface_id_from_last_draw_; |
| params->ack.resources.swap(returned_resources_); |
| if (root_scroll_offset_updated_by_browser_) { |
| params->root_scroll_offset = root_scroll_offset_; |