blob: 37417e5ee934b2e53f61290dfb583b0f574fe321 [file] [log] [blame]
boliubee541f42015-11-05 00:52:531// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/android/synchronous_compositor_host.h"
6
boliucafb1bf2015-12-29 01:40:197#include <utility>
8
boliuc99f26c12016-04-21 21:58:599#include "base/command_line.h"
boliubee541f42015-11-05 00:52:5310#include "base/containers/hash_tables.h"
boliuc99f26c12016-04-21 21:58:5911#include "base/memory/ptr_util.h"
boliuf6d263e2015-11-25 03:53:5812#include "base/memory/shared_memory.h"
13#include "base/trace_event/trace_event_argument.h"
boliubee541f42015-11-05 00:52:5314#include "cc/output/compositor_frame_ack.h"
boliubee541f42015-11-05 00:52:5315#include "content/browser/renderer_host/render_widget_host_view_android.h"
boliuc99f26c12016-04-21 21:58:5916#include "content/browser/web_contents/web_contents_android.h"
boliubee541f42015-11-05 00:52:5317#include "content/browser/web_contents/web_contents_impl.h"
18#include "content/common/android/sync_compositor_messages.h"
jbroman801dd272016-04-22 18:54:0219#include "content/common/android/sync_compositor_statics.h"
boliubee541f42015-11-05 00:52:5320#include "content/public/browser/android/synchronous_compositor_client.h"
hush92bd35e72015-11-13 22:57:3721#include "content/public/browser/browser_thread.h"
boliubee541f42015-11-05 00:52:5322#include "content/public/browser/render_view_host.h"
boliuc99f26c12016-04-21 21:58:5923#include "content/public/common/content_switches.h"
boliubee541f42015-11-05 00:52:5324#include "ipc/ipc_sender.h"
boliuf6d263e2015-11-25 03:53:5825#include "third_party/skia/include/core/SkBitmap.h"
26#include "third_party/skia/include/core/SkCanvas.h"
27#include "third_party/skia/include/core/SkImageInfo.h"
28#include "third_party/skia/include/core/SkRect.h"
29#include "ui/gfx/skia_util.h"
boliubee541f42015-11-05 00:52:5330
31namespace content {
32
boliuc99f26c12016-04-21 21:58:5933// static
34void SynchronousCompositor::SetClientForWebContents(
35 WebContents* contents,
36 SynchronousCompositorClient* client) {
37 DCHECK(contents);
38 DCHECK(client);
39 WebContentsAndroid* web_contents_android =
40 static_cast<WebContentsImpl*>(contents)->GetWebContentsAndroid();
41 DCHECK(!web_contents_android->synchronous_compositor_client());
42 web_contents_android->set_synchronous_compositor_client(client);
43}
44
45// static
46std::unique_ptr<SynchronousCompositorHost> SynchronousCompositorHost::Create(
47 RenderWidgetHostViewAndroid* rwhva,
48 WebContents* web_contents) {
49 DCHECK(web_contents);
50 WebContentsAndroid* web_contents_android =
51 static_cast<WebContentsImpl*>(web_contents)->GetWebContentsAndroid();
52 if (!web_contents_android->synchronous_compositor_client())
53 return nullptr; // Not using sync compositing.
54
55 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
56 bool async_input =
57 !command_line->HasSwitch(switches::kSyncInputForSyncCompositor);
58 bool use_in_proc_software_draw =
59 command_line->HasSwitch(switches::kSingleProcess);
60 return base::WrapUnique(new SynchronousCompositorHost(
61 rwhva, web_contents_android->synchronous_compositor_client(), async_input,
62 use_in_proc_software_draw));
63}
64
boliubee541f42015-11-05 00:52:5365SynchronousCompositorHost::SynchronousCompositorHost(
66 RenderWidgetHostViewAndroid* rwhva,
boliu4d4b5a82016-02-17 01:55:2167 SynchronousCompositorClient* client,
boliude5b75b2016-03-11 07:02:1468 bool async_input,
boliu4d4b5a82016-02-17 01:55:2169 bool use_in_proc_software_draw)
boliubee541f42015-11-05 00:52:5370 : rwhva_(rwhva),
71 client_(client),
hush92bd35e72015-11-13 22:57:3772 ui_task_runner_(
73 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
boliubee541f42015-11-05 00:52:5374 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()),
75 sender_(rwhva_->GetRenderWidgetHost()),
boliude5b75b2016-03-11 07:02:1476 async_input_(async_input),
boliu4d4b5a82016-02-17 01:55:2177 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw),
boliubee541f42015-11-05 00:52:5378 is_active_(false),
79 bytes_limit_(0u),
boliuf4e574852016-03-22 19:33:1780 output_surface_id_from_last_draw_(0u),
boliu600cba922015-12-08 04:28:2281 root_scroll_offset_updated_by_browser_(false),
boliubee541f42015-11-05 00:52:5382 renderer_param_version_(0u),
83 need_animate_scroll_(false),
boliu17bc31f2016-02-23 18:46:2884 need_invalidate_count_(0u),
boliubee541f42015-11-05 00:52:5385 need_begin_frame_(false),
boliu17bc31f2016-02-23 18:46:2886 did_activate_pending_tree_count_(0u),
hush92bd35e72015-11-13 22:57:3787 weak_ptr_factory_(this) {
boliubee541f42015-11-05 00:52:5388 client_->DidInitializeCompositor(this);
89}
90
91SynchronousCompositorHost::~SynchronousCompositorHost() {
92 client_->DidDestroyCompositor(this);
boliu0c1f91d2016-01-13 19:27:3793 if (weak_ptr_factory_.HasWeakPtrs())
94 UpdateStateTask();
boliubee541f42015-11-05 00:52:5395}
96
97bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) {
98 bool handled = true;
99 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message)
100 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams)
boliu09be0e62015-11-11 00:57:00101 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OverScroll, OnOverScroll)
boliubee541f42015-11-05 00:52:53102 IPC_MESSAGE_UNHANDLED(handled = false)
103 IPC_END_MESSAGE_MAP()
104 return handled;
105}
106
hush45918a82015-12-17 03:50:59107void SynchronousCompositorHost::DidBecomeCurrent() {
108 client_->DidBecomeCurrent(this);
109}
110
boliuf4e574852016-03-22 19:33:17111SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw(
boliubee541f42015-11-05 00:52:53112 const gfx::Size& surface_size,
113 const gfx::Transform& transform,
114 const gfx::Rect& viewport,
115 const gfx::Rect& clip,
116 const gfx::Rect& viewport_rect_for_tile_priority,
117 const gfx::Transform& transform_for_tile_priority) {
118 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport,
119 clip, viewport_rect_for_tile_priority,
120 transform_for_tile_priority);
boliuf4e574852016-03-22 19:33:17121 SynchronousCompositor::Frame frame;
122 frame.frame.reset(new cc::CompositorFrame);
boliubee541f42015-11-05 00:52:53123 SyncCompositorCommonBrowserParams common_browser_params;
124 PopulateCommonParams(&common_browser_params);
125 SyncCompositorCommonRendererParams common_renderer_params;
126 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw(
127 routing_id_, common_browser_params, params, &common_renderer_params,
boliuf4e574852016-03-22 19:33:17128 &frame.output_surface_id, frame.frame.get()))) {
129 return SynchronousCompositor::Frame();
boliubee541f42015-11-05 00:52:53130 }
131 ProcessCommonParams(common_renderer_params);
boliuf4e574852016-03-22 19:33:17132 if (!frame.frame->delegated_frame_data) {
boliubee541f42015-11-05 00:52:53133 // This can happen if compositor did not swap in this draw.
boliuf4e574852016-03-22 19:33:17134 frame.frame.reset();
boliubee541f42015-11-05 00:52:53135 }
boliuf4e574852016-03-22 19:33:17136 if (frame.frame) {
137 UpdateFrameMetaData(frame.frame->metadata);
138 if (output_surface_id_from_last_draw_ != frame.output_surface_id)
139 returned_resources_.clear();
140 output_surface_id_from_last_draw_ = frame.output_surface_id;
141 }
boliubee541f42015-11-05 00:52:53142 return frame;
143}
144
145void SynchronousCompositorHost::UpdateFrameMetaData(
146 const cc::CompositorFrameMetadata& frame_metadata) {
147 rwhva_->SynchronousFrameMetadata(frame_metadata);
148}
149
boliu4d4b5a82016-02-17 01:55:21150namespace {
151
152class ScopedSetSkCanvas {
153 public:
154 explicit ScopedSetSkCanvas(SkCanvas* canvas) {
155 SynchronousCompositorSetSkCanvas(canvas);
156 }
157
158 ~ScopedSetSkCanvas() {
159 SynchronousCompositorSetSkCanvas(nullptr);
160 }
161
162 private:
163 DISALLOW_COPY_AND_ASSIGN(ScopedSetSkCanvas);
164};
165
166}
167
168bool SynchronousCompositorHost::DemandDrawSwInProc(SkCanvas* canvas) {
169 SyncCompositorCommonBrowserParams common_browser_params;
170 PopulateCommonParams(&common_browser_params);
171 SyncCompositorCommonRendererParams common_renderer_params;
172 bool success = false;
dcheng59716272016-04-09 05:19:08173 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
boliu4d4b5a82016-02-17 01:55:21174 ScopedSetSkCanvas set_sk_canvas(canvas);
175 SyncCompositorDemandDrawSwParams params; // Unused.
176 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw(
177 routing_id_, common_browser_params, params, &success,
178 &common_renderer_params, frame.get()))) {
179 return false;
180 }
181 if (!success)
182 return false;
183 ProcessCommonParams(common_renderer_params);
184 UpdateFrameMetaData(frame->metadata);
185 return true;
186}
187
boliucafb1bf2015-12-29 01:40:19188class SynchronousCompositorHost::ScopedSendZeroMemory {
189 public:
190 ScopedSendZeroMemory(SynchronousCompositorHost* host) : host_(host) {}
191 ~ScopedSendZeroMemory() { host_->SendZeroMemory(); }
192
193 private:
194 SynchronousCompositorHost* const host_;
195
196 DISALLOW_COPY_AND_ASSIGN(ScopedSendZeroMemory);
197};
198
199struct SynchronousCompositorHost::SharedMemoryWithSize {
200 base::SharedMemory shm;
201 const size_t stride;
202 const size_t buffer_size;
203
204 SharedMemoryWithSize(size_t stride, size_t buffer_size)
205 : stride(stride), buffer_size(buffer_size) {}
206
207 private:
208 DISALLOW_COPY_AND_ASSIGN(SharedMemoryWithSize);
209};
210
boliubee541f42015-11-05 00:52:53211bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) {
boliu4d4b5a82016-02-17 01:55:21212 if (use_in_process_zero_copy_software_draw_)
213 return DemandDrawSwInProc(canvas);
214
boliuf6d263e2015-11-25 03:53:58215 SyncCompositorDemandDrawSwParams params;
216 params.size = gfx::Size(canvas->getBaseLayerSize().width(),
217 canvas->getBaseLayerSize().height());
218 SkIRect canvas_clip;
219 canvas->getClipDeviceBounds(&canvas_clip);
220 params.clip = gfx::SkIRectToRect(canvas_clip);
221 params.transform.matrix() = canvas->getTotalMatrix();
222 if (params.size.IsEmpty())
223 return true;
224
225 SkImageInfo info =
226 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height());
227 DCHECK_EQ(kRGBA_8888_SkColorType, info.colorType());
228 size_t stride = info.minRowBytes();
229 size_t buffer_size = info.getSafeSize(stride);
230 if (!buffer_size)
231 return false; // Overflow.
232
boliucafb1bf2015-12-29 01:40:19233 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size);
234 if (!software_draw_shm_)
boliuf6d263e2015-11-25 03:53:58235 return false;
236
dcheng59716272016-04-09 05:19:08237 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
boliuf6d263e2015-11-25 03:53:58238 SyncCompositorCommonBrowserParams common_browser_params;
239 PopulateCommonParams(&common_browser_params);
240 SyncCompositorCommonRendererParams common_renderer_params;
241 bool success = false;
242 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw(
243 routing_id_, common_browser_params, params, &success,
244 &common_renderer_params, frame.get()))) {
245 return false;
246 }
boliucafb1bf2015-12-29 01:40:19247 ScopedSendZeroMemory send_zero_memory(this);
boliuf6d263e2015-11-25 03:53:58248 if (!success)
249 return false;
250
251 ProcessCommonParams(common_renderer_params);
252 UpdateFrameMetaData(frame->metadata);
253
254 SkBitmap bitmap;
boliucafb1bf2015-12-29 01:40:19255 if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride))
boliuf6d263e2015-11-25 03:53:58256 return false;
257
258 {
259 TRACE_EVENT0("browser", "DrawBitmap");
260 canvas->save();
261 canvas->resetMatrix();
262 canvas->drawBitmap(bitmap, 0, 0);
263 canvas->restore();
264 }
265
266 return true;
boliubee541f42015-11-05 00:52:53267}
268
boliucafb1bf2015-12-29 01:40:19269void SynchronousCompositorHost::SetSoftwareDrawSharedMemoryIfNeeded(
270 size_t stride,
271 size_t buffer_size) {
272 if (software_draw_shm_ && software_draw_shm_->stride == stride &&
273 software_draw_shm_->buffer_size == buffer_size)
274 return;
275 software_draw_shm_.reset();
dcheng59716272016-04-09 05:19:08276 std::unique_ptr<SharedMemoryWithSize> software_draw_shm(
boliucafb1bf2015-12-29 01:40:19277 new SharedMemoryWithSize(stride, buffer_size));
278 {
279 TRACE_EVENT1("browser", "AllocateSharedMemory", "buffer_size", buffer_size);
280 if (!software_draw_shm->shm.CreateAndMapAnonymous(buffer_size))
281 return;
282 }
283
284 SyncCompositorSetSharedMemoryParams set_shm_params;
285 set_shm_params.buffer_size = buffer_size;
286 base::ProcessHandle renderer_process_handle =
287 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle();
288 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle,
289 &set_shm_params.shm_handle)) {
290 return;
291 }
292
293 SyncCompositorCommonBrowserParams common_browser_params;
294 PopulateCommonParams(&common_browser_params);
295 bool success = false;
296 SyncCompositorCommonRendererParams common_renderer_params;
297 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory(
298 routing_id_, common_browser_params, set_shm_params, &success,
299 &common_renderer_params)) ||
300 !success) {
301 return;
302 }
303 software_draw_shm_ = std::move(software_draw_shm);
304 ProcessCommonParams(common_renderer_params);
305}
306
307void SynchronousCompositorHost::SendZeroMemory() {
308 // No need to check return value.
309 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_));
310}
311
boliubee541f42015-11-05 00:52:53312void SynchronousCompositorHost::ReturnResources(
boliuf4e574852016-03-22 19:33:17313 uint32_t output_surface_id,
boliubee541f42015-11-05 00:52:53314 const cc::CompositorFrameAck& frame_ack) {
boliuf4e574852016-03-22 19:33:17315 // If output_surface_id does not match, then renderer side has switched
316 // to a new OutputSurface, so dropping resources for old OutputSurface
317 // is allowed.
318 if (output_surface_id_from_last_draw_ != output_surface_id)
319 return;
boliubee541f42015-11-05 00:52:53320 returned_resources_.insert(returned_resources_.end(),
321 frame_ack.resources.begin(),
322 frame_ack.resources.end());
323}
324
325void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) {
326 if (bytes_limit_ == bytes_limit)
327 return;
328 bytes_limit_ = bytes_limit;
hush92bd35e72015-11-13 22:57:37329 SendAsyncCompositorStateIfNeeded();
boliubee541f42015-11-05 00:52:53330}
331
332void SynchronousCompositorHost::DidChangeRootLayerScrollOffset(
333 const gfx::ScrollOffset& root_offset) {
334 if (root_scroll_offset_ == root_offset)
335 return;
boliu600cba922015-12-08 04:28:22336 root_scroll_offset_updated_by_browser_ = true;
boliubee541f42015-11-05 00:52:53337 root_scroll_offset_ = root_offset;
hush92bd35e72015-11-13 22:57:37338 SendAsyncCompositorStateIfNeeded();
339}
340
341void SynchronousCompositorHost::SendAsyncCompositorStateIfNeeded() {
342 if (weak_ptr_factory_.HasWeakPtrs())
343 return;
344
345 ui_task_runner_->PostTask(
346 FROM_HERE, base::Bind(&SynchronousCompositorHost::UpdateStateTask,
347 weak_ptr_factory_.GetWeakPtr()));
348}
349
350void SynchronousCompositorHost::UpdateStateTask() {
351 SyncCompositorCommonBrowserParams common_browser_params;
352 PopulateCommonParams(&common_browser_params);
353 sender_->Send(
354 new SyncCompositorMsg_UpdateState(routing_id_, common_browser_params));
355 DCHECK(!weak_ptr_factory_.HasWeakPtrs());
boliubee541f42015-11-05 00:52:53356}
357
boliu21d8ab142016-04-07 23:33:52358void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta,
359 const gfx::Point& anchor) {
360 SyncCompositorCommonBrowserParams common_browser_params;
361 PopulateCommonParams(&common_browser_params);
362 SyncCompositorCommonRendererParams common_renderer_params;
363 if (!sender_->Send(new SyncCompositorMsg_ZoomBy(
364 routing_id_, common_browser_params, zoom_delta, anchor,
365 &common_renderer_params))) {
366 return;
367 }
368 ProcessCommonParams(common_renderer_params);
369}
370
boliubee541f42015-11-05 00:52:53371void SynchronousCompositorHost::SetIsActive(bool is_active) {
boliu0c1f91d2016-01-13 19:27:37372 if (is_active_ == is_active)
373 return;
boliubee541f42015-11-05 00:52:53374 is_active_ = is_active;
375 UpdateNeedsBeginFrames();
boliu0c1f91d2016-01-13 19:27:37376 SendAsyncCompositorStateIfNeeded();
boliubee541f42015-11-05 00:52:53377}
378
379void SynchronousCompositorHost::OnComputeScroll(
380 base::TimeTicks animation_time) {
381 if (!need_animate_scroll_)
382 return;
383 need_animate_scroll_ = false;
384
385 SyncCompositorCommonBrowserParams common_browser_params;
386 PopulateCommonParams(&common_browser_params);
387 SyncCompositorCommonRendererParams common_renderer_params;
boliu7f873dd2016-01-21 22:37:27388 sender_->Send(new SyncCompositorMsg_ComputeScroll(
389 routing_id_, common_browser_params, animation_time));
boliubee541f42015-11-05 00:52:53390}
391
392InputEventAckState SynchronousCompositorHost::HandleInputEvent(
393 const blink::WebInputEvent& input_event) {
boliude5b75b2016-03-11 07:02:14394 if (async_input_)
395 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
boliubee541f42015-11-05 00:52:53396 SyncCompositorCommonBrowserParams common_browser_params;
397 PopulateCommonParams(&common_browser_params);
398 SyncCompositorCommonRendererParams common_renderer_params;
399 InputEventAckState ack = INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
400 if (!sender_->Send(new SyncCompositorMsg_HandleInputEvent(
401 routing_id_, common_browser_params, &input_event,
402 &common_renderer_params, &ack))) {
403 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
404 }
405 ProcessCommonParams(common_renderer_params);
406 return ack;
407}
408
boliude5b75b2016-03-11 07:02:14409void SynchronousCompositorHost::DidOverscroll(
410 const DidOverscrollParams& over_scroll_params) {
411 client_->DidOverscroll(over_scroll_params.accumulated_overscroll,
412 over_scroll_params.latest_overscroll_delta,
413 over_scroll_params.current_fling_velocity);
414}
415
boliubee541f42015-11-05 00:52:53416void SynchronousCompositorHost::BeginFrame(const cc::BeginFrameArgs& args) {
boliude5b75b2016-03-11 07:02:14417 if (!is_active_)
boliubee541f42015-11-05 00:52:53418 return;
419
420 SyncCompositorCommonBrowserParams common_browser_params;
421 PopulateCommonParams(&common_browser_params);
422 SyncCompositorCommonRendererParams common_renderer_params;
423 if (!sender_->Send(
424 new SyncCompositorMsg_BeginFrame(routing_id_, common_browser_params,
425 args, &common_renderer_params))) {
426 return;
427 }
428 ProcessCommonParams(common_renderer_params);
429}
430
boliu09be0e62015-11-11 00:57:00431void SynchronousCompositorHost::OnOverScroll(
432 const SyncCompositorCommonRendererParams& params,
433 const DidOverscrollParams& over_scroll_params) {
434 ProcessCommonParams(params);
boliude5b75b2016-03-11 07:02:14435 DidOverscroll(over_scroll_params);
boliu09be0e62015-11-11 00:57:00436}
437
boliubee541f42015-11-05 00:52:53438void SynchronousCompositorHost::PopulateCommonParams(
439 SyncCompositorCommonBrowserParams* params) {
440 DCHECK(params);
441 DCHECK(params->ack.resources.empty());
442 params->bytes_limit = bytes_limit_;
boliuf4e574852016-03-22 19:33:17443 params->output_surface_id_for_returned_resources =
444 output_surface_id_from_last_draw_;
boliubee541f42015-11-05 00:52:53445 params->ack.resources.swap(returned_resources_);
boliu600cba922015-12-08 04:28:22446 if (root_scroll_offset_updated_by_browser_) {
447 params->root_scroll_offset = root_scroll_offset_;
448 params->update_root_scroll_offset = root_scroll_offset_updated_by_browser_;
449 root_scroll_offset_updated_by_browser_ = false;
450 }
boliu0c1f91d2016-01-13 19:27:37451 params->begin_frame_source_paused = !is_active_;
boliu600cba922015-12-08 04:28:22452
hush92bd35e72015-11-13 22:57:37453 weak_ptr_factory_.InvalidateWeakPtrs();
boliubee541f42015-11-05 00:52:53454}
455
456void SynchronousCompositorHost::ProcessCommonParams(
457 const SyncCompositorCommonRendererParams& params) {
458 // Ignore if |renderer_param_version_| is newer than |params.version|. This
459 // comparison takes into account when the unsigned int wraps.
460 if ((renderer_param_version_ - params.version) < 0x80000000) {
461 return;
462 }
463 renderer_param_version_ = params.version;
464 need_animate_scroll_ = params.need_animate_scroll;
465 if (need_begin_frame_ != params.need_begin_frame) {
466 need_begin_frame_ = params.need_begin_frame;
467 UpdateNeedsBeginFrames();
468 }
boliubee541f42015-11-05 00:52:53469 root_scroll_offset_ = params.total_scroll_offset;
470
boliu17bc31f2016-02-23 18:46:28471 if (need_invalidate_count_ != params.need_invalidate_count) {
472 need_invalidate_count_ = params.need_invalidate_count;
boliubee541f42015-11-05 00:52:53473 client_->PostInvalidate();
474 }
475
boliu17bc31f2016-02-23 18:46:28476 if (did_activate_pending_tree_count_ !=
477 params.did_activate_pending_tree_count) {
478 did_activate_pending_tree_count_ = params.did_activate_pending_tree_count;
boliubee541f42015-11-05 00:52:53479 client_->DidUpdateContent();
480 }
481
482 // Ensure only valid values from compositor are sent to client.
483 // Compositor has page_scale_factor set to 0 before initialization, so check
484 // for that case here.
485 if (params.page_scale_factor) {
486 client_->UpdateRootLayerState(
487 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset),
488 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset),
489 params.scrollable_size, params.page_scale_factor,
490 params.min_page_scale_factor, params.max_page_scale_factor);
491 }
492}
493
494void SynchronousCompositorHost::UpdateNeedsBeginFrames() {
495 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_);
496}
497
498} // namespace content