Index: content/renderer/gpu/renderer_compositor_frame_sink.cc |
diff --git a/content/renderer/gpu/renderer_compositor_frame_sink.cc b/content/renderer/gpu/renderer_compositor_frame_sink.cc |
index 1d28f324497bc78f811a05d4e46036e2863a8043..77a5d205a36d8961caaf69c39f2f46baaacb8146 100644 |
--- a/content/renderer/gpu/renderer_compositor_frame_sink.cc |
+++ b/content/renderer/gpu/renderer_compositor_frame_sink.cc |
@@ -28,6 +28,7 @@ namespace content { |
RendererCompositorFrameSink::RendererCompositorFrameSink( |
int32_t routing_id, |
+ uint32_t compositor_frame_sink_id, |
std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, |
scoped_refptr<cc::ContextProvider> context_provider, |
scoped_refptr<cc::ContextProvider> worker_context_provider, |
@@ -38,6 +39,7 @@ RendererCompositorFrameSink::RendererCompositorFrameSink( |
std::move(worker_context_provider), |
gpu_memory_buffer_manager, |
shared_bitmap_manager), |
+ compositor_frame_sink_id_(compositor_frame_sink_id), |
compositor_frame_sink_filter_( |
RenderThreadImpl::current()->compositor_message_filter()), |
message_sender_(RenderThreadImpl::current()->sync_message_filter()), |
@@ -47,21 +49,21 @@ RendererCompositorFrameSink::RendererCompositorFrameSink( |
synthetic_begin_frame_source_ |
? nullptr |
: base::MakeUnique<cc::ExternalBeginFrameSource>(this)), |
- routing_id_(routing_id), |
- sink_client_binding_(this) { |
+ routing_id_(routing_id) { |
DCHECK(compositor_frame_sink_filter_); |
DCHECK(frame_swap_message_queue_); |
DCHECK(message_sender_); |
thread_checker_.DetachFromThread(); |
- EstablishMojoConnection(); |
} |
RendererCompositorFrameSink::RendererCompositorFrameSink( |
int32_t routing_id, |
+ uint32_t compositor_frame_sink_id, |
std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, |
scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, |
scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) |
: CompositorFrameSink(std::move(vulkan_context_provider)), |
+ compositor_frame_sink_id_(compositor_frame_sink_id), |
compositor_frame_sink_filter_( |
RenderThreadImpl::current()->compositor_message_filter()), |
message_sender_(RenderThreadImpl::current()->sync_message_filter()), |
@@ -71,13 +73,11 @@ RendererCompositorFrameSink::RendererCompositorFrameSink( |
synthetic_begin_frame_source_ |
? nullptr |
: base::MakeUnique<cc::ExternalBeginFrameSource>(this)), |
- routing_id_(routing_id), |
- sink_client_binding_(this) { |
+ routing_id_(routing_id) { |
DCHECK(compositor_frame_sink_filter_); |
DCHECK(frame_swap_message_queue_); |
DCHECK(message_sender_); |
thread_checker_.DetachFromThread(); |
- EstablishMojoConnection(); |
} |
RendererCompositorFrameSink::~RendererCompositorFrameSink() { |
@@ -92,9 +92,6 @@ bool RendererCompositorFrameSink::BindToClient( |
if (!cc::CompositorFrameSink::BindToClient(client)) |
return false; |
- sink_.Bind(std::move(sink_ptr_info_)); |
- sink_client_binding_.Bind(std::move(sink_client_request_)); |
- |
if (synthetic_begin_frame_source_) |
client_->SetBeginFrameSource(synthetic_begin_frame_source_.get()); |
else |
@@ -106,7 +103,6 @@ bool RendererCompositorFrameSink::BindToClient( |
compositor_frame_sink_proxy_); |
compositor_frame_sink_filter_->AddHandlerOnCompositorThread( |
routing_id_, compositor_frame_sink_filter_handler_); |
- |
bound_ = true; |
return true; |
} |
@@ -121,8 +117,7 @@ void RendererCompositorFrameSink::DetachFromClient() { |
compositor_frame_sink_proxy_->ClearCompositorFrameSink(); |
compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( |
routing_id_, compositor_frame_sink_filter_handler_); |
- sink_.reset(); |
- sink_client_binding_.Close(); |
+ |
cc::CompositorFrameSink::DetachFromClient(); |
bound_ = false; |
} |
@@ -148,10 +143,11 @@ void RendererCompositorFrameSink::SubmitCompositorFrame( |
if (!messages_to_send.empty()) |
frame_token = frame_swap_message_queue_->AllocateFrameToken(); |
frame.metadata.frame_token = frame_token; |
- sink_->SubmitCompositorFrame(local_surface_id_, std::move(frame)); |
+ Send(new ViewHostMsg_SwapCompositorFrame( |
+ routing_id_, compositor_frame_sink_id_, local_surface_id_, frame)); |
if (frame_token) { |
- message_sender_->Send(new ViewHostMsg_FrameSwapMessages( |
- routing_id_, frame_token, messages_to_send)); |
+ Send(new ViewHostMsg_FrameSwapMessages(routing_id_, frame_token, |
+ messages_to_send)); |
} |
// ~send_message_scope. |
} |
@@ -161,16 +157,41 @@ void RendererCompositorFrameSink::OnMessageReceived( |
const IPC::Message& message) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message) |
- IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrameIPC) |
+ IPC_MESSAGE_HANDLER(ViewMsg_ReclaimCompositorResources, |
+ OnReclaimCompositorResources) |
+ IPC_MESSAGE_HANDLER(ViewMsg_SetBeginFramePaused, |
+ OnSetBeginFrameSourcePaused) |
+ IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrame) |
IPC_END_MESSAGE_MAP() |
} |
-void RendererCompositorFrameSink::OnBeginFrameIPC( |
- const cc::BeginFrameArgs& args) { |
+void RendererCompositorFrameSink::OnReclaimCompositorResources( |
+ uint32_t compositor_frame_sink_id, |
+ bool is_swap_ack, |
+ const cc::ReturnedResourceArray& resources) { |
+ // Ignore message if it's a stale one coming from a different output surface |
+ // (e.g. after a lost context). |
+ if (compositor_frame_sink_id != compositor_frame_sink_id_) |
+ return; |
+ client_->ReclaimResources(resources); |
+ if (is_swap_ack) |
+ client_->DidReceiveCompositorFrameAck(); |
+} |
+ |
+void RendererCompositorFrameSink::OnSetBeginFrameSourcePaused(bool paused) { |
+ if (external_begin_frame_source_) |
+ external_begin_frame_source_->OnSetBeginFrameSourcePaused(paused); |
+} |
+ |
+void RendererCompositorFrameSink::OnBeginFrame(const cc::BeginFrameArgs& args) { |
if (external_begin_frame_source_) |
external_begin_frame_source_->OnBeginFrame(args); |
} |
+bool RendererCompositorFrameSink::Send(IPC::Message* message) { |
+ return message_sender_->Send(message); |
+} |
+ |
bool RendererCompositorFrameSink::ShouldAllocateNewLocalSurfaceId( |
const cc::CompositorFrame& frame) { |
cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
@@ -218,24 +239,8 @@ void RendererCompositorFrameSink::UpdateFrameData( |
#endif |
} |
-void RendererCompositorFrameSink::DidReceiveCompositorFrameAck( |
- const cc::ReturnedResourceArray& resources) { |
- ReclaimResources(resources); |
- client_->DidReceiveCompositorFrameAck(); |
-} |
- |
-void RendererCompositorFrameSink::OnBeginFrame(const cc::BeginFrameArgs& args) { |
- // See crbug.com/709689. |
- NOTREACHED() << "BeginFrames are delivered using Chrome IPC."; |
-} |
- |
-void RendererCompositorFrameSink::ReclaimResources( |
- const cc::ReturnedResourceArray& resources) { |
- client_->ReclaimResources(resources); |
-} |
- |
void RendererCompositorFrameSink::OnNeedsBeginFrames(bool needs_begin_frames) { |
- sink_->SetNeedsBeginFrame(needs_begin_frames); |
+ Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, needs_begin_frames)); |
} |
void RendererCompositorFrameSink::OnDidFinishFrame( |
@@ -243,18 +248,7 @@ void RendererCompositorFrameSink::OnDidFinishFrame( |
DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); |
// If there was damage, ViewHostMsg_SwapCompositorFrame includes the ack. |
if (!ack.has_damage) |
- sink_->BeginFrameDidNotSwap(ack); |
-} |
- |
-void RendererCompositorFrameSink::EstablishMojoConnection() { |
- cc::mojom::MojoCompositorFrameSinkPtr sink; |
- cc::mojom::MojoCompositorFrameSinkRequest sink_request = |
- mojo::MakeRequest(&sink); |
- cc::mojom::MojoCompositorFrameSinkClientPtr sink_client; |
- sink_client_request_ = mojo::MakeRequest(&sink_client); |
- RenderThreadImpl::current()->GetFrameSinkProvider()->CreateForWidget( |
- routing_id_, std::move(sink_request), std::move(sink_client)); |
- sink_ptr_info_ = sink.PassInterface(); |
+ Send(new ViewHostMsg_BeginFrameDidNotSwap(routing_id_, ack)); |
} |
} // namespace content |