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

Side by Side Diff: content/browser/android/synchronous_compositor_host.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/browser/android/synchronous_compositor_host.h" 5 #include "content/browser/android/synchronous_compositor_host.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/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 RenderWidgetHostViewAndroid* rwhva, 64 RenderWidgetHostViewAndroid* rwhva,
65 SynchronousCompositorClient* client, 65 SynchronousCompositorClient* client,
66 bool use_in_proc_software_draw) 66 bool use_in_proc_software_draw)
67 : rwhva_(rwhva), 67 : rwhva_(rwhva),
68 client_(client), 68 client_(client),
69 ui_task_runner_( 69 ui_task_runner_(
70 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), 70 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
71 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), 71 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()),
72 sender_(rwhva_->GetRenderWidgetHost()), 72 sender_(rwhva_->GetRenderWidgetHost()),
73 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), 73 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw),
74 is_active_(false),
75 bytes_limit_(0u), 74 bytes_limit_(0u),
76 renderer_param_version_(0u), 75 renderer_param_version_(0u),
77 need_animate_scroll_(false), 76 need_animate_scroll_(false),
78 need_invalidate_count_(0u), 77 need_invalidate_count_(0u),
79 need_begin_frame_(false), 78 did_activate_pending_tree_count_(0u) {
80 did_activate_pending_tree_count_(0u),
81 weak_ptr_factory_(this) {
82 client_->DidInitializeCompositor(this); 79 client_->DidInitializeCompositor(this);
83 } 80 }
84 81
85 SynchronousCompositorHost::~SynchronousCompositorHost() { 82 SynchronousCompositorHost::~SynchronousCompositorHost() {
86 client_->DidDestroyCompositor(this); 83 client_->DidDestroyCompositor(this);
87 if (weak_ptr_factory_.HasWeakPtrs())
88 UpdateStateTask();
89 } 84 }
90 85
91 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) { 86 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) {
92 bool handled = true; 87 bool handled = true;
93 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message) 88 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message)
94 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OutputSurfaceCreated, 89 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OutputSurfaceCreated,
95 OutputSurfaceCreated) 90 OutputSurfaceCreated)
96 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams) 91 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams)
97 IPC_MESSAGE_UNHANDLED(handled = false) 92 IPC_MESSAGE_UNHANDLED(handled = false)
98 IPC_END_MESSAGE_MAP() 93 IPC_END_MESSAGE_MAP()
99 return handled; 94 return handled;
100 } 95 }
101 96
102 void SynchronousCompositorHost::DidBecomeCurrent() { 97 void SynchronousCompositorHost::DidBecomeCurrent() {
103 client_->DidBecomeCurrent(this); 98 client_->DidBecomeCurrent(this);
104 } 99 }
105 100
106 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw( 101 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw(
107 const gfx::Size& surface_size, 102 const gfx::Size& surface_size,
108 const gfx::Transform& transform, 103 const gfx::Transform& transform,
109 const gfx::Rect& viewport, 104 const gfx::Rect& viewport,
110 const gfx::Rect& clip, 105 const gfx::Rect& clip,
111 const gfx::Rect& viewport_rect_for_tile_priority, 106 const gfx::Rect& viewport_rect_for_tile_priority,
112 const gfx::Transform& transform_for_tile_priority) { 107 const gfx::Transform& transform_for_tile_priority) {
113 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport, 108 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport,
114 clip, viewport_rect_for_tile_priority, 109 clip, viewport_rect_for_tile_priority,
115 transform_for_tile_priority); 110 transform_for_tile_priority);
116 SynchronousCompositor::Frame frame; 111 SynchronousCompositor::Frame frame;
117 frame.frame.reset(new cc::CompositorFrame); 112 frame.frame.reset(new cc::CompositorFrame);
118 SyncCompositorCommonBrowserParams common_browser_params;
119 PopulateCommonParams(&common_browser_params);
120 SyncCompositorCommonRendererParams common_renderer_params; 113 SyncCompositorCommonRendererParams common_renderer_params;
121 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( 114 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw(
122 routing_id_, common_browser_params, params, &common_renderer_params, 115 routing_id_, params, &common_renderer_params,
123 &frame.output_surface_id, frame.frame.get()))) { 116 &frame.output_surface_id, frame.frame.get()))) {
124 return SynchronousCompositor::Frame(); 117 return SynchronousCompositor::Frame();
125 } 118 }
126 ProcessCommonParams(common_renderer_params); 119 ProcessCommonParams(common_renderer_params);
127 if (!frame.frame->delegated_frame_data) { 120 if (!frame.frame->delegated_frame_data) {
128 // This can happen if compositor did not swap in this draw. 121 // This can happen if compositor did not swap in this draw.
129 frame.frame.reset(); 122 frame.frame.reset();
130 } 123 }
131 if (frame.frame) { 124 if (frame.frame) {
132 UpdateFrameMetaData(frame.frame->metadata); 125 UpdateFrameMetaData(frame.frame->metadata);
(...skipping 18 matching lines...) Expand all
151 SynchronousCompositorSetSkCanvas(nullptr); 144 SynchronousCompositorSetSkCanvas(nullptr);
152 } 145 }
153 146
154 private: 147 private:
155 DISALLOW_COPY_AND_ASSIGN(ScopedSetSkCanvas); 148 DISALLOW_COPY_AND_ASSIGN(ScopedSetSkCanvas);
156 }; 149 };
157 150
158 } 151 }
159 152
160 bool SynchronousCompositorHost::DemandDrawSwInProc(SkCanvas* canvas) { 153 bool SynchronousCompositorHost::DemandDrawSwInProc(SkCanvas* canvas) {
161 SyncCompositorCommonBrowserParams common_browser_params;
162 PopulateCommonParams(&common_browser_params);
163 SyncCompositorCommonRendererParams common_renderer_params; 154 SyncCompositorCommonRendererParams common_renderer_params;
164 bool success = false; 155 bool success = false;
165 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); 156 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
166 ScopedSetSkCanvas set_sk_canvas(canvas); 157 ScopedSetSkCanvas set_sk_canvas(canvas);
167 SyncCompositorDemandDrawSwParams params; // Unused. 158 SyncCompositorDemandDrawSwParams params; // Unused.
168 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( 159 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw(
169 routing_id_, common_browser_params, params, &success, 160 routing_id_, params, &success, &common_renderer_params,
170 &common_renderer_params, frame.get()))) { 161 frame.get()))) {
171 return false; 162 return false;
172 } 163 }
173 if (!success) 164 if (!success)
174 return false; 165 return false;
175 ProcessCommonParams(common_renderer_params); 166 ProcessCommonParams(common_renderer_params);
176 UpdateFrameMetaData(frame->metadata); 167 UpdateFrameMetaData(frame->metadata);
177 return true; 168 return true;
178 } 169 }
179 170
180 class SynchronousCompositorHost::ScopedSendZeroMemory { 171 class SynchronousCompositorHost::ScopedSendZeroMemory {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 size_t stride = info.minRowBytes(); 211 size_t stride = info.minRowBytes();
221 size_t buffer_size = info.getSafeSize(stride); 212 size_t buffer_size = info.getSafeSize(stride);
222 if (!buffer_size) 213 if (!buffer_size)
223 return false; // Overflow. 214 return false; // Overflow.
224 215
225 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size); 216 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size);
226 if (!software_draw_shm_) 217 if (!software_draw_shm_)
227 return false; 218 return false;
228 219
229 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); 220 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
230 SyncCompositorCommonBrowserParams common_browser_params;
231 PopulateCommonParams(&common_browser_params);
232 SyncCompositorCommonRendererParams common_renderer_params; 221 SyncCompositorCommonRendererParams common_renderer_params;
233 bool success = false; 222 bool success = false;
234 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( 223 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw(
235 routing_id_, common_browser_params, params, &success, 224 routing_id_, params, &success, &common_renderer_params,
236 &common_renderer_params, frame.get()))) { 225 frame.get()))) {
237 return false; 226 return false;
238 } 227 }
239 ScopedSendZeroMemory send_zero_memory(this); 228 ScopedSendZeroMemory send_zero_memory(this);
240 if (!success) 229 if (!success)
241 return false; 230 return false;
242 231
243 ProcessCommonParams(common_renderer_params); 232 ProcessCommonParams(common_renderer_params);
244 UpdateFrameMetaData(frame->metadata); 233 UpdateFrameMetaData(frame->metadata);
245 234
246 SkBitmap bitmap; 235 SkBitmap bitmap;
(...skipping 28 matching lines...) Expand all
275 264
276 SyncCompositorSetSharedMemoryParams set_shm_params; 265 SyncCompositorSetSharedMemoryParams set_shm_params;
277 set_shm_params.buffer_size = buffer_size; 266 set_shm_params.buffer_size = buffer_size;
278 base::ProcessHandle renderer_process_handle = 267 base::ProcessHandle renderer_process_handle =
279 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); 268 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle();
280 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle, 269 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle,
281 &set_shm_params.shm_handle)) { 270 &set_shm_params.shm_handle)) {
282 return; 271 return;
283 } 272 }
284 273
285 SyncCompositorCommonBrowserParams common_browser_params;
286 PopulateCommonParams(&common_browser_params);
287 bool success = false; 274 bool success = false;
288 SyncCompositorCommonRendererParams common_renderer_params; 275 SyncCompositorCommonRendererParams common_renderer_params;
289 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory( 276 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory(
290 routing_id_, common_browser_params, set_shm_params, &success, 277 routing_id_, set_shm_params, &success, &common_renderer_params)) ||
291 &common_renderer_params)) ||
292 !success) { 278 !success) {
293 return; 279 return;
294 } 280 }
295 software_draw_shm_ = std::move(software_draw_shm); 281 software_draw_shm_ = std::move(software_draw_shm);
296 ProcessCommonParams(common_renderer_params); 282 ProcessCommonParams(common_renderer_params);
297 } 283 }
298 284
299 void SynchronousCompositorHost::SendZeroMemory() { 285 void SynchronousCompositorHost::SendZeroMemory() {
300 // No need to check return value. 286 // No need to check return value.
301 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); 287 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_));
(...skipping 19 matching lines...) Expand all
321 307
322 void SynchronousCompositorHost::DidChangeRootLayerScrollOffset( 308 void SynchronousCompositorHost::DidChangeRootLayerScrollOffset(
323 const gfx::ScrollOffset& root_offset) { 309 const gfx::ScrollOffset& root_offset) {
324 if (root_scroll_offset_ == root_offset) 310 if (root_scroll_offset_ == root_offset)
325 return; 311 return;
326 root_scroll_offset_ = root_offset; 312 root_scroll_offset_ = root_offset;
327 sender_->Send( 313 sender_->Send(
328 new SyncCompositorMsg_SetScroll(routing_id_, root_scroll_offset_)); 314 new SyncCompositorMsg_SetScroll(routing_id_, root_scroll_offset_));
329 } 315 }
330 316
331 void SynchronousCompositorHost::SendAsyncCompositorStateIfNeeded() {
332 if (weak_ptr_factory_.HasWeakPtrs())
333 return;
334
335 ui_task_runner_->PostTask(
336 FROM_HERE, base::Bind(&SynchronousCompositorHost::UpdateStateTask,
337 weak_ptr_factory_.GetWeakPtr()));
338 }
339
340 void SynchronousCompositorHost::UpdateStateTask() {
341 SyncCompositorCommonBrowserParams common_browser_params;
342 PopulateCommonParams(&common_browser_params);
343 sender_->Send(
344 new SyncCompositorMsg_UpdateState(routing_id_, common_browser_params));
345 DCHECK(!weak_ptr_factory_.HasWeakPtrs());
346 }
347
348 void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta, 317 void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta,
349 const gfx::Point& anchor) { 318 const gfx::Point& anchor) {
350 SyncCompositorCommonBrowserParams common_browser_params;
351 PopulateCommonParams(&common_browser_params);
352 SyncCompositorCommonRendererParams common_renderer_params; 319 SyncCompositorCommonRendererParams common_renderer_params;
353 if (!sender_->Send(new SyncCompositorMsg_ZoomBy( 320 if (!sender_->Send(new SyncCompositorMsg_ZoomBy(
354 routing_id_, common_browser_params, zoom_delta, anchor, 321 routing_id_, zoom_delta, anchor, &common_renderer_params))) {
355 &common_renderer_params))) {
356 return; 322 return;
357 } 323 }
358 ProcessCommonParams(common_renderer_params); 324 ProcessCommonParams(common_renderer_params);
359 } 325 }
360 326
361 void SynchronousCompositorHost::SetIsActive(bool is_active) {
362 if (is_active_ == is_active)
363 return;
364 is_active_ = is_active;
365 UpdateNeedsBeginFrames();
366 SendAsyncCompositorStateIfNeeded();
367 }
368
369 void SynchronousCompositorHost::OnComputeScroll( 327 void SynchronousCompositorHost::OnComputeScroll(
370 base::TimeTicks animation_time) { 328 base::TimeTicks animation_time) {
371 if (!need_animate_scroll_) 329 if (!need_animate_scroll_)
372 return; 330 return;
373 need_animate_scroll_ = false; 331 need_animate_scroll_ = false;
374 332
375 SyncCompositorCommonBrowserParams common_browser_params;
376 PopulateCommonParams(&common_browser_params);
377 SyncCompositorCommonRendererParams common_renderer_params; 333 SyncCompositorCommonRendererParams common_renderer_params;
378 sender_->Send(new SyncCompositorMsg_ComputeScroll( 334 sender_->Send(
379 routing_id_, common_browser_params, animation_time)); 335 new SyncCompositorMsg_ComputeScroll(routing_id_, animation_time));
380 } 336 }
381 337
382 void SynchronousCompositorHost::DidOverscroll( 338 void SynchronousCompositorHost::DidOverscroll(
383 const DidOverscrollParams& over_scroll_params) { 339 const DidOverscrollParams& over_scroll_params) {
384 client_->DidOverscroll(over_scroll_params.accumulated_overscroll, 340 client_->DidOverscroll(over_scroll_params.accumulated_overscroll,
385 over_scroll_params.latest_overscroll_delta, 341 over_scroll_params.latest_overscroll_delta,
386 over_scroll_params.current_fling_velocity); 342 over_scroll_params.current_fling_velocity);
387 } 343 }
388 344
389 void SynchronousCompositorHost::BeginFrame(const cc::BeginFrameArgs& args) { 345 void SynchronousCompositorHost::DidSendBeginFrame() {
390 if (!is_active_)
391 return;
392
393 SyncCompositorCommonBrowserParams common_browser_params;
394 PopulateCommonParams(&common_browser_params);
395 SyncCompositorCommonRendererParams common_renderer_params; 346 SyncCompositorCommonRendererParams common_renderer_params;
396 if (!sender_->Send( 347 if (!sender_->Send(new SyncCompositorMsg_SynchronizeRendererState(
397 new SyncCompositorMsg_BeginFrame(routing_id_, common_browser_params, 348 routing_id_, &common_renderer_params))) {
398 args, &common_renderer_params))) {
399 return; 349 return;
400 } 350 }
401 ProcessCommonParams(common_renderer_params); 351 ProcessCommonParams(common_renderer_params);
402 } 352 }
403 353
404 void SynchronousCompositorHost::OutputSurfaceCreated() { 354 void SynchronousCompositorHost::OutputSurfaceCreated() {
405 // New output surface is not aware of state from Browser side. So need to 355 // New output surface is not aware of state from Browser side. So need to
406 // re-send all browser side state here. 356 // re-send all browser side state here.
407 sender_->Send( 357 sender_->Send(
408 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_)); 358 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_));
409 } 359 }
410 360
411 void SynchronousCompositorHost::PopulateCommonParams(
412 SyncCompositorCommonBrowserParams* params) {
413 DCHECK(params);
414 params->begin_frame_source_paused = !is_active_;
415
416 weak_ptr_factory_.InvalidateWeakPtrs();
417 }
418
419 void SynchronousCompositorHost::ProcessCommonParams( 361 void SynchronousCompositorHost::ProcessCommonParams(
420 const SyncCompositorCommonRendererParams& params) { 362 const SyncCompositorCommonRendererParams& params) {
421 // Ignore if |renderer_param_version_| is newer than |params.version|. This 363 // Ignore if |renderer_param_version_| is newer than |params.version|. This
422 // comparison takes into account when the unsigned int wraps. 364 // comparison takes into account when the unsigned int wraps.
423 if ((renderer_param_version_ - params.version) < 0x80000000) { 365 if ((renderer_param_version_ - params.version) < 0x80000000) {
424 return; 366 return;
425 } 367 }
426 renderer_param_version_ = params.version; 368 renderer_param_version_ = params.version;
427 need_animate_scroll_ = params.need_animate_scroll; 369 need_animate_scroll_ = params.need_animate_scroll;
428 if (need_begin_frame_ != params.need_begin_frame) {
429 need_begin_frame_ = params.need_begin_frame;
430 UpdateNeedsBeginFrames();
431 }
432 root_scroll_offset_ = params.total_scroll_offset; 370 root_scroll_offset_ = params.total_scroll_offset;
433 371
434 if (need_invalidate_count_ != params.need_invalidate_count) { 372 if (need_invalidate_count_ != params.need_invalidate_count) {
435 need_invalidate_count_ = params.need_invalidate_count; 373 need_invalidate_count_ = params.need_invalidate_count;
436 client_->PostInvalidate(); 374 client_->PostInvalidate();
437 } 375 }
438 376
439 if (did_activate_pending_tree_count_ != 377 if (did_activate_pending_tree_count_ !=
440 params.did_activate_pending_tree_count) { 378 params.did_activate_pending_tree_count) {
441 did_activate_pending_tree_count_ = params.did_activate_pending_tree_count; 379 did_activate_pending_tree_count_ = params.did_activate_pending_tree_count;
442 client_->DidUpdateContent(); 380 client_->DidUpdateContent();
443 } 381 }
444 382
445 // Ensure only valid values from compositor are sent to client. 383 // Ensure only valid values from compositor are sent to client.
446 // Compositor has page_scale_factor set to 0 before initialization, so check 384 // Compositor has page_scale_factor set to 0 before initialization, so check
447 // for that case here. 385 // for that case here.
448 if (params.page_scale_factor) { 386 if (params.page_scale_factor) {
449 client_->UpdateRootLayerState( 387 client_->UpdateRootLayerState(
450 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset), 388 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset),
451 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset), 389 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset),
452 params.scrollable_size, params.page_scale_factor, 390 params.scrollable_size, params.page_scale_factor,
453 params.min_page_scale_factor, params.max_page_scale_factor); 391 params.min_page_scale_factor, params.max_page_scale_factor);
454 } 392 }
455 } 393 }
456 394
457 void SynchronousCompositorHost::UpdateNeedsBeginFrames() {
458 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_);
459 }
460
461 } // namespace content 395 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698