Chromium Code Reviews| 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 11e1c8207e263b12032d694eb8484b81c58b2cfd..39d110095b06863794d33c8741f0854a801c16eb 100644 |
| --- a/content/renderer/gpu/renderer_compositor_frame_sink.cc |
| +++ b/content/renderer/gpu/renderer_compositor_frame_sink.cc |
| @@ -29,7 +29,7 @@ namespace content { |
| RendererCompositorFrameSink::RendererCompositorFrameSink( |
| int32_t routing_id, |
| uint32_t compositor_frame_sink_id, |
| - std::unique_ptr<cc::BeginFrameSource> begin_frame_source, |
| + std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, |
| scoped_refptr<cc::ContextProvider> context_provider, |
| scoped_refptr<cc::ContextProvider> worker_context_provider, |
| gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| @@ -44,19 +44,22 @@ RendererCompositorFrameSink::RendererCompositorFrameSink( |
| RenderThreadImpl::current()->compositor_message_filter()), |
| message_sender_(RenderThreadImpl::current()->sync_message_filter()), |
| frame_swap_message_queue_(swap_frame_message_queue), |
| - begin_frame_source_(std::move(begin_frame_source)), |
| + synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)), |
| + external_begin_frame_source_( |
| + synthetic_begin_frame_source_ |
| + ? nullptr |
| + : base::MakeUnique<cc::ExternalBeginFrameSource>(this)), |
| routing_id_(routing_id) { |
| DCHECK(compositor_frame_sink_filter_); |
| DCHECK(frame_swap_message_queue_); |
| DCHECK(message_sender_); |
| - DCHECK(begin_frame_source_); |
| thread_checker_.DetachFromThread(); |
| } |
| RendererCompositorFrameSink::RendererCompositorFrameSink( |
| int32_t routing_id, |
| uint32_t compositor_frame_sink_id, |
| - std::unique_ptr<cc::BeginFrameSource> begin_frame_source, |
| + 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)), |
| @@ -65,12 +68,15 @@ RendererCompositorFrameSink::RendererCompositorFrameSink( |
| RenderThreadImpl::current()->compositor_message_filter()), |
| message_sender_(RenderThreadImpl::current()->sync_message_filter()), |
| frame_swap_message_queue_(swap_frame_message_queue), |
| - begin_frame_source_(std::move(begin_frame_source)), |
| + synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)), |
| + external_begin_frame_source_( |
| + synthetic_begin_frame_source_ |
| + ? nullptr |
| + : base::MakeUnique<cc::ExternalBeginFrameSource>(this)), |
| routing_id_(routing_id) { |
| DCHECK(compositor_frame_sink_filter_); |
| DCHECK(frame_swap_message_queue_); |
| DCHECK(message_sender_); |
| - DCHECK(begin_frame_source_); |
| thread_checker_.DetachFromThread(); |
| } |
| @@ -86,8 +92,10 @@ bool RendererCompositorFrameSink::BindToClient( |
| if (!cc::CompositorFrameSink::BindToClient(client)) |
| return false; |
| - DCHECK(begin_frame_source_); |
| - client_->SetBeginFrameSource(begin_frame_source_.get()); |
| + if (synthetic_begin_frame_source_) |
| + client_->SetBeginFrameSource(synthetic_begin_frame_source_.get()); |
| + else |
| + client_->SetBeginFrameSource(external_begin_frame_source_.get()); |
| compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this); |
| compositor_frame_sink_filter_handler_ = |
| @@ -104,7 +112,8 @@ void RendererCompositorFrameSink::DetachFromClient() { |
| client_->SetBeginFrameSource(nullptr); |
| // Destroy the begin frame source on the same thread it was bound on. |
| // The CompositorFrameSink itself is destroyed on the main thread. |
| - begin_frame_source_ = nullptr; |
| + external_begin_frame_source_ = nullptr; |
| + synthetic_begin_frame_source_ = nullptr; |
| compositor_frame_sink_proxy_->ClearCompositorFrameSink(); |
| compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( |
| routing_id_, compositor_frame_sink_filter_handler_); |
| @@ -142,7 +151,10 @@ void RendererCompositorFrameSink::OnMessageReceived( |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message) |
| IPC_MESSAGE_HANDLER(ViewMsg_ReclaimCompositorResources, |
| - OnReclaimCompositorResources); |
| + OnReclaimCompositorResources) |
| + IPC_MESSAGE_HANDLER(ViewMsg_SetBeginFramePaused, |
| + OnSetBeginFrameSourcePaused) |
| + IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrame) |
|
Fady Samuel
2017/03/24 21:30:31
Where was this handled previously?
Saman Sami
2017/03/24 21:37:16
Here https://cs.chromium.org/chromium/src/content/
|
| IPC_END_MESSAGE_MAP() |
| } |
| @@ -159,6 +171,16 @@ void RendererCompositorFrameSink::OnReclaimCompositorResources( |
| 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); |
| } |
| @@ -210,4 +232,16 @@ void RendererCompositorFrameSink::UpdateFrameData( |
| #endif |
| } |
| +void RendererCompositorFrameSink::OnNeedsBeginFrames(bool needs_begin_frames) { |
| + Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, needs_begin_frames)); |
| +} |
| + |
| +void RendererCompositorFrameSink::OnDidFinishFrame( |
| + const cc::BeginFrameAck& ack) { |
| + DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); |
| + // If there was damage, ViewHostMsg_SwapCompositorFrame includes the ack. |
| + if (!ack.has_damage) |
| + Send(new ViewHostMsg_BeginFrameDidNotSwap(routing_id_, ack)); |
| +} |
| + |
| } // namespace content |