| Index: content/renderer/android/synchronous_compositor_output_surface.cc
|
| diff --git a/content/renderer/android/synchronous_compositor_output_surface.cc b/content/renderer/android/synchronous_compositor_output_surface.cc
|
| index cb41202d297b3d3d620b1d1745c280167cda0c5c..bac32ca590791990dbaf44f4c237d1c678b9630b 100644
|
| --- a/content/renderer/android/synchronous_compositor_output_surface.cc
|
| +++ b/content/renderer/android/synchronous_compositor_output_surface.cc
|
| @@ -26,6 +26,8 @@ namespace content {
|
|
|
| namespace {
|
|
|
| +const int64_t kFallbackTickTimeoutInMilliseconds = 100;
|
| +
|
| // Do not limit number of resources, so use an unrealistically high value.
|
| const size_t kNumResourcesLimit = 10 * 1000 * 1000;
|
|
|
| @@ -75,7 +77,8 @@ SynchronousCompositorOutputSurface::SynchronousCompositorOutputSurface(
|
| current_sw_canvas_(nullptr),
|
| memory_policy_(0u),
|
| did_swap_(false),
|
| - frame_swap_message_queue_(frame_swap_message_queue) {
|
| + frame_swap_message_queue_(frame_swap_message_queue),
|
| + fallback_tick_pending_(false) {
|
| thread_checker_.DetachFromThread();
|
| DCHECK(registry_);
|
| capabilities_.adjust_deadline_for_parent = false;
|
| @@ -132,10 +135,32 @@ void SynchronousCompositorOutputSurface::SwapBuffers(
|
| did_swap_ = true;
|
| }
|
|
|
| +void SynchronousCompositorOutputSurface::FallbackTickFired() {
|
| + DCHECK(CalledOnValidThread());
|
| + TRACE_EVENT0("renderer",
|
| + "SynchronousCompositorOutputSurface::FallbackTickFired");
|
| + SkBitmap bitmap;
|
| + bitmap.allocN32Pixels(1, 1);
|
| + bitmap.eraseColor(0);
|
| + SkCanvas canvas(bitmap);
|
| + DemandDrawSw(&canvas);
|
| + fallback_tick_pending_ = false;
|
| +}
|
| +
|
| void SynchronousCompositorOutputSurface::Invalidate() {
|
| DCHECK(CalledOnValidThread());
|
| if (sync_client_)
|
| sync_client_->Invalidate();
|
| +
|
| + if (!fallback_tick_pending_) {
|
| + fallback_tick_.Reset(
|
| + base::Bind(&SynchronousCompositorOutputSurface::FallbackTickFired,
|
| + base::Unretained(this)));
|
| + base::MessageLoop::current()->PostDelayedTask(
|
| + FROM_HERE, fallback_tick_.callback(),
|
| + base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds));
|
| + fallback_tick_pending_ = true;
|
| + }
|
| }
|
|
|
| void SynchronousCompositorOutputSurface::DemandDrawHw(
|
| @@ -148,6 +173,8 @@ void SynchronousCompositorOutputSurface::DemandDrawHw(
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(HasClient());
|
| DCHECK(context_provider_.get());
|
| + fallback_tick_.Cancel();
|
| + fallback_tick_pending_ = false;
|
|
|
| surface_size_ = surface_size;
|
| client_->SetExternalTilePriorityConstraints(viewport_rect_for_tile_priority,
|
| @@ -160,6 +187,8 @@ void SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(canvas);
|
| DCHECK(!current_sw_canvas_);
|
| + fallback_tick_.Cancel();
|
| + fallback_tick_pending_ = false;
|
|
|
| base::AutoReset<SkCanvas*> canvas_resetter(¤t_sw_canvas_, canvas);
|
|
|
|
|