Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1759)

Unified Diff: content/renderer/gpu/renderer_compositor_frame_sink.cc

Issue 2773023002: RendererCompositorFrameSink should receive BeginFrame messages (Closed)
Patch Set: Fixed android Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)
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

Powered by Google App Engine
This is Rietveld 408576698