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

Side by Side Diff: content/renderer/gpu/renderer_compositor_frame_sink.cc

Issue 2903853002: Make RendererCompositorFrameSink derive from ClientCompositorFrameSink (Closed)
Patch Set: Add comments Created 3 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/gpu/renderer_compositor_frame_sink.h" 5 #include "content/renderer/gpu/renderer_compositor_frame_sink.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 18 matching lines...) Expand all
29 RendererCompositorFrameSink::RendererCompositorFrameSink( 29 RendererCompositorFrameSink::RendererCompositorFrameSink(
30 int32_t routing_id, 30 int32_t routing_id,
31 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, 31 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
32 scoped_refptr<cc::ContextProvider> context_provider, 32 scoped_refptr<cc::ContextProvider> context_provider,
33 scoped_refptr<cc::ContextProvider> worker_context_provider, 33 scoped_refptr<cc::ContextProvider> worker_context_provider,
34 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, 34 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
35 cc::SharedBitmapManager* shared_bitmap_manager, 35 cc::SharedBitmapManager* shared_bitmap_manager,
36 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info, 36 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info,
37 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request, 37 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request,
38 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) 38 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue)
39 : CompositorFrameSink(std::move(context_provider), 39 : ClientCompositorFrameSink(std::move(context_provider),
40 std::move(worker_context_provider), 40 std::move(worker_context_provider),
41 gpu_memory_buffer_manager, 41 gpu_memory_buffer_manager,
42 shared_bitmap_manager), 42 shared_bitmap_manager,
43 std::move(synthetic_begin_frame_source),
44 std::move(sink_info),
45 std::move(sink_client_request),
46 false /* enable_surface_synchronization */),
43 compositor_frame_sink_filter_( 47 compositor_frame_sink_filter_(
44 RenderThreadImpl::current()->compositor_message_filter()), 48 RenderThreadImpl::current()->compositor_message_filter()),
45 message_sender_(RenderThreadImpl::current()->sync_message_filter()), 49 message_sender_(RenderThreadImpl::current()->sync_message_filter()),
46 frame_swap_message_queue_(swap_frame_message_queue), 50 frame_swap_message_queue_(swap_frame_message_queue),
47 synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)), 51 routing_id_(routing_id) {
48 external_begin_frame_source_(
49 synthetic_begin_frame_source_
50 ? nullptr
51 : base::MakeUnique<cc::ExternalBeginFrameSource>(this)),
52 routing_id_(routing_id),
53 sink_info_(std::move(sink_info)),
54 sink_client_request_(std::move(sink_client_request)),
55 sink_client_binding_(this) {
56 DCHECK(compositor_frame_sink_filter_); 52 DCHECK(compositor_frame_sink_filter_);
57 DCHECK(frame_swap_message_queue_); 53 DCHECK(frame_swap_message_queue_);
58 DCHECK(message_sender_); 54 DCHECK(message_sender_);
59 thread_checker_.DetachFromThread();
60 } 55 }
61 56
62 RendererCompositorFrameSink::RendererCompositorFrameSink( 57 RendererCompositorFrameSink::RendererCompositorFrameSink(
63 int32_t routing_id, 58 int32_t routing_id,
64 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, 59 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
65 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, 60 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider,
66 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info, 61 cc::mojom::MojoCompositorFrameSinkPtrInfo sink_info,
67 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request, 62 cc::mojom::MojoCompositorFrameSinkClientRequest sink_client_request,
68 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) 63 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue)
69 : CompositorFrameSink(std::move(vulkan_context_provider)), 64 : ClientCompositorFrameSink(std::move(vulkan_context_provider),
65 std::move(synthetic_begin_frame_source),
66 std::move(sink_info),
67 std::move(sink_client_request),
68 false /* enable_surface_synchronization */),
70 compositor_frame_sink_filter_( 69 compositor_frame_sink_filter_(
71 RenderThreadImpl::current()->compositor_message_filter()), 70 RenderThreadImpl::current()->compositor_message_filter()),
72 message_sender_(RenderThreadImpl::current()->sync_message_filter()), 71 message_sender_(RenderThreadImpl::current()->sync_message_filter()),
73 frame_swap_message_queue_(swap_frame_message_queue), 72 frame_swap_message_queue_(swap_frame_message_queue),
74 synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)), 73 routing_id_(routing_id) {
75 external_begin_frame_source_(
76 synthetic_begin_frame_source_
77 ? nullptr
78 : base::MakeUnique<cc::ExternalBeginFrameSource>(this)),
79 routing_id_(routing_id),
80 sink_info_(std::move(sink_info)),
81 sink_client_request_(std::move(sink_client_request)),
82 sink_client_binding_(this) {
83 DCHECK(compositor_frame_sink_filter_); 74 DCHECK(compositor_frame_sink_filter_);
84 DCHECK(frame_swap_message_queue_); 75 DCHECK(frame_swap_message_queue_);
85 DCHECK(message_sender_); 76 DCHECK(message_sender_);
86 thread_checker_.DetachFromThread();
87 } 77 }
88 78
89 RendererCompositorFrameSink::~RendererCompositorFrameSink() = default; 79 RendererCompositorFrameSink::~RendererCompositorFrameSink() = default;
90 80
91 bool RendererCompositorFrameSink::BindToClient( 81 bool RendererCompositorFrameSink::BindToClient(
92 cc::CompositorFrameSinkClient* client) { 82 cc::CompositorFrameSinkClient* client) {
93 DCHECK(thread_checker_.CalledOnValidThread()); 83 if (!ClientCompositorFrameSink::BindToClient(client))
94 if (!cc::CompositorFrameSink::BindToClient(client))
95 return false; 84 return false;
96 85
97 sink_.Bind(std::move(sink_info_));
98 sink_client_binding_.Bind(std::move(sink_client_request_));
99
100 if (synthetic_begin_frame_source_)
101 client_->SetBeginFrameSource(synthetic_begin_frame_source_.get());
102 else
103 client_->SetBeginFrameSource(external_begin_frame_source_.get());
104
105 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this); 86 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this);
106 compositor_frame_sink_filter_handler_ = 87 compositor_frame_sink_filter_handler_ =
107 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived, 88 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived,
108 compositor_frame_sink_proxy_); 89 compositor_frame_sink_proxy_);
109 compositor_frame_sink_filter_->AddHandlerOnCompositorThread( 90 compositor_frame_sink_filter_->AddHandlerOnCompositorThread(
110 routing_id_, compositor_frame_sink_filter_handler_); 91 routing_id_, compositor_frame_sink_filter_handler_);
92
111 return true; 93 return true;
112 } 94 }
113 95
114 void RendererCompositorFrameSink::DetachFromClient() { 96 void RendererCompositorFrameSink::DetachFromClient() {
115 DCHECK(thread_checker_.CalledOnValidThread());
116 client_->SetBeginFrameSource(nullptr);
117 // Destroy the begin frame source on the same thread it was bound on.
118 // The CompositorFrameSink itself is destroyed on the main thread.
119 external_begin_frame_source_ = nullptr;
120 synthetic_begin_frame_source_ = nullptr;
121 compositor_frame_sink_proxy_->ClearCompositorFrameSink(); 97 compositor_frame_sink_proxy_->ClearCompositorFrameSink();
122 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( 98 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread(
123 routing_id_, compositor_frame_sink_filter_handler_); 99 routing_id_, compositor_frame_sink_filter_handler_);
124 sink_.reset(); 100 ClientCompositorFrameSink::DetachFromClient();
125 sink_client_binding_.Close();
126 cc::CompositorFrameSink::DetachFromClient();
127 } 101 }
128 102
129 void RendererCompositorFrameSink::SubmitCompositorFrame( 103 void RendererCompositorFrameSink::SubmitCompositorFrame(
130 cc::CompositorFrame frame) { 104 cc::CompositorFrame frame) {
131 // We should only submit CompositorFrames with valid BeginFrameAcks.
132 DCHECK(frame.metadata.begin_frame_ack.has_damage);
133 DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber,
134 frame.metadata.begin_frame_ack.sequence_number);
135 auto new_surface_properties =
136 RenderWidgetSurfaceProperties::FromCompositorFrame(frame);
137 if (!local_surface_id_.is_valid() ||
138 new_surface_properties != current_surface_properties_) {
139 local_surface_id_ = id_allocator_.GenerateId();
140 current_surface_properties_ = new_surface_properties;
141 }
142
143 { 105 {
144 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope> 106 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope>
145 send_message_scope = 107 send_message_scope =
146 frame_swap_message_queue_->AcquireSendMessageScope(); 108 frame_swap_message_queue_->AcquireSendMessageScope();
147 std::vector<std::unique_ptr<IPC::Message>> messages; 109 std::vector<std::unique_ptr<IPC::Message>> messages;
148 frame_swap_message_queue_->DrainMessages(&messages); 110 frame_swap_message_queue_->DrainMessages(&messages);
149 std::vector<IPC::Message> messages_to_send; 111 std::vector<IPC::Message> messages_to_send;
150 FrameSwapMessageQueue::TransferMessages(&messages, &messages_to_send); 112 FrameSwapMessageQueue::TransferMessages(&messages, &messages_to_send);
151 uint32_t frame_token = 0; 113 if (!messages_to_send.empty()) {
152 if (!messages_to_send.empty()) 114 frame.metadata.frame_token =
153 frame_token = frame_swap_message_queue_->AllocateFrameToken(); 115 frame_swap_message_queue_->AllocateFrameToken();
154 frame.metadata.frame_token = frame_token;
155 sink_->SubmitCompositorFrame(local_surface_id_, std::move(frame));
156 if (frame_token) {
157 message_sender_->Send(new ViewHostMsg_FrameSwapMessages( 116 message_sender_->Send(new ViewHostMsg_FrameSwapMessages(
158 routing_id_, frame_token, messages_to_send)); 117 routing_id_, frame.metadata.frame_token, messages_to_send));
159 } 118 }
160 // ~send_message_scope. 119 // ~send_message_scope.
161 } 120 }
121 auto new_surface_properties =
122 RenderWidgetSurfaceProperties::FromCompositorFrame(frame);
123 ClientCompositorFrameSink::SubmitCompositorFrame(std::move(frame));
124 current_surface_properties_ = new_surface_properties;
162 } 125 }
163 126
164 void RendererCompositorFrameSink::DidNotProduceFrame( 127 bool RendererCompositorFrameSink::ShouldAllocateNewLocalSurfaceId(
165 const cc::BeginFrameAck& ack) { 128 const cc::CompositorFrame& frame) {
166 DCHECK(!ack.has_damage); 129 return current_surface_properties_ !=
167 DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); 130 RenderWidgetSurfaceProperties::FromCompositorFrame(frame);
168 sink_->DidNotProduceFrame(ack);
169 }
170
171 void RendererCompositorFrameSink::OnMessageReceived(
172 const IPC::Message& message) {
173 DCHECK(thread_checker_.CalledOnValidThread());
174 }
175
176 void RendererCompositorFrameSink::DidReceiveCompositorFrameAck(
177 const cc::ReturnedResourceArray& resources) {
178 ReclaimResources(resources);
179 client_->DidReceiveCompositorFrameAck();
180 }
181
182 void RendererCompositorFrameSink::OnBeginFrame(const cc::BeginFrameArgs& args) {
183 if (external_begin_frame_source_)
184 external_begin_frame_source_->OnBeginFrame(args);
185 }
186
187 void RendererCompositorFrameSink::ReclaimResources(
188 const cc::ReturnedResourceArray& resources) {
189 client_->ReclaimResources(resources);
190 }
191
192 void RendererCompositorFrameSink::OnNeedsBeginFrames(bool needs_begin_frames) {
193 sink_->SetNeedsBeginFrame(needs_begin_frames);
194 } 131 }
195 132
196 } // namespace content 133 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/renderer_compositor_frame_sink.h ('k') | content/renderer/mus/renderer_window_tree_client.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698