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 |