| 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 9505792fd0c14a225865dafd7ca08cd099daf730..840d3a4b6cd0de7497cb37b6e50f9534dbf89efa 100644
|
| --- a/content/browser/renderer_host/delegated_frame_host.cc
|
| +++ b/content/browser/renderer_host/delegated_frame_host.cc
|
| @@ -396,8 +396,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(local_frame_id_,
|
| - std::move(request));
|
| + surface_factory_->RequestCopyOfSurface(std::move(request));
|
| } else {
|
| request->set_area(gfx::Rect(current_frame_size_in_dip_));
|
| RequestCopyOfOutput(std::move(request));
|
| @@ -470,26 +469,18 @@ void DelegatedFrameHost::SwapDelegatedFrame(uint32_t compositor_frame_sink_id,
|
|
|
| background_color_ = frame.metadata.root_background_color;
|
|
|
| + bool did_send_ack_callback = false;
|
| if (frame_size.IsEmpty()) {
|
| DCHECK(frame.resource_list.empty());
|
| EvictDelegatedFrame();
|
| } else {
|
| ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
|
| cc::SurfaceManager* manager = factory->GetSurfaceManager();
|
| + bool allocated_new_local_frame_id = false;
|
| if (!local_frame_id_.is_valid() || frame_size != current_surface_size_ ||
|
| frame_size_in_dip != current_frame_size_in_dip_) {
|
| - if (local_frame_id_.is_valid())
|
| - surface_factory_->Destroy(local_frame_id_);
|
| local_frame_id_ = id_allocator_->GenerateId();
|
| - surface_factory_->Create(local_frame_id_);
|
| - // manager must outlive compositors using it.
|
| - client_->DelegatedFrameHostGetLayer()->SetShowSurface(
|
| - cc::SurfaceId(frame_sink_id_, local_frame_id_),
|
| - base::Bind(&SatisfyCallback, base::Unretained(manager)),
|
| - base::Bind(&RequireCallback, base::Unretained(manager)), frame_size,
|
| - frame_device_scale_factor, frame_size_in_dip);
|
| - current_surface_size_ = frame_size;
|
| - current_scale_factor_ = frame_device_scale_factor;
|
| + allocated_new_local_frame_id = true;
|
| }
|
|
|
| gfx::Size desired_size = client_->DelegatedFrameHostDesiredSizeInDIP();
|
| @@ -510,9 +501,20 @@ void DelegatedFrameHost::SwapDelegatedFrame(uint32_t compositor_frame_sink_id,
|
| if (compositor_ && !skip_frame) {
|
| ack_callback = base::Bind(&DelegatedFrameHost::SurfaceDrawn, AsWeakPtr(),
|
| compositor_frame_sink_id);
|
| + did_send_ack_callback = true;
|
| }
|
| surface_factory_->SubmitCompositorFrame(local_frame_id_, std::move(frame),
|
| ack_callback);
|
| + if (allocated_new_local_frame_id) {
|
| + // manager must outlive compositors using it.
|
| + client_->DelegatedFrameHostGetLayer()->SetShowSurface(
|
| + cc::SurfaceId(frame_sink_id_, local_frame_id_),
|
| + base::Bind(&SatisfyCallback, base::Unretained(manager)),
|
| + base::Bind(&RequireCallback, base::Unretained(manager)), frame_size,
|
| + frame_device_scale_factor, frame_size_in_dip);
|
| + current_surface_size_ = frame_size;
|
| + current_scale_factor_ = frame_device_scale_factor;
|
| + }
|
| }
|
| released_front_lock_ = NULL;
|
| current_frame_size_in_dip_ = frame_size_in_dip;
|
| @@ -529,7 +531,7 @@ void DelegatedFrameHost::SwapDelegatedFrame(uint32_t compositor_frame_sink_id,
|
| // SetShowDelegatedContent above.
|
| if (!compositor_ || skip_frame) {
|
| SendReclaimCompositorResources(compositor_frame_sink_id,
|
| - true /* is_swap_ack */);
|
| + !did_send_ack_callback /* is_swap_ack */);
|
| } else {
|
| can_lock_compositor_ = NO_PENDING_COMMIT;
|
| }
|
| @@ -593,7 +595,7 @@ void DelegatedFrameHost::SetBeginFrameSource(
|
| void DelegatedFrameHost::EvictDelegatedFrame() {
|
| client_->DelegatedFrameHostGetLayer()->SetShowSolidColorContent();
|
| if (local_frame_id_.is_valid()) {
|
| - surface_factory_->Destroy(local_frame_id_);
|
| + surface_factory_->EvictSurface();
|
| local_frame_id_ = cc::LocalFrameId();
|
| }
|
| delegated_frame_evictor_->DiscardedFrame();
|
| @@ -827,9 +829,7 @@ DelegatedFrameHost::~DelegatedFrameHost() {
|
| DCHECK(!compositor_);
|
| ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
|
| factory->GetContextFactory()->RemoveObserver(this);
|
| -
|
| - if (local_frame_id_.is_valid())
|
| - surface_factory_->Destroy(local_frame_id_);
|
| + surface_factory_->EvictSurface();
|
| factory->GetSurfaceManager()->UnregisterSurfaceFactoryClient(frame_sink_id_);
|
| factory->GetSurfaceManager()->InvalidateFrameSinkId(frame_sink_id_);
|
|
|
|
|