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

Side by Side Diff: content/renderer/android/synchronous_compositor_proxy.cc

Issue 2174203002: OnDrawHardware() implementation with async messages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Further changes. Created 4 years, 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/android/synchronous_compositor_proxy.h" 5 #include "content/renderer/android/synchronous_compositor_proxy.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/memory/shared_memory.h" 9 #include "base/memory/shared_memory.h"
10 #include "cc/ipc/cc_param_traits.h" 10 #include "cc/ipc/cc_param_traits.h"
(...skipping 17 matching lines...) Expand all
28 : routing_id_(routing_id), 28 : routing_id_(routing_id),
29 sender_(sender), 29 sender_(sender),
30 input_handler_proxy_(input_handler_proxy), 30 input_handler_proxy_(input_handler_proxy),
31 use_in_process_zero_copy_software_draw_( 31 use_in_process_zero_copy_software_draw_(
32 base::CommandLine::ForCurrentProcess()->HasSwitch( 32 base::CommandLine::ForCurrentProcess()->HasSwitch(
33 switches::kSingleProcess)), 33 switches::kSingleProcess)),
34 output_surface_(nullptr), 34 output_surface_(nullptr),
35 inside_receive_(false), 35 inside_receive_(false),
36 hardware_draw_reply_(nullptr), 36 hardware_draw_reply_(nullptr),
37 software_draw_reply_(nullptr), 37 software_draw_reply_(nullptr),
38 hardware_draw_reply_async_(false),
38 version_(0u), 39 version_(0u),
39 page_scale_factor_(0.f), 40 page_scale_factor_(0.f),
40 min_page_scale_factor_(0.f), 41 min_page_scale_factor_(0.f),
41 max_page_scale_factor_(0.f), 42 max_page_scale_factor_(0.f),
42 need_animate_scroll_(false), 43 need_animate_scroll_(false),
43 need_invalidate_count_(0u), 44 need_invalidate_count_(0u),
44 did_activate_pending_tree_count_(0u) { 45 did_activate_pending_tree_count_(0u) {
45 DCHECK(input_handler_proxy_); 46 DCHECK(input_handler_proxy_);
46 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); 47 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this);
47 } 48 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 void SynchronousCompositorProxy::OnMessageReceived( 130 void SynchronousCompositorProxy::OnMessageReceived(
130 const IPC::Message& message) { 131 const IPC::Message& message) {
131 if (output_surface_ && output_surface_->OnMessageReceived(message)) 132 if (output_surface_ && output_surface_->OnMessageReceived(message))
132 return; 133 return;
133 134
134 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) 135 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message)
135 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SynchronizeRendererState, 136 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SynchronizeRendererState,
136 PopulateCommonParams) 137 PopulateCommonParams)
137 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) 138 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll)
138 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw, 139 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw,
139 DemandDrawHw) 140 DemandDrawHw_Sync)
141 IPC_MESSAGE_HANDLER(CompositorMsg_DemandDrawHw, DemandDrawHw)
142
140 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory) 143 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory)
141 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) 144 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory)
142 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw, 145 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw,
143 DemandDrawSw) 146 DemandDrawSw)
144 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZoomBy, SynchronouslyZoomBy) 147 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZoomBy, SynchronouslyZoomBy)
145 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetScroll, SetScroll) 148 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetScroll, SetScroll)
146 IPC_END_MESSAGE_MAP() 149 IPC_END_MESSAGE_MAP()
147 } 150 }
148 151
149 bool SynchronousCompositorProxy::Send(IPC::Message* message) { 152 bool SynchronousCompositorProxy::Send(IPC::Message* message) {
150 return sender_->Send(message); 153 return sender_->Send(message);
151 } 154 }
152 155
153 void SynchronousCompositorProxy::DemandDrawHw( 156 void SynchronousCompositorProxy::DemandDrawHw_Sync(
154 const SyncCompositorDemandDrawHwParams& params, 157 const SyncCompositorDemandDrawHwParams& params,
155 IPC::Message* reply_message) { 158 IPC::Message* reply_message) {
156 DCHECK(!inside_receive_); 159 DCHECK(!inside_receive_);
157 DCHECK(reply_message); 160 DCHECK(reply_message);
158 161
159 inside_receive_ = true; 162 inside_receive_ = true;
160 163
161 if (output_surface_) { 164 if (output_surface_) {
162 base::AutoReset<IPC::Message*> scoped_hardware_draw_reply( 165 base::AutoReset<IPC::Message*> scoped_hardware_draw_reply(
163 &hardware_draw_reply_, reply_message); 166 &hardware_draw_reply_, reply_message);
164 output_surface_->DemandDrawHw(params.surface_size, params.transform, 167 output_surface_->DemandDrawHw(params.surface_size, params.transform,
165 params.viewport, params.clip, 168 params.viewport, params.clip,
166 params.viewport_rect_for_tile_priority, 169 params.viewport_rect_for_tile_priority,
167 params.transform_for_tile_priority); 170 params.transform_for_tile_priority);
168 } 171 }
169 172
170 if (inside_receive_) { 173 if (inside_receive_) {
171 // Did not swap. 174 // Did not swap.
172 SendDemandDrawHwReply(cc::CompositorFrame(), 0u, reply_message); 175 SendDemandDrawHwReply_Sync(cc::CompositorFrame(), 0u, reply_message);
173 inside_receive_ = false; 176 inside_receive_ = false;
174 } 177 }
175 } 178 }
176 179
180 void SynchronousCompositorProxy::DemandDrawHw(
181 // const SyncCompositorDemandDrawHwParams& params,
182 // IPC::Message* reply_message) {
183 const SyncCompositorDemandDrawHwParams& params) {
184 DCHECK(!inside_receive_);
185 // DCHECK(reply_message);
186
187 inside_receive_ = true;
188
189 if (output_surface_) {
190 /* TODO: Since there is no reply message, is it OK to just set
191 * hardware_draw_reply_ to anything that passes the DCHECK for being true?
192 */
193 // base::AutoReset<IPC::Message*> scoped_hardware_draw_reply(
194 // &hardware_draw_reply_, reply_message);
195 base::AutoReset<bool> scoped_hardware_draw_reply_async(
196 &hardware_draw_reply_async_, true);
197 hardware_draw_reply_ = new IPC::Message();
198 output_surface_->DemandDrawHw(params.surface_size, params.transform,
199 params.viewport, params.clip,
200 params.viewport_rect_for_tile_priority,
201 params.transform_for_tile_priority);
202 }
203
204 if (inside_receive_) {
205 // Did not swap.
206 // SendDemandDrawHwReply(cc::CompositorFrame(), 0u, reply_message);
207 SendDemandDrawHwReply(cc::CompositorFrame(), 0u);
208 inside_receive_ = false;
209 }
210 }
211
212 void SynchronousCompositorProxy::SwapBuffersHw_Sync(uint32_t output_surface_id,
213 cc::CompositorFrame frame) {
214 DCHECK(inside_receive_);
215 DCHECK(hardware_draw_reply_);
216 SendDemandDrawHwReply_Sync(std::move(frame), output_surface_id,
217 hardware_draw_reply_);
218 inside_receive_ = false;
219 }
220
177 void SynchronousCompositorProxy::SwapBuffersHw(uint32_t output_surface_id, 221 void SynchronousCompositorProxy::SwapBuffersHw(uint32_t output_surface_id,
178 cc::CompositorFrame frame) { 222 cc::CompositorFrame frame) {
179 DCHECK(inside_receive_); 223 DCHECK(inside_receive_);
180 DCHECK(hardware_draw_reply_); 224 DCHECK(hardware_draw_reply_async_);
181 SendDemandDrawHwReply(std::move(frame), output_surface_id, 225 // SendDemandDrawHwReply(std::move(frame), output_surface_id,
182 hardware_draw_reply_); 226 // hardware_draw_reply_);
227 SendDemandDrawHwReply(std::move(frame), output_surface_id);
183 inside_receive_ = false; 228 inside_receive_ = false;
184 } 229 }
185 230
186 void SynchronousCompositorProxy::SendDemandDrawHwReply( 231 void SynchronousCompositorProxy::SendDemandDrawHwReply_Sync(
187 cc::CompositorFrame frame, 232 cc::CompositorFrame frame,
188 uint32_t output_surface_id, 233 uint32_t output_surface_id,
189 IPC::Message* reply_message) { 234 IPC::Message* reply_message) {
190 SyncCompositorCommonRendererParams common_renderer_params; 235 SyncCompositorCommonRendererParams common_renderer_params;
191 PopulateCommonParams(&common_renderer_params); 236 PopulateCommonParams(&common_renderer_params);
192 SyncCompositorMsg_DemandDrawHw::WriteReplyParams( 237 SyncCompositorMsg_DemandDrawHw::WriteReplyParams(
193 reply_message, common_renderer_params, output_surface_id, frame); 238 reply_message, common_renderer_params, output_surface_id, frame);
194 Send(reply_message); 239 Send(reply_message);
195 } 240 }
196 241
242 void SynchronousCompositorProxy::SendDemandDrawHwReply(
243 cc::CompositorFrame frame,
244 uint32_t output_surface_id) {
245 // uint32_t output_surface_id,
246 // IPC::Message* reply_message) {
247 //
248 // SyncCompositorMsg_DemandDrawHw::WriteReplyParams(
249 // reply_message, common_renderer_params, output_surface_id, frame);
250 // Send(reply_message);
251 Send(new CompositorHostMsg_Frame(routing_id_, output_surface_id, frame));
252 }
253
197 struct SynchronousCompositorProxy::SharedMemoryWithSize { 254 struct SynchronousCompositorProxy::SharedMemoryWithSize {
198 base::SharedMemory shm; 255 base::SharedMemory shm;
199 const size_t buffer_size; 256 const size_t buffer_size;
200 bool zeroed; 257 bool zeroed;
201 258
202 SharedMemoryWithSize(base::SharedMemoryHandle shm_handle, size_t buffer_size) 259 SharedMemoryWithSize(base::SharedMemoryHandle shm_handle, size_t buffer_size)
203 : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {} 260 : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {}
204 }; 261 };
205 262
206 void SynchronousCompositorProxy::SetSharedMemory( 263 void SynchronousCompositorProxy::SetSharedMemory(
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 IPC::Message* reply_message) { 350 IPC::Message* reply_message) {
294 SyncCompositorCommonRendererParams common_renderer_params; 351 SyncCompositorCommonRendererParams common_renderer_params;
295 PopulateCommonParams(&common_renderer_params); 352 PopulateCommonParams(&common_renderer_params);
296 SyncCompositorMsg_DemandDrawSw::WriteReplyParams( 353 SyncCompositorMsg_DemandDrawSw::WriteReplyParams(
297 reply_message, success, common_renderer_params, frame); 354 reply_message, success, common_renderer_params, frame);
298 Send(reply_message); 355 Send(reply_message);
299 } 356 }
300 357
301 void SynchronousCompositorProxy::SwapBuffers(uint32_t output_surface_id, 358 void SynchronousCompositorProxy::SwapBuffers(uint32_t output_surface_id,
302 cc::CompositorFrame frame) { 359 cc::CompositorFrame frame) {
303 DCHECK(hardware_draw_reply_ || software_draw_reply_); 360 DCHECK(hardware_draw_reply_async_ || hardware_draw_reply_ ||
361 software_draw_reply_);
304 DCHECK(!(hardware_draw_reply_ && software_draw_reply_)); 362 DCHECK(!(hardware_draw_reply_ && software_draw_reply_));
305 if (hardware_draw_reply_) { 363 if (hardware_draw_reply_async_) {
306 SwapBuffersHw(output_surface_id, std::move(frame)); 364 SwapBuffersHw(output_surface_id, std::move(frame));
365 } else if (hardware_draw_reply_) {
366 SwapBuffersHw_Sync(output_surface_id, std::move(frame));
307 } else if (software_draw_reply_) { 367 } else if (software_draw_reply_) {
308 SwapBuffersSw(std::move(frame)); 368 SwapBuffersSw(std::move(frame));
309 } 369 }
310 } 370 }
311 371
312 void SynchronousCompositorProxy::OnComputeScroll( 372 void SynchronousCompositorProxy::OnComputeScroll(
313 base::TimeTicks animation_time) { 373 base::TimeTicks animation_time) {
314 if (need_animate_scroll_) { 374 if (need_animate_scroll_) {
315 need_animate_scroll_ = false; 375 need_animate_scroll_ = false;
316 input_handler_proxy_->SynchronouslyAnimate(animation_time); 376 input_handler_proxy_->SynchronouslyAnimate(animation_time);
(...skipping 12 matching lines...) Expand all
329 389
330 void SynchronousCompositorProxy::SetScroll( 390 void SynchronousCompositorProxy::SetScroll(
331 const gfx::ScrollOffset& new_total_scroll_offset) { 391 const gfx::ScrollOffset& new_total_scroll_offset) {
332 if (total_scroll_offset_ == new_total_scroll_offset) 392 if (total_scroll_offset_ == new_total_scroll_offset)
333 return; 393 return;
334 total_scroll_offset_ = new_total_scroll_offset; 394 total_scroll_offset_ = new_total_scroll_offset;
335 input_handler_proxy_->SynchronouslySetRootScrollOffset(total_scroll_offset_); 395 input_handler_proxy_->SynchronouslySetRootScrollOffset(total_scroll_offset_);
336 } 396 }
337 397
338 } // namespace content 398 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698