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_); |