| Index: content/browser/android/in_process/synchronous_compositor_output_surface.cc
|
| diff --git a/content/browser/android/in_process/synchronous_compositor_output_surface.cc b/content/browser/android/in_process/synchronous_compositor_output_surface.cc
|
| index 1919d73bf1918a3a52291e2ec322780526038c88..40c8a3ba42bb5d53b2fdd3d48441439e2ea56bd7 100644
|
| --- a/content/browser/android/in_process/synchronous_compositor_output_surface.cc
|
| +++ b/content/browser/android/in_process/synchronous_compositor_output_surface.cc
|
| @@ -186,10 +186,9 @@ void SynchronousCompositorOutputSurface::SwapBuffers(
|
| }
|
|
|
| namespace {
|
| -void AdjustTransformForClip(gfx::Transform* transform, gfx::Rect clip) {
|
| - // The system-provided transform translates us from the screen origin to the
|
| - // origin of the clip rect, but CC's draw origin starts at the clip.
|
| - transform->matrix().postTranslate(-clip.x(), -clip.y(), 0);
|
| +void AdjustTransform(gfx::Transform* transform, gfx::Rect viewport) {
|
| + // CC's draw origin starts at the viewport.
|
| + transform->matrix().postTranslate(-viewport.x(), -viewport.y(), 0);
|
| }
|
| } // namespace
|
|
|
| @@ -215,18 +214,16 @@ void SynchronousCompositorOutputSurface::ReleaseHwDraw() {
|
| bool SynchronousCompositorOutputSurface::DemandDrawHw(
|
| gfx::Size surface_size,
|
| const gfx::Transform& transform,
|
| + gfx::Rect viewport,
|
| gfx::Rect clip,
|
| bool stencil_enabled) {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(HasClient());
|
| DCHECK(context_provider_);
|
|
|
| - gfx::Transform adjusted_transform = transform;
|
| - AdjustTransformForClip(&adjusted_transform, clip);
|
| surface_size_ = surface_size;
|
| - SetExternalDrawConstraints(adjusted_transform, clip);
|
| SetExternalStencilTest(stencil_enabled);
|
| - InvokeComposite(clip.size());
|
| + InvokeComposite(transform, viewport, clip, true);
|
|
|
| return did_swap_buffer_;
|
| }
|
| @@ -243,27 +240,46 @@ bool SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) {
|
|
|
| gfx::Transform transform(gfx::Transform::kSkipInitialization);
|
| transform.matrix() = canvas->getTotalMatrix(); // Converts 3x3 matrix to 4x4.
|
| - AdjustTransformForClip(&transform, clip);
|
|
|
| surface_size_ = gfx::Size(canvas->getDeviceSize().width(),
|
| canvas->getDeviceSize().height());
|
| - SetExternalDrawConstraints(transform, clip);
|
| SetExternalStencilTest(false);
|
|
|
| - InvokeComposite(clip.size());
|
| + InvokeComposite(transform, clip, clip, false);
|
|
|
| return did_swap_buffer_;
|
| }
|
|
|
| void SynchronousCompositorOutputSurface::InvokeComposite(
|
| - gfx::Size damage_size) {
|
| + const gfx::Transform& transform,
|
| + gfx::Rect viewport,
|
| + gfx::Rect clip,
|
| + bool valid_for_tile_management) {
|
| DCHECK(!invoking_composite_);
|
| base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_, true);
|
| did_swap_buffer_ = false;
|
| - SetNeedsRedrawRect(gfx::Rect(damage_size));
|
| +
|
| + gfx::Transform adjusted_transform = transform;
|
| + AdjustTransform(&adjusted_transform, viewport);
|
| + SetExternalDrawConstraints(
|
| + adjusted_transform, viewport, clip, valid_for_tile_management);
|
| + SetNeedsRedrawRect(gfx::Rect(viewport.size()));
|
| +
|
| if (needs_begin_frame_)
|
| BeginFrame(cc::BeginFrameArgs::CreateForSynchronousCompositor());
|
|
|
| + // After software draws (which might move the viewport arbitrarily), restore
|
| + // the previous hardware viewport to allow CC's tile manager to prioritize
|
| + // properly.
|
| + if (valid_for_tile_management) {
|
| + cached_hw_transform_ = adjusted_transform;
|
| + cached_hw_viewport_ = viewport;
|
| + cached_hw_clip_ = clip;
|
| + } else {
|
| + SetExternalDrawConstraints(
|
| + cached_hw_transform_, cached_hw_viewport_, cached_hw_clip_, true);
|
| + }
|
| +
|
| if (did_swap_buffer_)
|
| OnSwapBuffersComplete(NULL);
|
| }
|
|
|