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

Unified Diff: content/browser/android/in_process/synchronous_compositor_output_surface.cc

Issue 23171014: Fix UpdateTilePriorities viewport in Android WebView. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase to 221292 Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698