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

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

Issue 1969263004: sync compositor: Remove begin frame source (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase onto https://codereview.chromium.org/1974133002/ Created 4 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 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"
11 #include "content/common/android/sync_compositor_messages.h" 11 #include "content/common/android/sync_compositor_messages.h"
12 #include "content/common/android/sync_compositor_statics.h" 12 #include "content/common/android/sync_compositor_statics.h"
13 #include "content/public/common/content_switches.h" 13 #include "content/public/common/content_switches.h"
14 #include "ipc/ipc_message.h" 14 #include "ipc/ipc_message.h"
15 #include "ipc/ipc_sender.h" 15 #include "ipc/ipc_sender.h"
16 #include "third_party/skia/include/core/SkBitmap.h" 16 #include "third_party/skia/include/core/SkBitmap.h"
17 #include "third_party/skia/include/core/SkCanvas.h" 17 #include "third_party/skia/include/core/SkCanvas.h"
18 #include "third_party/skia/include/core/SkImageInfo.h" 18 #include "third_party/skia/include/core/SkImageInfo.h"
19 #include "third_party/skia/include/core/SkRegion.h" 19 #include "third_party/skia/include/core/SkRegion.h"
20 #include "ui/gfx/skia_util.h" 20 #include "ui/gfx/skia_util.h"
21 21
22 namespace content { 22 namespace content {
23 23
24 SynchronousCompositorProxy::SynchronousCompositorProxy( 24 SynchronousCompositorProxy::SynchronousCompositorProxy(
25 int routing_id, 25 int routing_id,
26 IPC::Sender* sender, 26 IPC::Sender* sender,
27 SynchronousCompositorExternalBeginFrameSource* begin_frame_source,
28 ui::SynchronousInputHandlerProxy* input_handler_proxy) 27 ui::SynchronousInputHandlerProxy* input_handler_proxy)
29 : routing_id_(routing_id), 28 : routing_id_(routing_id),
30 sender_(sender), 29 sender_(sender),
31 begin_frame_source_(begin_frame_source),
32 input_handler_proxy_(input_handler_proxy), 30 input_handler_proxy_(input_handler_proxy),
33 use_in_process_zero_copy_software_draw_( 31 use_in_process_zero_copy_software_draw_(
34 base::CommandLine::ForCurrentProcess()->HasSwitch( 32 base::CommandLine::ForCurrentProcess()->HasSwitch(
35 switches::kSingleProcess)), 33 switches::kSingleProcess)),
36 output_surface_(nullptr), 34 output_surface_(nullptr),
37 inside_receive_(false), 35 inside_receive_(false),
38 hardware_draw_reply_(nullptr), 36 hardware_draw_reply_(nullptr),
39 software_draw_reply_(nullptr), 37 software_draw_reply_(nullptr),
40 version_(0u), 38 version_(0u),
41 page_scale_factor_(0.f), 39 page_scale_factor_(0.f),
42 min_page_scale_factor_(0.f), 40 min_page_scale_factor_(0.f),
43 max_page_scale_factor_(0.f), 41 max_page_scale_factor_(0.f),
44 need_animate_scroll_(false), 42 need_animate_scroll_(false),
45 need_invalidate_count_(0u), 43 need_invalidate_count_(0u),
46 need_begin_frame_(false),
47 did_activate_pending_tree_count_(0u) { 44 did_activate_pending_tree_count_(0u) {
48 DCHECK(begin_frame_source_);
49 DCHECK(input_handler_proxy_); 45 DCHECK(input_handler_proxy_);
50 begin_frame_source_->SetClient(this);
51 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); 46 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this);
52 } 47 }
53 48
54 SynchronousCompositorProxy::~SynchronousCompositorProxy() { 49 SynchronousCompositorProxy::~SynchronousCompositorProxy() {
55 SetOutputSurface(nullptr); 50 SetOutputSurface(nullptr);
56 begin_frame_source_->SetClient(nullptr);
57 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(nullptr); 51 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(nullptr);
58 } 52 }
59 53
60 void SynchronousCompositorProxy::SetOutputSurface( 54 void SynchronousCompositorProxy::SetOutputSurface(
61 SynchronousCompositorOutputSurface* output_surface) { 55 SynchronousCompositorOutputSurface* output_surface) {
62 DCHECK_NE(output_surface_, output_surface); 56 DCHECK_NE(output_surface_, output_surface);
63 if (output_surface_) { 57 if (output_surface_) {
64 output_surface_->SetSyncClient(nullptr); 58 output_surface_->SetSyncClient(nullptr);
65 } 59 }
66 output_surface_ = output_surface; 60 output_surface_ = output_surface;
(...skipping 24 matching lines...) Expand all
91 max_scroll_offset_ = max_scroll_offset; 85 max_scroll_offset_ = max_scroll_offset;
92 scrollable_size_ = scrollable_size; 86 scrollable_size_ = scrollable_size;
93 page_scale_factor_ = page_scale_factor; 87 page_scale_factor_ = page_scale_factor;
94 min_page_scale_factor_ = min_page_scale_factor; 88 min_page_scale_factor_ = min_page_scale_factor;
95 max_page_scale_factor_ = max_page_scale_factor; 89 max_page_scale_factor_ = max_page_scale_factor;
96 90
97 SendAsyncRendererStateIfNeeded(); 91 SendAsyncRendererStateIfNeeded();
98 } 92 }
99 } 93 }
100 94
101 void SynchronousCompositorProxy::OnNeedsBeginFramesChange(
102 bool needs_begin_frames) {
103 if (need_begin_frame_ == needs_begin_frames)
104 return;
105 need_begin_frame_ = needs_begin_frames;
106 SendAsyncRendererStateIfNeeded();
107 }
108
109 void SynchronousCompositorProxy::Invalidate() { 95 void SynchronousCompositorProxy::Invalidate() {
110 ++need_invalidate_count_; 96 ++need_invalidate_count_;
111 SendAsyncRendererStateIfNeeded(); 97 SendAsyncRendererStateIfNeeded();
112 } 98 }
113 99
114 void SynchronousCompositorProxy::DidActivatePendingTree() { 100 void SynchronousCompositorProxy::DidActivatePendingTree() {
115 ++did_activate_pending_tree_count_; 101 ++did_activate_pending_tree_count_;
116 SendAsyncRendererStateIfNeeded(); 102 SendAsyncRendererStateIfNeeded();
117 } 103 }
118 104
119 void SynchronousCompositorProxy::SendAsyncRendererStateIfNeeded() { 105 void SynchronousCompositorProxy::SendAsyncRendererStateIfNeeded() {
120 if (inside_receive_) 106 if (inside_receive_)
121 return; 107 return;
122 SyncCompositorCommonRendererParams params; 108 SyncCompositorCommonRendererParams params;
123 PopulateCommonParams(&params); 109 PopulateCommonParams(&params);
124 Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params)); 110 Send(new SyncCompositorHostMsg_UpdateState(routing_id_, params));
125 } 111 }
126 112
127 void SynchronousCompositorProxy::PopulateCommonParams( 113 void SynchronousCompositorProxy::PopulateCommonParams(
128 SyncCompositorCommonRendererParams* params) const { 114 SyncCompositorCommonRendererParams* params) const {
129 params->version = ++version_; 115 params->version = ++version_;
130 params->total_scroll_offset = total_scroll_offset_; 116 params->total_scroll_offset = total_scroll_offset_;
131 params->max_scroll_offset = max_scroll_offset_; 117 params->max_scroll_offset = max_scroll_offset_;
132 params->scrollable_size = scrollable_size_; 118 params->scrollable_size = scrollable_size_;
133 params->page_scale_factor = page_scale_factor_; 119 params->page_scale_factor = page_scale_factor_;
134 params->min_page_scale_factor = min_page_scale_factor_; 120 params->min_page_scale_factor = min_page_scale_factor_;
135 params->max_page_scale_factor = max_page_scale_factor_; 121 params->max_page_scale_factor = max_page_scale_factor_;
136 params->need_animate_scroll = need_animate_scroll_; 122 params->need_animate_scroll = need_animate_scroll_;
137 params->need_invalidate_count = need_invalidate_count_; 123 params->need_invalidate_count = need_invalidate_count_;
138 params->need_begin_frame = need_begin_frame_;
139 params->did_activate_pending_tree_count = did_activate_pending_tree_count_; 124 params->did_activate_pending_tree_count = did_activate_pending_tree_count_;
140 } 125 }
141 126
142 void SynchronousCompositorProxy::OnMessageReceived( 127 void SynchronousCompositorProxy::OnMessageReceived(
143 const IPC::Message& message) { 128 const IPC::Message& message) {
144 if (output_surface_ && output_surface_->OnMessageReceived(message)) 129 if (output_surface_ && output_surface_->OnMessageReceived(message))
145 return; 130 return;
146 131
147 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) 132 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message)
148 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) 133 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SynchronizeRendererState,
134 PopulateCommonParams)
149 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) 135 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll)
150 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw, 136 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw,
151 DemandDrawHw) 137 DemandDrawHw)
152 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory) 138 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory)
153 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) 139 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory)
154 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw, 140 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw,
155 DemandDrawSw) 141 DemandDrawSw)
156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams)
157 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZoomBy, SynchronouslyZoomBy) 142 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZoomBy, SynchronouslyZoomBy)
158 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetScroll, SetScroll) 143 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetScroll, SetScroll)
159 IPC_END_MESSAGE_MAP() 144 IPC_END_MESSAGE_MAP()
160 } 145 }
161 146
162 bool SynchronousCompositorProxy::Send(IPC::Message* message) { 147 bool SynchronousCompositorProxy::Send(IPC::Message* message) {
163 return sender_->Send(message); 148 return sender_->Send(message);
164 } 149 }
165 150
166 void SynchronousCompositorProxy::BeginFrame(
167 const SyncCompositorCommonBrowserParams& common_params,
168 const cc::BeginFrameArgs& args,
169 SyncCompositorCommonRendererParams* common_renderer_params) {
170 DCHECK(!inside_receive_);
171 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true);
172
173 ProcessCommonParams(common_params);
174 if (need_begin_frame_) {
175 begin_frame_source_->BeginFrame(args);
176 }
177 PopulateCommonParams(common_renderer_params);
178 }
179
180 void SynchronousCompositorProxy::DemandDrawHw( 151 void SynchronousCompositorProxy::DemandDrawHw(
181 const SyncCompositorCommonBrowserParams& common_params,
182 const SyncCompositorDemandDrawHwParams& params, 152 const SyncCompositorDemandDrawHwParams& params,
183 IPC::Message* reply_message) { 153 IPC::Message* reply_message) {
184 DCHECK(!inside_receive_); 154 DCHECK(!inside_receive_);
185 DCHECK(reply_message); 155 DCHECK(reply_message);
186 156
187 inside_receive_ = true; 157 inside_receive_ = true;
188 ProcessCommonParams(common_params);
189 158
190 if (output_surface_) { 159 if (output_surface_) {
191 base::AutoReset<IPC::Message*> scoped_hardware_draw_reply( 160 base::AutoReset<IPC::Message*> scoped_hardware_draw_reply(
192 &hardware_draw_reply_, reply_message); 161 &hardware_draw_reply_, reply_message);
193 output_surface_->DemandDrawHw(params.surface_size, params.transform, 162 output_surface_->DemandDrawHw(params.surface_size, params.transform,
194 params.viewport, params.clip, 163 params.viewport, params.clip,
195 params.viewport_rect_for_tile_priority, 164 params.viewport_rect_for_tile_priority,
196 params.transform_for_tile_priority); 165 params.transform_for_tile_priority);
197 } 166 }
198 167
(...skipping 28 matching lines...) Expand all
227 struct SynchronousCompositorProxy::SharedMemoryWithSize { 196 struct SynchronousCompositorProxy::SharedMemoryWithSize {
228 base::SharedMemory shm; 197 base::SharedMemory shm;
229 const size_t buffer_size; 198 const size_t buffer_size;
230 bool zeroed; 199 bool zeroed;
231 200
232 SharedMemoryWithSize(base::SharedMemoryHandle shm_handle, size_t buffer_size) 201 SharedMemoryWithSize(base::SharedMemoryHandle shm_handle, size_t buffer_size)
233 : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {} 202 : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {}
234 }; 203 };
235 204
236 void SynchronousCompositorProxy::SetSharedMemory( 205 void SynchronousCompositorProxy::SetSharedMemory(
237 const SyncCompositorCommonBrowserParams& common_params,
238 const SyncCompositorSetSharedMemoryParams& params, 206 const SyncCompositorSetSharedMemoryParams& params,
239 bool* success, 207 bool* success,
240 SyncCompositorCommonRendererParams* common_renderer_params) { 208 SyncCompositorCommonRendererParams* common_renderer_params) {
241 DCHECK(!inside_receive_); 209 DCHECK(!inside_receive_);
242 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); 210 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true);
243 211
244 *success = false; 212 *success = false;
245 ProcessCommonParams(common_params);
246 if (!base::SharedMemory::IsHandleValid(params.shm_handle)) 213 if (!base::SharedMemory::IsHandleValid(params.shm_handle))
247 return; 214 return;
248 215
249 software_draw_shm_.reset( 216 software_draw_shm_.reset(
250 new SharedMemoryWithSize(params.shm_handle, params.buffer_size)); 217 new SharedMemoryWithSize(params.shm_handle, params.buffer_size));
251 if (!software_draw_shm_->shm.Map(params.buffer_size)) 218 if (!software_draw_shm_->shm.Map(params.buffer_size))
252 return; 219 return;
253 DCHECK(software_draw_shm_->shm.memory()); 220 DCHECK(software_draw_shm_->shm.memory());
254 PopulateCommonParams(common_renderer_params); 221 PopulateCommonParams(common_renderer_params);
255 *success = true; 222 *success = true;
256 } 223 }
257 224
258 void SynchronousCompositorProxy::ZeroSharedMemory() { 225 void SynchronousCompositorProxy::ZeroSharedMemory() {
259 DCHECK(!software_draw_shm_->zeroed); 226 // It is possible for this to get called twice, eg. if draw is called before
227 // the OutputSurface is ready. Just ignore duplicated calls rather than
228 // inventing a complicated system to avoid it.
229 if (software_draw_shm_->zeroed)
230 return;
231
260 memset(software_draw_shm_->shm.memory(), 0, software_draw_shm_->buffer_size); 232 memset(software_draw_shm_->shm.memory(), 0, software_draw_shm_->buffer_size);
261 software_draw_shm_->zeroed = true; 233 software_draw_shm_->zeroed = true;
262 } 234 }
263 235
264 void SynchronousCompositorProxy::DemandDrawSw( 236 void SynchronousCompositorProxy::DemandDrawSw(
265 const SyncCompositorCommonBrowserParams& common_params,
266 const SyncCompositorDemandDrawSwParams& params, 237 const SyncCompositorDemandDrawSwParams& params,
267 IPC::Message* reply_message) { 238 IPC::Message* reply_message) {
268 DCHECK(!inside_receive_); 239 DCHECK(!inside_receive_);
269 inside_receive_ = true; 240 inside_receive_ = true;
270 ProcessCommonParams(common_params);
271 if (output_surface_) { 241 if (output_surface_) {
272 base::AutoReset<IPC::Message*> scoped_software_draw_reply( 242 base::AutoReset<IPC::Message*> scoped_software_draw_reply(
273 &software_draw_reply_, reply_message); 243 &software_draw_reply_, reply_message);
274 SkCanvas* sk_canvas_for_draw = SynchronousCompositorGetSkCanvas(); 244 SkCanvas* sk_canvas_for_draw = SynchronousCompositorGetSkCanvas();
275 if (use_in_process_zero_copy_software_draw_) { 245 if (use_in_process_zero_copy_software_draw_) {
276 DCHECK(sk_canvas_for_draw); 246 DCHECK(sk_canvas_for_draw);
277 output_surface_->DemandDrawSw(sk_canvas_for_draw); 247 output_surface_->DemandDrawSw(sk_canvas_for_draw);
278 } else { 248 } else {
279 DCHECK(!sk_canvas_for_draw); 249 DCHECK(!sk_canvas_for_draw);
280 DoDemandDrawSw(params); 250 DoDemandDrawSw(params);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 DCHECK(hardware_draw_reply_ || software_draw_reply_); 304 DCHECK(hardware_draw_reply_ || software_draw_reply_);
335 DCHECK(!(hardware_draw_reply_ && software_draw_reply_)); 305 DCHECK(!(hardware_draw_reply_ && software_draw_reply_));
336 if (hardware_draw_reply_) { 306 if (hardware_draw_reply_) {
337 SwapBuffersHw(output_surface_id, frame); 307 SwapBuffersHw(output_surface_id, frame);
338 } else if (software_draw_reply_) { 308 } else if (software_draw_reply_) {
339 SwapBuffersSw(frame); 309 SwapBuffersSw(frame);
340 } 310 }
341 } 311 }
342 312
343 void SynchronousCompositorProxy::OnComputeScroll( 313 void SynchronousCompositorProxy::OnComputeScroll(
344 const SyncCompositorCommonBrowserParams& common_params,
345 base::TimeTicks animation_time) { 314 base::TimeTicks animation_time) {
346 ProcessCommonParams(common_params);
347 if (need_animate_scroll_) { 315 if (need_animate_scroll_) {
348 need_animate_scroll_ = false; 316 need_animate_scroll_ = false;
349 input_handler_proxy_->SynchronouslyAnimate(animation_time); 317 input_handler_proxy_->SynchronouslyAnimate(animation_time);
350 } 318 }
351 } 319 }
352 320
353 void SynchronousCompositorProxy::SynchronouslyZoomBy( 321 void SynchronousCompositorProxy::SynchronouslyZoomBy(
354 const SyncCompositorCommonBrowserParams& common_params,
355 float zoom_delta, 322 float zoom_delta,
356 const gfx::Point& anchor, 323 const gfx::Point& anchor,
357 SyncCompositorCommonRendererParams* common_renderer_params) { 324 SyncCompositorCommonRendererParams* common_renderer_params) {
358 DCHECK(!inside_receive_); 325 DCHECK(!inside_receive_);
359 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); 326 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true);
360 ProcessCommonParams(common_params);
361 input_handler_proxy_->SynchronouslyZoomBy(zoom_delta, anchor); 327 input_handler_proxy_->SynchronouslyZoomBy(zoom_delta, anchor);
362 PopulateCommonParams(common_renderer_params); 328 PopulateCommonParams(common_renderer_params);
363 } 329 }
364 330
365 void SynchronousCompositorProxy::SetScroll( 331 void SynchronousCompositorProxy::SetScroll(
366 const gfx::ScrollOffset& new_total_scroll_offset) { 332 const gfx::ScrollOffset& new_total_scroll_offset) {
367 if (total_scroll_offset_ == new_total_scroll_offset) 333 if (total_scroll_offset_ == new_total_scroll_offset)
368 return; 334 return;
369 total_scroll_offset_ = new_total_scroll_offset; 335 total_scroll_offset_ = new_total_scroll_offset;
370 input_handler_proxy_->SynchronouslySetRootScrollOffset(total_scroll_offset_); 336 input_handler_proxy_->SynchronouslySetRootScrollOffset(total_scroll_offset_);
371 } 337 }
372 338
373 void SynchronousCompositorProxy::ProcessCommonParams(
374 const SyncCompositorCommonBrowserParams& common_params) {
375 begin_frame_source_->SetBeginFrameSourcePaused(
376 common_params.begin_frame_source_paused);
377 }
378
379 } // namespace content 339 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/android/synchronous_compositor_proxy.h ('k') | content/renderer/android/synchronous_compositor_registry.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698