| 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 4a2c3b2b7226ce0ee7c13e9c26b7b323088166b8..ffd64e3ec8a2824500e57437ad939966c5c3e87a 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/local_surface_id_allocator.h"
|
| #include "cc/surfaces/surface.h"
|
| #include "cc/surfaces/surface_factory.h"
|
| @@ -49,7 +50,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),
|
| @@ -60,12 +60,9 @@ DelegatedFrameHost::DelegatedFrameHost(const cc::FrameSinkId& frame_sink_id,
|
| id_allocator_.reset(new cc::LocalSurfaceIdAllocator());
|
| 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);
|
| + CreateCompositorFrameSinkSupport();
|
| + begin_frame_source_ = base::MakeUnique<cc::ExternalBeginFrameSource>(this);
|
| + client_->SetBeginFrameSource(begin_frame_source_.get());
|
| }
|
|
|
| void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) {
|
| @@ -379,7 +376,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));
|
| @@ -439,11 +436,10 @@ 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();
|
| + ResetCompositorFrameSinkSupport();
|
| + CreateCompositorFrameSinkSupport();
|
| last_compositor_frame_sink_id_ = compositor_frame_sink_id;
|
| }
|
| - pending_delegated_ack_count_++;
|
|
|
| background_color_ = frame.metadata.root_background_color;
|
|
|
| @@ -474,10 +470,8 @@ void DelegatedFrameHost::SwapDelegatedFrame(uint32_t compositor_frame_sink_id,
|
| skipped_latency_info_list_.clear();
|
| }
|
|
|
| - auto 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_);
|
| @@ -515,33 +509,16 @@ void DelegatedFrameHost::ClearDelegatedFrame() {
|
| EvictDelegatedFrame();
|
| }
|
|
|
| -void DelegatedFrameHost::SendReclaimCompositorResources(
|
| - uint32_t compositor_frame_sink_id,
|
| - bool is_swap_ack) {
|
| +void DelegatedFrameHost::DidReceiveCompositorFrameAck() {
|
| 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 */);
|
| - }
|
| + client_->DelegatedFrameHostSendReclaimCompositorResources(
|
| + last_compositor_frame_sink_id_, false /* is_swap_ack */, resources);
|
| }
|
|
|
| void DelegatedFrameHost::WillDrawSurface(const cc::LocalSurfaceId& id,
|
| @@ -555,15 +532,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();
|
| @@ -797,10 +773,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();
|
| + ResetCompositorFrameSinkSupport();
|
| +
|
| factory->GetContextFactoryPrivate()
|
| ->GetSurfaceManager()
|
| ->InvalidateFrameSinkId(frame_sink_id_);
|
| @@ -859,4 +835,33 @@ 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) {}
|
| +
|
| +void DelegatedFrameHost::CreateCompositorFrameSinkSupport() {
|
| + DCHECK(!support_);
|
| + ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
|
| + support_ = base::MakeUnique<cc::CompositorFrameSinkSupport>(
|
| + this, factory->GetContextFactoryPrivate()->GetSurfaceManager(),
|
| + frame_sink_id_, false /* is_root */,
|
| + false /* handles_frame_sink_id_invalidation */,
|
| + true /* needs_sync_points */);
|
| + if (compositor_)
|
| + compositor_->AddFrameSink(frame_sink_id_);
|
| + if (needs_begin_frame_)
|
| + support_->SetNeedsBeginFrame(true);
|
| +}
|
| +
|
| +void DelegatedFrameHost::ResetCompositorFrameSinkSupport() {
|
| + if (!support_)
|
| + return;
|
| + if (compositor_)
|
| + compositor_->RemoveFrameSink(frame_sink_id_);
|
| + support_.reset();
|
| +}
|
| +
|
| } // namespace content
|
|
|