Chromium Code Reviews| Index: content/browser/renderer_host/delegated_frame_host.cc |
| diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc |
| index 3539e0a3c70ef9e0804132f549bb8b508e6fddfd..d2fec22cc14f71641b91c33b6dd8c9976a3f149f 100644 |
| --- a/content/browser/renderer_host/delegated_frame_host.cc |
| +++ b/content/browser/renderer_host/delegated_frame_host.cc |
| @@ -18,6 +18,7 @@ |
| #include "cc/output/copy_output_request.h" |
| #include "cc/resources/single_release_callback.h" |
| #include "cc/resources/texture_mailbox.h" |
| +#include "cc/surfaces/compositor_frame_sink_support.h" |
| #include "cc/surfaces/surface.h" |
| #include "cc/surfaces/surface_factory.h" |
| #include "cc/surfaces/surface_hittest.h" |
| @@ -48,7 +49,6 @@ DelegatedFrameHost::DelegatedFrameHost(const cc::FrameSinkId& frame_sink_id, |
| compositor_(nullptr), |
| tick_clock_(new base::DefaultTickClock()), |
| last_compositor_frame_sink_id_(0), |
| - pending_delegated_ack_count_(0), |
| skipped_frames_(false), |
| background_color_(SK_ColorRED), |
| current_scale_factor_(1.f), |
| @@ -59,12 +59,13 @@ DelegatedFrameHost::DelegatedFrameHost(const cc::FrameSinkId& frame_sink_id, |
| id_allocator_.reset(new cc::SurfaceIdAllocator()); |
| factory->GetContextFactoryPrivate()->GetSurfaceManager()->RegisterFrameSinkId( |
| frame_sink_id_); |
| - factory->GetContextFactoryPrivate() |
| - ->GetSurfaceManager() |
| - ->RegisterSurfaceFactoryClient(frame_sink_id_, this); |
| - surface_factory_ = base::MakeUnique<cc::SurfaceFactory>( |
| - frame_sink_id_, factory->GetContextFactoryPrivate()->GetSurfaceManager(), |
| - this); |
| + support_ = base::MakeUnique<cc::CompositorFrameSinkSupport>( |
|
Fady Samuel
2017/02/23 18:32:40
Maybe we can move creating a support to a helper m
Saman Sami
2017/02/23 18:34:40
Acknowledged.
|
| + this, factory->GetContextFactoryPrivate()->GetSurfaceManager(), |
| + frame_sink_id_, false /* is_root */, |
| + false /* handles_frame_sink_id_invalidation */, |
| + true /* needs_sync_points */); |
| + begin_frame_source_ = base::MakeUnique<cc::ExternalBeginFrameSource>(this); |
| + client_->SetBeginFrameSource(begin_frame_source_.get()); |
| } |
| void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { |
| @@ -378,7 +379,7 @@ void DelegatedFrameHost::AttemptFrameSubscriberCapture( |
| if (!request_copy_of_output_callback_for_testing_.is_null()) |
| request_copy_of_output_callback_for_testing_.Run(std::move(request)); |
| else |
| - surface_factory_->RequestCopyOfSurface(std::move(request)); |
| + support_->RequestCopyOfSurface(std::move(request)); |
| } else { |
| request->set_area(gfx::Rect(current_frame_size_in_dip_)); |
| RequestCopyOfOutput(std::move(request)); |
| @@ -438,12 +439,26 @@ void DelegatedFrameHost::SwapDelegatedFrame(uint32_t compositor_frame_sink_id, |
| // have the same id. Changing the layer to showing painted content destroys |
| // the DelegatedRendererLayer. |
| EvictDelegatedFrame(); |
| - surface_factory_->Reset(); |
| - surface_returned_resources_.clear(); |
| + DCHECK(support_); |
| + support_.reset(); |
| + support_ = base::MakeUnique<cc::CompositorFrameSinkSupport>( |
| + this, |
| + ImageTransportFactory::GetInstance() |
| + ->GetContextFactoryPrivate() |
| + ->GetSurfaceManager(), |
| + frame_sink_id_, false /* is_root */, |
| + false /* handles_frame_sink_id_invalidation */, |
| + true /* needs_sync_points */); |
| + if (compositor_) { |
| + compositor_->RemoveFrameSink(frame_sink_id_); |
|
Fady Samuel
2017/02/23 18:32:40
Remind me why you remove the FrameSink first and t
Saman Sami
2017/02/23 18:34:40
The link already exists. We need to remove and re-
|
| + compositor_->AddFrameSink(frame_sink_id_); |
| + } |
| + if (needs_begin_frame_) |
| + support_->SetNeedsBeginFrame(true); |
| last_compositor_frame_sink_id_ = compositor_frame_sink_id; |
| } |
| + |
| bool skip_frame = false; |
| - pending_delegated_ack_count_++; |
| background_color_ = frame.metadata.root_background_color; |
| @@ -475,13 +490,8 @@ void DelegatedFrameHost::SwapDelegatedFrame(uint32_t compositor_frame_sink_id, |
| skipped_latency_info_list_.clear(); |
| } |
| - cc::SurfaceFactory::DrawCallback ack_callback; |
| - if (!skip_frame) { |
| - ack_callback = base::Bind(&DelegatedFrameHost::SurfaceDrawn, AsWeakPtr(), |
| - compositor_frame_sink_id); |
| - } |
| - surface_factory_->SubmitCompositorFrame(local_surface_id_, std::move(frame), |
| - ack_callback); |
| + support_->SubmitCompositorFrame(local_surface_id_, std::move(frame)); |
| + |
| if (allocated_new_local_surface_id) { |
| // manager must outlive compositors using it. |
| cc::SurfaceId surface_id(frame_sink_id_, local_surface_id_); |
| @@ -504,11 +514,6 @@ void DelegatedFrameHost::SwapDelegatedFrame(uint32_t compositor_frame_sink_id, |
| damage_rect_in_dip); |
| } |
| - if (skip_frame) { |
| - SendReclaimCompositorResources(compositor_frame_sink_id, |
| - true /* is_swap_ack */); |
| - } |
| - |
| if (compositor_ && !skip_frame) |
| can_lock_compositor_ = NO_PENDING_COMMIT; |
| @@ -524,33 +529,18 @@ void DelegatedFrameHost::ClearDelegatedFrame() { |
| EvictDelegatedFrame(); |
| } |
| -void DelegatedFrameHost::SendReclaimCompositorResources( |
| - uint32_t compositor_frame_sink_id, |
| - bool is_swap_ack) { |
| +void DelegatedFrameHost::DidReceiveCompositorFrameAck() { |
| + LOG(ERROR) << "Ack"; |
| client_->DelegatedFrameHostSendReclaimCompositorResources( |
| - compositor_frame_sink_id, is_swap_ack, surface_returned_resources_); |
| - surface_returned_resources_.clear(); |
| - if (is_swap_ack) { |
| - DCHECK_GT(pending_delegated_ack_count_, 0); |
| - pending_delegated_ack_count_--; |
| - } |
| -} |
| - |
| -void DelegatedFrameHost::SurfaceDrawn(uint32_t compositor_frame_sink_id) { |
| - SendReclaimCompositorResources(compositor_frame_sink_id, |
| - true /* is_swap_ack */); |
| + last_compositor_frame_sink_id_, true /* is_swap_ack */, |
| + cc::ReturnedResourceArray()); |
| } |
| -void DelegatedFrameHost::ReturnResources( |
| +void DelegatedFrameHost::ReclaimResources( |
| const cc::ReturnedResourceArray& resources) { |
| - if (resources.empty()) |
| - return; |
| - std::copy(resources.begin(), resources.end(), |
| - std::back_inserter(surface_returned_resources_)); |
| - if (!pending_delegated_ack_count_) { |
| - SendReclaimCompositorResources(last_compositor_frame_sink_id_, |
| - false /* is_swap_ack */); |
| - } |
| + LOG(ERROR) << resources.size(); |
| + client_->DelegatedFrameHostSendReclaimCompositorResources( |
| + last_compositor_frame_sink_id_, false /* is_swap_ack */, resources); |
| } |
| void DelegatedFrameHost::WillDrawSurface(const cc::LocalSurfaceId& id, |
| @@ -564,15 +554,14 @@ void DelegatedFrameHost::WillDrawSurface(const cc::LocalSurfaceId& id, |
| AttemptFrameSubscriberCapture(damage_rect); |
| } |
| -void DelegatedFrameHost::SetBeginFrameSource( |
| - cc::BeginFrameSource* begin_frame_source) { |
| - client_->SetBeginFrameSource(begin_frame_source); |
| +void DelegatedFrameHost::OnBeginFrame(const cc::BeginFrameArgs& args) { |
| + begin_frame_source_->OnBeginFrame(args); |
| } |
| void DelegatedFrameHost::EvictDelegatedFrame() { |
| client_->DelegatedFrameHostGetLayer()->SetShowSolidColorContent(); |
| if (local_surface_id_.is_valid()) { |
| - surface_factory_->EvictSurface(); |
| + support_->EvictFrame(); |
| local_surface_id_ = cc::LocalSurfaceId(); |
| } |
| delegated_frame_evictor_->DiscardedFrame(); |
| @@ -806,10 +795,10 @@ DelegatedFrameHost::~DelegatedFrameHost() { |
| DCHECK(!compositor_); |
| ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| factory->GetContextFactory()->RemoveObserver(this); |
| - surface_factory_->EvictSurface(); |
| - factory->GetContextFactoryPrivate() |
| - ->GetSurfaceManager() |
| - ->UnregisterSurfaceFactoryClient(frame_sink_id_); |
| + |
| + begin_frame_source_.reset(); |
| + support_.reset(); |
| + |
| factory->GetContextFactoryPrivate() |
| ->GetSurfaceManager() |
| ->InvalidateFrameSinkId(frame_sink_id_); |
| @@ -868,4 +857,11 @@ void DelegatedFrameHost::UnlockResources() { |
| delegated_frame_evictor_->UnlockFrame(); |
| } |
| +void DelegatedFrameHost::OnNeedsBeginFrames(bool needs_begin_frames) { |
| + needs_begin_frame_ = needs_begin_frames; |
| + support_->SetNeedsBeginFrame(needs_begin_frames); |
| +} |
| + |
| +void DelegatedFrameHost::OnDidFinishFrame(const cc::BeginFrameAck& ack) {} |
| + |
| } // namespace content |