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

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

Issue 2774373002: Use MojoCompositorFrameSink in RendererCompositorFrameSink (Closed)
Patch Set: addressed comments Created 3 years, 8 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 10 matching lines...) Expand all
21 #include "gpu/command_buffer/client/context_support.h" 21 #include "gpu/command_buffer/client/context_support.h"
22 #include "gpu/command_buffer/client/gles2_interface.h" 22 #include "gpu/command_buffer/client/gles2_interface.h"
23 #include "gpu/ipc/client/command_buffer_proxy_impl.h" 23 #include "gpu/ipc/client/command_buffer_proxy_impl.h"
24 #include "ipc/ipc_sync_channel.h" 24 #include "ipc/ipc_sync_channel.h"
25 #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h" 25 #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h"
26 26
27 namespace content { 27 namespace content {
28 28
29 RendererCompositorFrameSink::RendererCompositorFrameSink( 29 RendererCompositorFrameSink::RendererCompositorFrameSink(
30 int32_t routing_id, 30 int32_t routing_id,
31 uint32_t compositor_frame_sink_id,
32 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, 31 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
33 scoped_refptr<cc::ContextProvider> context_provider, 32 scoped_refptr<cc::ContextProvider> context_provider,
34 scoped_refptr<cc::ContextProvider> worker_context_provider, 33 scoped_refptr<cc::ContextProvider> worker_context_provider,
35 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, 34 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
36 cc::SharedBitmapManager* shared_bitmap_manager, 35 cc::SharedBitmapManager* shared_bitmap_manager,
37 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) 36 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue)
38 : CompositorFrameSink(std::move(context_provider), 37 : CompositorFrameSink(std::move(context_provider),
39 std::move(worker_context_provider), 38 std::move(worker_context_provider),
40 gpu_memory_buffer_manager, 39 gpu_memory_buffer_manager,
41 shared_bitmap_manager), 40 shared_bitmap_manager),
42 compositor_frame_sink_id_(compositor_frame_sink_id),
43 compositor_frame_sink_filter_( 41 compositor_frame_sink_filter_(
44 RenderThreadImpl::current()->compositor_message_filter()), 42 RenderThreadImpl::current()->compositor_message_filter()),
45 message_sender_(RenderThreadImpl::current()->sync_message_filter()), 43 message_sender_(RenderThreadImpl::current()->sync_message_filter()),
46 frame_swap_message_queue_(swap_frame_message_queue), 44 frame_swap_message_queue_(swap_frame_message_queue),
47 synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)), 45 synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)),
48 external_begin_frame_source_( 46 external_begin_frame_source_(
49 synthetic_begin_frame_source_ 47 synthetic_begin_frame_source_
50 ? nullptr 48 ? nullptr
51 : base::MakeUnique<cc::ExternalBeginFrameSource>(this)), 49 : base::MakeUnique<cc::ExternalBeginFrameSource>(this)),
52 routing_id_(routing_id) { 50 routing_id_(routing_id),
51 sink_client_binding_(this) {
53 DCHECK(compositor_frame_sink_filter_); 52 DCHECK(compositor_frame_sink_filter_);
54 DCHECK(frame_swap_message_queue_); 53 DCHECK(frame_swap_message_queue_);
55 DCHECK(message_sender_); 54 DCHECK(message_sender_);
56 thread_checker_.DetachFromThread(); 55 thread_checker_.DetachFromThread();
56 EstablishMojoConnection();
57 } 57 }
58 58
59 RendererCompositorFrameSink::RendererCompositorFrameSink( 59 RendererCompositorFrameSink::RendererCompositorFrameSink(
60 int32_t routing_id, 60 int32_t routing_id,
61 uint32_t compositor_frame_sink_id,
62 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source, 61 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source,
63 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, 62 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider,
64 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue) 63 scoped_refptr<FrameSwapMessageQueue> swap_frame_message_queue)
65 : CompositorFrameSink(std::move(vulkan_context_provider)), 64 : CompositorFrameSink(std::move(vulkan_context_provider)),
66 compositor_frame_sink_id_(compositor_frame_sink_id),
67 compositor_frame_sink_filter_( 65 compositor_frame_sink_filter_(
68 RenderThreadImpl::current()->compositor_message_filter()), 66 RenderThreadImpl::current()->compositor_message_filter()),
69 message_sender_(RenderThreadImpl::current()->sync_message_filter()), 67 message_sender_(RenderThreadImpl::current()->sync_message_filter()),
70 frame_swap_message_queue_(swap_frame_message_queue), 68 frame_swap_message_queue_(swap_frame_message_queue),
71 synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)), 69 synthetic_begin_frame_source_(std::move(synthetic_begin_frame_source)),
72 external_begin_frame_source_( 70 external_begin_frame_source_(
73 synthetic_begin_frame_source_ 71 synthetic_begin_frame_source_
74 ? nullptr 72 ? nullptr
75 : base::MakeUnique<cc::ExternalBeginFrameSource>(this)), 73 : base::MakeUnique<cc::ExternalBeginFrameSource>(this)),
76 routing_id_(routing_id) { 74 routing_id_(routing_id),
75 sink_client_binding_(this) {
77 DCHECK(compositor_frame_sink_filter_); 76 DCHECK(compositor_frame_sink_filter_);
78 DCHECK(frame_swap_message_queue_); 77 DCHECK(frame_swap_message_queue_);
79 DCHECK(message_sender_); 78 DCHECK(message_sender_);
80 thread_checker_.DetachFromThread(); 79 thread_checker_.DetachFromThread();
80 EstablishMojoConnection();
81 } 81 }
82 82
83 RendererCompositorFrameSink::~RendererCompositorFrameSink() { 83 RendererCompositorFrameSink::~RendererCompositorFrameSink() {
84 // TODO(crbug.com/702764): If not detached then IPC messages would crash 84 // TODO(crbug.com/702764): If not detached then IPC messages would crash
85 // after this class is destroyed. 85 // after this class is destroyed.
86 CHECK(!bound_); 86 CHECK(!bound_);
87 } 87 }
88 88
89 bool RendererCompositorFrameSink::BindToClient( 89 bool RendererCompositorFrameSink::BindToClient(
90 cc::CompositorFrameSinkClient* client) { 90 cc::CompositorFrameSinkClient* client) {
91 DCHECK(thread_checker_.CalledOnValidThread()); 91 DCHECK(thread_checker_.CalledOnValidThread());
92 if (!cc::CompositorFrameSink::BindToClient(client)) 92 if (!cc::CompositorFrameSink::BindToClient(client))
93 return false; 93 return false;
94 94
95 sink_.Bind(std::move(sink_ptr_info_));
96 sink_client_binding_.Bind(std::move(sink_client_request_));
97
95 if (synthetic_begin_frame_source_) 98 if (synthetic_begin_frame_source_)
96 client_->SetBeginFrameSource(synthetic_begin_frame_source_.get()); 99 client_->SetBeginFrameSource(synthetic_begin_frame_source_.get());
97 else 100 else
98 client_->SetBeginFrameSource(external_begin_frame_source_.get()); 101 client_->SetBeginFrameSource(external_begin_frame_source_.get());
99 102
100 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this); 103 compositor_frame_sink_proxy_ = new RendererCompositorFrameSinkProxy(this);
101 compositor_frame_sink_filter_handler_ = 104 compositor_frame_sink_filter_handler_ =
102 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived, 105 base::Bind(&RendererCompositorFrameSinkProxy::OnMessageReceived,
103 compositor_frame_sink_proxy_); 106 compositor_frame_sink_proxy_);
104 compositor_frame_sink_filter_->AddHandlerOnCompositorThread( 107 compositor_frame_sink_filter_->AddHandlerOnCompositorThread(
105 routing_id_, compositor_frame_sink_filter_handler_); 108 routing_id_, compositor_frame_sink_filter_handler_);
109
106 bound_ = true; 110 bound_ = true;
107 return true; 111 return true;
108 } 112 }
109 113
110 void RendererCompositorFrameSink::DetachFromClient() { 114 void RendererCompositorFrameSink::DetachFromClient() {
111 DCHECK(thread_checker_.CalledOnValidThread()); 115 DCHECK(thread_checker_.CalledOnValidThread());
112 client_->SetBeginFrameSource(nullptr); 116 client_->SetBeginFrameSource(nullptr);
113 // Destroy the begin frame source on the same thread it was bound on. 117 // Destroy the begin frame source on the same thread it was bound on.
114 // The CompositorFrameSink itself is destroyed on the main thread. 118 // The CompositorFrameSink itself is destroyed on the main thread.
115 external_begin_frame_source_ = nullptr; 119 external_begin_frame_source_ = nullptr;
116 synthetic_begin_frame_source_ = nullptr; 120 synthetic_begin_frame_source_ = nullptr;
117 compositor_frame_sink_proxy_->ClearCompositorFrameSink(); 121 compositor_frame_sink_proxy_->ClearCompositorFrameSink();
118 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread( 122 compositor_frame_sink_filter_->RemoveHandlerOnCompositorThread(
119 routing_id_, compositor_frame_sink_filter_handler_); 123 routing_id_, compositor_frame_sink_filter_handler_);
120 124 sink_.reset();
125 sink_client_binding_.Close();
121 cc::CompositorFrameSink::DetachFromClient(); 126 cc::CompositorFrameSink::DetachFromClient();
122 bound_ = false; 127 bound_ = false;
123 } 128 }
124 129
125 void RendererCompositorFrameSink::SubmitCompositorFrame( 130 void RendererCompositorFrameSink::SubmitCompositorFrame(
126 cc::CompositorFrame frame) { 131 cc::CompositorFrame frame) {
127 // We should only submit CompositorFrames with valid BeginFrameAcks. 132 // We should only submit CompositorFrames with valid BeginFrameAcks.
128 DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, 133 DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber,
129 frame.metadata.begin_frame_ack.sequence_number); 134 frame.metadata.begin_frame_ack.sequence_number);
130 if (ShouldAllocateNewLocalSurfaceId(frame)) 135 if (ShouldAllocateNewLocalSurfaceId(frame))
131 local_surface_id_ = id_allocator_.GenerateId(); 136 local_surface_id_ = id_allocator_.GenerateId();
132 UpdateFrameData(frame); 137 UpdateFrameData(frame);
133 138
134 { 139 {
135 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope> 140 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope>
136 send_message_scope = 141 send_message_scope =
137 frame_swap_message_queue_->AcquireSendMessageScope(); 142 frame_swap_message_queue_->AcquireSendMessageScope();
138 std::vector<std::unique_ptr<IPC::Message>> messages; 143 std::vector<std::unique_ptr<IPC::Message>> messages;
139 frame_swap_message_queue_->DrainMessages(&messages); 144 frame_swap_message_queue_->DrainMessages(&messages);
140 std::vector<IPC::Message> messages_to_send; 145 std::vector<IPC::Message> messages_to_send;
141 FrameSwapMessageQueue::TransferMessages(&messages, &messages_to_send); 146 FrameSwapMessageQueue::TransferMessages(&messages, &messages_to_send);
142 uint32_t frame_token = 0; 147 uint32_t frame_token = 0;
143 if (!messages_to_send.empty()) 148 if (!messages_to_send.empty())
144 frame_token = frame_swap_message_queue_->AllocateFrameToken(); 149 frame_token = frame_swap_message_queue_->AllocateFrameToken();
145 frame.metadata.frame_token = frame_token; 150 frame.metadata.frame_token = frame_token;
146 Send(new ViewHostMsg_SwapCompositorFrame( 151 sink_->SubmitCompositorFrame(local_surface_id_, std::move(frame));
147 routing_id_, compositor_frame_sink_id_, local_surface_id_, frame));
piman 2017/04/10 23:35:58 I worry a little bit about the expectations of ord
Saman Sami 2017/04/11 00:09:52 Mojo doesn't preserve ordering with Chrome IPC. I
148 if (frame_token) { 152 if (frame_token) {
149 Send(new ViewHostMsg_FrameSwapMessages(routing_id_, frame_token, 153 message_sender_->Send(new ViewHostMsg_FrameSwapMessages(
150 messages_to_send)); 154 routing_id_, frame_token, messages_to_send));
151 } 155 }
152 // ~send_message_scope. 156 // ~send_message_scope.
153 } 157 }
154 } 158 }
155 159
156 void RendererCompositorFrameSink::OnMessageReceived( 160 void RendererCompositorFrameSink::OnMessageReceived(
157 const IPC::Message& message) { 161 const IPC::Message& message) {
158 DCHECK(thread_checker_.CalledOnValidThread()); 162 DCHECK(thread_checker_.CalledOnValidThread());
159 IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message) 163 IPC_BEGIN_MESSAGE_MAP(RendererCompositorFrameSink, message)
160 IPC_MESSAGE_HANDLER(ViewMsg_ReclaimCompositorResources, 164 IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrameIPC)
161 OnReclaimCompositorResources)
162 IPC_MESSAGE_HANDLER(ViewMsg_SetBeginFramePaused,
163 OnSetBeginFrameSourcePaused)
164 IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrame)
165 IPC_END_MESSAGE_MAP() 165 IPC_END_MESSAGE_MAP()
166 } 166 }
167 167
168 void RendererCompositorFrameSink::OnReclaimCompositorResources( 168 void RendererCompositorFrameSink::OnBeginFrameIPC(
169 uint32_t compositor_frame_sink_id, 169 const cc::BeginFrameArgs& args) {
170 bool is_swap_ack,
171 const cc::ReturnedResourceArray& resources) {
172 // Ignore message if it's a stale one coming from a different output surface
173 // (e.g. after a lost context).
174 if (compositor_frame_sink_id != compositor_frame_sink_id_)
175 return;
176 client_->ReclaimResources(resources);
177 if (is_swap_ack)
178 client_->DidReceiveCompositorFrameAck();
179 }
180
181 void RendererCompositorFrameSink::OnSetBeginFrameSourcePaused(bool paused) {
182 if (external_begin_frame_source_)
183 external_begin_frame_source_->OnSetBeginFrameSourcePaused(paused);
184 }
185
186 void RendererCompositorFrameSink::OnBeginFrame(const cc::BeginFrameArgs& args) {
187 if (external_begin_frame_source_) 170 if (external_begin_frame_source_)
188 external_begin_frame_source_->OnBeginFrame(args); 171 external_begin_frame_source_->OnBeginFrame(args);
189 } 172 }
190 173
191 bool RendererCompositorFrameSink::Send(IPC::Message* message) {
192 return message_sender_->Send(message);
193 }
194
195 bool RendererCompositorFrameSink::ShouldAllocateNewLocalSurfaceId( 174 bool RendererCompositorFrameSink::ShouldAllocateNewLocalSurfaceId(
196 const cc::CompositorFrame& frame) { 175 const cc::CompositorFrame& frame) {
197 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); 176 cc::RenderPass* root_pass = frame.render_pass_list.back().get();
198 gfx::Size frame_size = root_pass->output_rect.size(); 177 gfx::Size frame_size = root_pass->output_rect.size();
199 178
200 // Once the proposal in crbug.com/689754 is implemented, the LocalSurfaceId 179 // Once the proposal in crbug.com/689754 is implemented, the LocalSurfaceId
201 // allocation logic will be unified across all platforms. 180 // allocation logic will be unified across all platforms.
202 return !local_surface_id_.is_valid() || 181 return !local_surface_id_.is_valid() ||
203 current_frame_data_.device_scale_factor != 182 current_frame_data_.device_scale_factor !=
204 frame.metadata.device_scale_factor || 183 frame.metadata.device_scale_factor ||
(...skipping 27 matching lines...) Expand all
232 current_frame_data_.bottom_controls_height = 211 current_frame_data_.bottom_controls_height =
233 frame.metadata.bottom_controls_height; 212 frame.metadata.bottom_controls_height;
234 current_frame_data_.bottom_controls_shown_ratio = 213 current_frame_data_.bottom_controls_shown_ratio =
235 frame.metadata.bottom_controls_shown_ratio; 214 frame.metadata.bottom_controls_shown_ratio;
236 current_frame_data_.viewport_selection = frame.metadata.selection; 215 current_frame_data_.viewport_selection = frame.metadata.selection;
237 current_frame_data_.has_transparent_background = 216 current_frame_data_.has_transparent_background =
238 root_pass->has_transparent_background; 217 root_pass->has_transparent_background;
239 #endif 218 #endif
240 } 219 }
241 220
221 void RendererCompositorFrameSink::DidReceiveCompositorFrameAck() {
222 client_->DidReceiveCompositorFrameAck();
223 }
224
225 void RendererCompositorFrameSink::OnBeginFrame(const cc::BeginFrameArgs& args) {
226 // See crbug.com/709689.
227 NOTREACHED() << "BeginFrames are delivered using Chrome IPC.";
228 }
229
230 void RendererCompositorFrameSink::ReclaimResources(
231 const cc::ReturnedResourceArray& resources) {
232 client_->ReclaimResources(resources);
233 }
234
242 void RendererCompositorFrameSink::OnNeedsBeginFrames(bool needs_begin_frames) { 235 void RendererCompositorFrameSink::OnNeedsBeginFrames(bool needs_begin_frames) {
243 Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, needs_begin_frames)); 236 sink_->SetNeedsBeginFrame(needs_begin_frames);
244 } 237 }
245 238
246 void RendererCompositorFrameSink::OnDidFinishFrame( 239 void RendererCompositorFrameSink::OnDidFinishFrame(
247 const cc::BeginFrameAck& ack) { 240 const cc::BeginFrameAck& ack) {
248 DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number); 241 DCHECK_LE(cc::BeginFrameArgs::kStartingFrameNumber, ack.sequence_number);
249 // If there was damage, ViewHostMsg_SwapCompositorFrame includes the ack. 242 // If there was damage, ViewHostMsg_SwapCompositorFrame includes the ack.
250 if (!ack.has_damage) 243 if (!ack.has_damage)
251 Send(new ViewHostMsg_BeginFrameDidNotSwap(routing_id_, ack)); 244 sink_->BeginFrameDidNotSwap(ack);
245 }
246
247 void RendererCompositorFrameSink::EstablishMojoConnection() {
248 cc::mojom::MojoCompositorFrameSinkPtr sink;
249 cc::mojom::MojoCompositorFrameSinkRequest sink_request =
250 mojo::MakeRequest(&sink);
251 cc::mojom::MojoCompositorFrameSinkClientPtr sink_client;
252 sink_client_request_ = mojo::MakeRequest(&sink_client);
253 RenderThreadImpl::current()->GetFrameSinkProvider()->CreateForWidget(
254 routing_id_, std::move(sink_request), std::move(sink_client));
255 sink_ptr_info_ = sink.PassInterface();
252 } 256 }
253 257
254 } // namespace content 258 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698