| 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
|
|
|