summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc')
-rw-r--r--cc/input/layer_scroll_offset_delegate.h4
-rw-r--r--cc/layers/layer_impl.cc5
-rw-r--r--cc/layers/layer_impl.h2
-rw-r--r--cc/layers/layer_impl_unittest.cc2
-rw-r--r--cc/output/delegating_renderer.cc3
-rw-r--r--cc/output/delegating_renderer.h3
-rw-r--r--cc/output/direct_renderer.cc5
-rw-r--r--cc/output/direct_renderer.h5
-rw-r--r--cc/output/gl_renderer_unittest.cc56
-rw-r--r--cc/output/renderer.h3
-rw-r--r--cc/output/renderer_pixeltest.cc80
-rw-r--r--cc/output/software_renderer.cc3
-rw-r--r--cc/output/software_renderer_unittest.cc12
-rw-r--r--cc/resources/picture_pile_impl_unittest.cc3
-rw-r--r--cc/resources/picture_unittest.cc9
-rw-r--r--cc/test/fake_content_layer_client.cc2
-rw-r--r--cc/test/fake_content_layer_client.h18
-rw-r--r--cc/test/fake_picture_pile_impl.h8
-rw-r--r--cc/test/pixel_test.cc4
-rw-r--r--cc/test/pixel_test.h1
-rw-r--r--cc/trees/layer_tree_host_impl.cc13
-rw-r--r--cc/trees/layer_tree_host_impl.h2
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc2
-rw-r--r--cc/trees/thread_proxy.cc2
24 files changed, 194 insertions, 53 deletions
diff --git a/cc/input/layer_scroll_offset_delegate.h b/cc/input/layer_scroll_offset_delegate.h
index 66f9ad4..805bbfb 100644
--- a/cc/input/layer_scroll_offset_delegate.h
+++ b/cc/input/layer_scroll_offset_delegate.h
@@ -34,6 +34,10 @@ class LayerScrollOffsetDelegate {
// more than the value passed to the most recent SetMaxScrollOffset call.
virtual gfx::Vector2dF GetTotalScrollOffset() = 0;
+ // This is called by the compositor to check whether a delegate-managed fling
+ // is active or not.
+ virtual bool IsExternalFlingActive() const = 0;
+
// This is called by the compositor to notify the delegate what is the current
// page scale factor is.
virtual void SetPageScaleFactor(float page_scale_factor) = 0;
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index dde14e2..c1fb321 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -980,6 +980,11 @@ void LayerImpl::SetScrollOffsetDelegate(
}
}
+bool LayerImpl::IsExternalFlingActive() const {
+ return scroll_offset_delegate_ &&
+ scroll_offset_delegate_->IsExternalFlingActive();
+}
+
void LayerImpl::SetScrollOffset(gfx::Vector2d scroll_offset) {
SetScrollOffsetAndDelta(scroll_offset, ScrollDelta());
}
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h
index c97afc7..6513b32 100644
--- a/cc/layers/layer_impl.h
+++ b/cc/layers/layer_impl.h
@@ -345,6 +345,8 @@ class CC_EXPORT LayerImpl : LayerAnimationValueObserver {
void SetScrollOffsetDelegate(
LayerScrollOffsetDelegate* scroll_offset_delegate);
+ bool IsExternalFlingActive() const;
+
void SetScrollOffset(gfx::Vector2d scroll_offset);
void SetScrollOffsetAndDelta(gfx::Vector2d scroll_offset,
gfx::Vector2dF scroll_delta);
diff --git a/cc/layers/layer_impl_unittest.cc b/cc/layers/layer_impl_unittest.cc
index 5e36e81..3a0b1ce 100644
--- a/cc/layers/layer_impl_unittest.cc
+++ b/cc/layers/layer_impl_unittest.cc
@@ -376,6 +376,7 @@ class ScrollDelegateIgnore : public LayerScrollOffsetDelegate {
virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE {
return fixed_offset_;
}
+ virtual bool IsExternalFlingActive() const OVERRIDE { return false; }
void set_fixed_offset(gfx::Vector2dF fixed_offset) {
fixed_offset_ = fixed_offset;
@@ -432,6 +433,7 @@ class ScrollDelegateAccept : public LayerScrollOffsetDelegate {
virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE {
return current_offset_;
}
+ virtual bool IsExternalFlingActive() const OVERRIDE { return false; }
virtual void SetPageScaleFactor(float page_scale_factor) OVERRIDE {}
virtual void SetScrollableSize(gfx::SizeF scrollable_size) OVERRIDE {}
diff --git a/cc/output/delegating_renderer.cc b/cc/output/delegating_renderer.cc
index e3413a5..772a16a 100644
--- a/cc/output/delegating_renderer.cc
+++ b/cc/output/delegating_renderer.cc
@@ -100,7 +100,8 @@ static ResourceProvider::ResourceId AppendToArray(
void DelegatingRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
ContextProvider* offscreen_context_provider,
float device_scale_factor,
- bool allow_partial_swap) {
+ bool allow_partial_swap,
+ bool disable_picture_quad_image_filtering) {
TRACE_EVENT0("cc", "DelegatingRenderer::DrawFrame");
DCHECK(!frame_for_swap_buffers_.delegated_frame_data);
diff --git a/cc/output/delegating_renderer.h b/cc/output/delegating_renderer.h
index 57a2418..0ca685f 100644
--- a/cc/output/delegating_renderer.h
+++ b/cc/output/delegating_renderer.h
@@ -31,7 +31,8 @@ class CC_EXPORT DelegatingRenderer : public Renderer {
virtual void DrawFrame(RenderPassList* render_passes_in_draw_order,
ContextProvider* offscreen_context_provider,
float device_scale_factor,
- bool allow_partial_swap) OVERRIDE;
+ bool allow_partial_swap,
+ bool disable_picture_quad_image_filtering) OVERRIDE;
virtual void Finish() OVERRIDE {}
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc
index d46f46d..c02200d 100644
--- a/cc/output/direct_renderer.cc
+++ b/cc/output/direct_renderer.cc
@@ -198,7 +198,8 @@ void DirectRenderer::DecideRenderPassAllocationsForFrame(
void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
ContextProvider* offscreen_context_provider,
float device_scale_factor,
- bool allow_partial_swap) {
+ bool allow_partial_swap,
+ bool disable_picture_quad_image_filtering) {
TRACE_EVENT0("cc", "DirectRenderer::DrawFrame");
UMA_HISTOGRAM_COUNTS("Renderer4.renderPassCount",
render_passes_in_draw_order->size());
@@ -214,6 +215,8 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
: root_render_pass->output_rect;
frame.root_damage_rect.Intersect(gfx::Rect(client_->DeviceViewport().size()));
frame.offscreen_context_provider = offscreen_context_provider;
+ frame.disable_picture_quad_image_filtering =
+ disable_picture_quad_image_filtering;
EnsureBackbuffer();
diff --git a/cc/output/direct_renderer.h b/cc/output/direct_renderer.h
index a73c62d..f55cc59 100644
--- a/cc/output/direct_renderer.h
+++ b/cc/output/direct_renderer.h
@@ -34,7 +34,8 @@ class CC_EXPORT DirectRenderer : public Renderer {
virtual void DrawFrame(RenderPassList* render_passes_in_draw_order,
ContextProvider* offscreen_context_provider,
float device_scale_factor,
- bool allow_partial_swap) OVERRIDE;
+ bool allow_partial_swap,
+ bool disable_picture_quad_image_filtering) OVERRIDE;
struct CC_EXPORT DrawingFrame {
DrawingFrame();
@@ -50,6 +51,8 @@ class CC_EXPORT DirectRenderer : public Renderer {
gfx::Transform window_matrix;
ContextProvider* offscreen_context_provider;
+
+ bool disable_picture_quad_image_filtering;
};
void SetEnlargePassTextureAmountForTesting(gfx::Vector2d amount);
diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc
index e30f0ceb..c8aab57 100644
--- a/cc/output/gl_renderer_unittest.cc
+++ b/cc/output/gl_renderer_unittest.cc
@@ -445,7 +445,7 @@ TEST_F(GLRendererTest, DiscardedBackbufferIsRecreatedForScopeDuration) {
renderer_->SetVisible(true);
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
EXPECT_FALSE(renderer_->IsBackbufferDiscarded());
SwapBuffers();
@@ -460,7 +460,7 @@ TEST_F(GLRendererTest, FramebufferDiscardedAfterReadbackWhenNotVisible) {
char pixels[4];
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
EXPECT_FALSE(renderer_->IsBackbufferDiscarded());
renderer_->GetFramebufferPixels(pixels, gfx::Rect(0, 0, 1, 1));
@@ -475,7 +475,7 @@ TEST_F(GLRendererTest, ExternalStencil) {
renderer_client_.root_render_pass()->has_transparent_background = false;
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
EXPECT_TRUE(renderer_->stencil_enabled());
}
@@ -738,7 +738,7 @@ TEST(GLRendererTest2, OpaqueBackground) {
EXPECT_CALL(*context, clear(_)).Times(1);
#endif
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
Mock::VerifyAndClearExpectations(context);
}
@@ -769,7 +769,7 @@ TEST(GLRendererTest2, TransparentBackground) {
.Times(1);
EXPECT_CALL(*context, clear(_)).Times(1);
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
Mock::VerifyAndClearExpectations(context);
}
@@ -800,7 +800,7 @@ TEST(GLRendererTest2, OffscreenOutputSurface) {
.Times(1);
EXPECT_CALL(*context, clear(_)).Times(AnyNumber());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
Mock::VerifyAndClearExpectations(context);
}
@@ -878,7 +878,7 @@ TEST(GLRendererTest2, VisibilityChangeIsLastCall) {
// the stack.
renderer.SetVisible(true);
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
renderer.SetVisible(false);
EXPECT_TRUE(context->last_call_was_set_visibility());
}
@@ -1058,7 +1058,7 @@ TEST(GLRendererTest2, ShouldClearRootRenderPass) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
// In multiple render passes all but the root pass should clear the
// framebuffer.
@@ -1134,7 +1134,7 @@ TEST(GLRendererTest2, ScissorTestWhenClearing) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
}
class DiscardCheckingContext : public TestWebGraphicsContext3D {
@@ -1211,7 +1211,7 @@ TEST(GLRendererTest2, NoDiscardOnPartialUpdates) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
EXPECT_EQ(0, context->discarded());
context->reset();
}
@@ -1226,7 +1226,7 @@ TEST(GLRendererTest2, NoDiscardOnPartialUpdates) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
EXPECT_EQ(1, context->discarded());
context->reset();
}
@@ -1241,7 +1241,7 @@ TEST(GLRendererTest2, NoDiscardOnPartialUpdates) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, false);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, false, false);
EXPECT_EQ(1, context->discarded());
context->reset();
}
@@ -1258,7 +1258,7 @@ TEST(GLRendererTest2, NoDiscardOnPartialUpdates) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
EXPECT_EQ(0, context->discarded());
context->reset();
output_surface->set_has_external_stencil_test(false);
@@ -1275,7 +1275,7 @@ TEST(GLRendererTest2, NoDiscardOnPartialUpdates) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
EXPECT_EQ(0, context->discarded());
context->reset();
}
@@ -1292,7 +1292,7 @@ TEST(GLRendererTest2, NoDiscardOnPartialUpdates) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
EXPECT_EQ(0, context->discarded());
context->reset();
}
@@ -1310,7 +1310,7 @@ TEST(GLRendererTest2, NoDiscardOnPartialUpdates) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
EXPECT_EQ(0, context->discarded());
context->reset();
}
@@ -1387,7 +1387,7 @@ TEST(GLRendererTest2, ScissorAndViewportWithinNonreshapableSurface) {
renderer.DecideRenderPassAllocationsForFrame(
*renderer_client.render_passes_in_draw_order());
renderer.DrawFrame(
- renderer_client.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true, false);
}
TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
@@ -1453,7 +1453,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
TestRenderPassProgram();
// RenderPassColorMatrixProgram
@@ -1470,7 +1470,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
TestRenderPassColorMatrixProgram();
// RenderPassMaskProgram
@@ -1491,7 +1491,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
TestRenderPassMaskProgram();
// RenderPassMaskColorMatrixProgram
@@ -1508,7 +1508,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
TestRenderPassMaskColorMatrixProgram();
// RenderPassProgramAA
@@ -1529,7 +1529,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
TestRenderPassProgramAA();
// RenderPassColorMatrixProgramAA
@@ -1546,7 +1546,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
TestRenderPassColorMatrixProgramAA();
// RenderPassMaskProgramAA
@@ -1564,7 +1564,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
TestRenderPassMaskProgramAA();
// RenderPassMaskColorMatrixProgramAA
@@ -1581,7 +1581,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
TestRenderPassMaskColorMatrixProgramAA();
}
@@ -1630,7 +1630,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadSkipsAAForClippingTransform) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
// If use_aa incorrectly ignores clipping, it will use the
// RenderPassProgramAA shader instead of the RenderPassProgram.
@@ -1661,7 +1661,7 @@ TEST_F(GLRendererShaderTest, DrawSolidColorShader) {
renderer_->DecideRenderPassAllocationsForFrame(
*renderer_client_.render_passes_in_draw_order());
renderer_->DrawFrame(
- renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true);
+ renderer_client_.render_passes_in_draw_order(), NULL, 1.f, true, false);
TestSolidColorProgramAA();
}
@@ -1745,7 +1745,7 @@ class MockOutputSurfaceTest : public testing::Test, public FakeRendererClient {
renderer_->DecideRenderPassAllocationsForFrame(
*render_passes_in_draw_order());
renderer_->DrawFrame(
- render_passes_in_draw_order(), NULL, device_scale_factor, true);
+ render_passes_in_draw_order(), NULL, device_scale_factor, true, false);
}
OutputSurfaceMockContext* Context() {
diff --git a/cc/output/renderer.h b/cc/output/renderer.h
index b3ff65b..b6fd74d 100644
--- a/cc/output/renderer.h
+++ b/cc/output/renderer.h
@@ -50,7 +50,8 @@ class CC_EXPORT Renderer {
virtual void DrawFrame(RenderPassList* render_passes_in_draw_order,
ContextProvider* offscreen_context_provider,
float device_scale_factor,
- bool allow_partial_swap) = 0;
+ bool allow_partial_swap,
+ bool disable_picture_quad_image_filtering) = 0;
// Waits for rendering to finish.
virtual void Finish() = 0;
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index 7165a93..278b30a 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -1520,6 +1520,86 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
FuzzyPixelOffByOneComparator(true)));
}
+template<typename TypeParam> bool IsSoftwareRenderer() {
+ return false;
+}
+
+template<>
+bool IsSoftwareRenderer<SoftwareRenderer>() {
+ return true;
+}
+
+template<>
+bool IsSoftwareRenderer<SoftwareRendererWithExpandedViewport>() {
+ return true;
+}
+
+// If we disable image filtering, then a 2x2 bitmap should appear as four
+// huge sharp squares.
+TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
+ // We only care about this in software mode since bilinear filtering is
+ // cheap in hardware.
+ if (!IsSoftwareRenderer<TypeParam>())
+ return;
+
+ gfx::Size pile_tile_size(1000, 1000);
+ gfx::Rect viewport(this->device_viewport_size_);
+ bool use_skia_gpu_backend = this->UseSkiaGPUBackend();
+ ResourceFormat texture_format = RGBA_8888;
+
+ RenderPass::Id id(1, 1);
+ gfx::Transform transform_to_root;
+ scoped_ptr<RenderPass> pass =
+ CreateTestRenderPass(id, viewport, transform_to_root);
+
+ SkBitmap bitmap;
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
+ bitmap.allocPixels();
+ {
+ SkAutoLockPixels lock(bitmap);
+ SkCanvas canvas(bitmap);
+ canvas.drawPoint(0, 0, SK_ColorGREEN);
+ canvas.drawPoint(0, 1, SK_ColorBLUE);
+ canvas.drawPoint(1, 0, SK_ColorBLUE);
+ canvas.drawPoint(1, 1, SK_ColorGREEN);
+ }
+
+ scoped_refptr<FakePicturePileImpl> pile =
+ FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
+ SkPaint paint;
+ paint.setFilterLevel(SkPaint::kLow_FilterLevel);
+ pile->add_draw_bitmap_with_paint(bitmap, gfx::Point(), paint);
+ pile->RerecordPile();
+
+ gfx::Transform content_to_target_transform;
+ scoped_ptr<SharedQuadState> shared_state =
+ CreateTestSharedQuadState(content_to_target_transform, viewport);
+
+ scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
+ quad->SetNew(shared_state.get(),
+ viewport,
+ gfx::Rect(),
+ gfx::RectF(0, 0, 2, 2),
+ viewport.size(),
+ texture_format,
+ viewport,
+ 1.f,
+ use_skia_gpu_backend,
+ pile);
+ pass->quad_list.push_back(quad.PassAs<DrawQuad>());
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ this->disable_picture_quad_image_filtering_ = true;
+
+ EXPECT_TRUE(this->RunPixelTest(
+ &pass_list,
+ PixelTest::NoOffscreenContext,
+ base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
+ ExactPixelComparator(true)));
+}
+
TYPED_TEST(RendererPixelTestWithSkiaGPUBackend,
PictureDrawQuadNonIdentityScale) {
gfx::Size pile_tile_size(1000, 1000);
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
index 86d35c6..4457607 100644
--- a/cc/output/software_renderer.cc
+++ b/cc/output/software_renderer.cc
@@ -324,7 +324,8 @@ void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame,
// cases and fall back to a persistent bitmap backing
// (http://crbug.com/280374).
skia::RefPtr<SkDrawFilter> opacity_filter =
- skia::AdoptRef(new skia::OpacityDrawFilter(quad->opacity(), true));
+ skia::AdoptRef(new skia::OpacityDrawFilter(
+ quad->opacity(), frame->disable_picture_quad_image_filtering));
DCHECK(!current_canvas_->getDrawFilter());
current_canvas_->setDrawFilter(opacity_filter.get());
diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc
index 03f1635..f88a9ee 100644
--- a/cc/output/software_renderer_unittest.cc
+++ b/cc/output/software_renderer_unittest.cc
@@ -98,7 +98,7 @@ TEST_F(SoftwareRendererTest, SolidColorQuad) {
list.push_back(root_render_pass.PassAs<RenderPass>());
float device_scale_factor = 1.f;
- renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true, false);
SkBitmap output;
output.setConfig(SkBitmap::kARGB_8888_Config,
@@ -191,7 +191,7 @@ TEST_F(SoftwareRendererTest, TileQuad) {
list.push_back(root_render_pass.PassAs<RenderPass>());
float device_scale_factor = 1.f;
- renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true, false);
SkBitmap output;
output.setConfig(SkBitmap::kARGB_8888_Config,
@@ -262,7 +262,7 @@ TEST_F(SoftwareRendererTest, TileQuadVisibleRect) {
list.push_back(root_render_pass.PassAs<RenderPass>());
float device_scale_factor = 1.f;
- renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true, false);
SkBitmap output;
output.setConfig(SkBitmap::kARGB_8888_Config,
@@ -314,7 +314,7 @@ TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN);
renderer()->DecideRenderPassAllocationsForFrame(list);
- renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true, false);
renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));
@@ -333,7 +333,7 @@ TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) {
AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA);
renderer()->DecideRenderPassAllocationsForFrame(list);
- renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true, false);
renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
// If we didn't clear, the borders should still be green.
@@ -380,7 +380,7 @@ TEST_F(SoftwareRendererTest, RenderPassVisibleRect) {
root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect;
renderer()->DecideRenderPassAllocationsForFrame(list);
- renderer()->DrawFrame(&list, NULL, device_scale_factor, true);
+ renderer()->DrawFrame(&list, NULL, device_scale_factor, true, false);
renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect);
EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0));
diff --git a/cc/resources/picture_pile_impl_unittest.cc b/cc/resources/picture_pile_impl_unittest.cc
index ed3307e..53b2068 100644
--- a/cc/resources/picture_pile_impl_unittest.cc
+++ b/cc/resources/picture_pile_impl_unittest.cc
@@ -671,9 +671,10 @@ TEST(PicturePileImplTest, PixelRefIteratorMultiplePictures) {
for (int x = 0; x < 2; ++x) {
if (x == 0 && y == 1)
continue;
+ SkPaint paint;
content_layer_clients[y][x].add_draw_bitmap(
lazy_bitmap[y][x],
- gfx::Point(x * 128 + 10, y * 128 + 10));
+ gfx::Point(x * 128 + 10, y * 128 + 10), paint);
pictures[y][x] = Picture::Create(
gfx::Rect(x * 128 + 10, y * 128 + 10, 64, 64));
pictures[y][x]->Record(
diff --git a/cc/resources/picture_unittest.cc b/cc/resources/picture_unittest.cc
index e7f632f..e07b0a8 100644
--- a/cc/resources/picture_unittest.cc
+++ b/cc/resources/picture_unittest.cc
@@ -127,9 +127,10 @@ TEST(PictureTest, PixelRefIterator) {
for (int x = 0; x < 4; ++x) {
if ((x + y) & 1) {
CreateBitmap(gfx::Size(500, 500), "lazy", &lazy_bitmap[y][x]);
+ SkPaint paint;
content_layer_client.add_draw_bitmap(
lazy_bitmap[y][x],
- gfx::Point(x * 512 + 6, y * 512 + 6));
+ gfx::Point(x * 512 + 6, y * 512 + 6), paint);
}
}
}
@@ -224,9 +225,10 @@ TEST(PictureTest, PixelRefIteratorNonZeroLayer) {
for (int x = 0; x < 4; ++x) {
if ((x + y) & 1) {
CreateBitmap(gfx::Size(500, 500), "lazy", &lazy_bitmap[y][x]);
+ SkPaint paint;
content_layer_client.add_draw_bitmap(
lazy_bitmap[y][x],
- gfx::Point(1024 + x * 512 + 6, y * 512 + 6));
+ gfx::Point(1024 + x * 512 + 6, y * 512 + 6), paint);
}
}
}
@@ -345,9 +347,10 @@ TEST(PictureTest, PixelRefIteratorOnePixelQuery) {
for (int x = 0; x < 4; ++x) {
if ((x + y) & 1) {
CreateBitmap(gfx::Size(500, 500), "lazy", &lazy_bitmap[y][x]);
+ SkPaint paint;
content_layer_client.add_draw_bitmap(
lazy_bitmap[y][x],
- gfx::Point(x * 512 + 6, y * 512 + 6));
+ gfx::Point(x * 512 + 6, y * 512 + 6), paint);
}
}
}
diff --git a/cc/test/fake_content_layer_client.cc b/cc/test/fake_content_layer_client.cc
index 16033b7..af70c0c 100644
--- a/cc/test/fake_content_layer_client.cc
+++ b/cc/test/fake_content_layer_client.cc
@@ -35,7 +35,7 @@ void FakeContentLayerClient::PaintContents(SkCanvas* canvas,
for (BitmapVector::const_iterator it = draw_bitmaps_.begin();
it != draw_bitmaps_.end(); ++it) {
- canvas->drawBitmap(it->first, it->second.x(), it->second.y());
+ canvas->drawBitmap(it->bitmap, it->point.x(), it->point.y(), &it->paint);
}
}
diff --git a/cc/test/fake_content_layer_client.h b/cc/test/fake_content_layer_client.h
index ff42855..6afa5b6 100644
--- a/cc/test/fake_content_layer_client.h
+++ b/cc/test/fake_content_layer_client.h
@@ -18,6 +18,12 @@ namespace cc {
class FakeContentLayerClient : public cc::ContentLayerClient {
public:
+ struct BitmapData {
+ SkBitmap bitmap;
+ gfx::Point point;
+ SkPaint paint;
+ };
+
FakeContentLayerClient();
virtual ~FakeContentLayerClient();
@@ -32,13 +38,19 @@ class FakeContentLayerClient : public cc::ContentLayerClient {
draw_rects_.push_back(std::make_pair(rect, paint));
}
- void add_draw_bitmap(const SkBitmap& bitmap, gfx::Point point) {
- draw_bitmaps_.push_back(std::make_pair(bitmap, point));
+ void add_draw_bitmap(const SkBitmap& bitmap,
+ gfx::Point point,
+ const SkPaint& paint) {
+ BitmapData data;
+ data.bitmap = bitmap;
+ data.point = point;
+ data.paint = paint;
+ draw_bitmaps_.push_back(data);
}
private:
typedef std::vector<std::pair<gfx::RectF, SkPaint> > RectPaintVector;
- typedef std::vector<std::pair<SkBitmap, gfx::Point> > BitmapVector;
+ typedef std::vector<BitmapData> BitmapVector;
bool paint_all_opaque_;
RectPaintVector draw_rects_;
diff --git a/cc/test/fake_picture_pile_impl.h b/cc/test/fake_picture_pile_impl.h
index 1b35ecfc..770dffe4e 100644
--- a/cc/test/fake_picture_pile_impl.h
+++ b/cc/test/fake_picture_pile_impl.h
@@ -39,13 +39,19 @@ class FakePicturePileImpl : public PicturePileImpl {
}
void add_draw_bitmap(const SkBitmap& bitmap, gfx::Point point) {
- client_.add_draw_bitmap(bitmap, point);
+ client_.add_draw_bitmap(bitmap, point, default_paint_);
}
void add_draw_rect_with_paint(const gfx::RectF& rect, const SkPaint& paint) {
client_.add_draw_rect(rect, paint);
}
+ void add_draw_bitmap_with_paint(const SkBitmap& bitmap,
+ gfx::Point point,
+ const SkPaint& paint) {
+ client_.add_draw_bitmap(bitmap, point, paint);
+ }
+
void set_default_paint(const SkPaint& paint) {
default_paint_ = paint;
}
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc
index 864af4e..05688b1 100644
--- a/cc/test/pixel_test.cc
+++ b/cc/test/pixel_test.cc
@@ -72,6 +72,7 @@ class PixelTest::PixelTestRendererClient
PixelTest::PixelTest()
: device_viewport_size_(gfx::Size(200, 200)),
+ disable_picture_quad_image_filtering_(false),
fake_client_(
new PixelTestRendererClient(gfx::Rect(device_viewport_size_))) {}
@@ -119,7 +120,8 @@ bool PixelTest::RunPixelTestWithReadbackTarget(
renderer_->DrawFrame(pass_list,
offscreen_contexts.get(),
device_scale_factor,
- allow_partial_swap);
+ allow_partial_swap,
+ disable_picture_quad_image_filtering_);
// Wait for the readback to complete.
resource_provider_->Finish();
diff --git a/cc/test/pixel_test.h b/cc/test/pixel_test.h
index 6ff1762..7b5829d 100644
--- a/cc/test/pixel_test.h
+++ b/cc/test/pixel_test.h
@@ -44,6 +44,7 @@ class PixelTest : public testing::Test {
LayerTreeSettings settings_;
gfx::Size device_viewport_size_;
+ bool disable_picture_quad_image_filtering_;
class PixelTestRendererClient;
scoped_ptr<OutputSurface> output_surface_;
scoped_ptr<ResourceProvider> resource_provider_;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index c2cb28d..fc8c75f 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -1329,11 +1329,14 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame,
if (output_surface_->ForcedDrawToSoftwareDevice()) {
bool allow_partial_swap = false;
+ bool disable_picture_quad_image_filtering =
+ IsCurrentlyScrolling() || needs_animate_layers();
scoped_ptr<SoftwareRenderer> temp_software_renderer =
SoftwareRenderer::Create(this, &settings_, output_surface_.get(), NULL);
temp_software_renderer->DrawFrame(
- &frame->render_passes, NULL, device_scale_factor_, allow_partial_swap);
+ &frame->render_passes, NULL, device_scale_factor_, allow_partial_swap,
+ disable_picture_quad_image_filtering);
} else {
// We don't track damage on the HUD layer (it interacts with damage tracking
// visualizations), so disable partial swaps to make the HUD layer display
@@ -1343,7 +1346,8 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame,
renderer_->DrawFrame(&frame->render_passes,
offscreen_context_provider_.get(),
device_scale_factor_,
- allow_partial_swap);
+ allow_partial_swap,
+ false);
}
// The render passes should be consumed by the renderer.
DCHECK(frame->render_passes.empty());
@@ -1448,6 +1452,11 @@ LayerImpl* LayerTreeHostImpl::CurrentlyScrollingLayer() const {
return active_tree_->CurrentlyScrollingLayer();
}
+bool LayerTreeHostImpl::IsCurrentlyScrolling() const {
+ return CurrentlyScrollingLayer() ||
+ (RootScrollLayer() && RootScrollLayer()->IsExternalFlingActive());
+}
+
// Content layers can be either directly scrollable or contained in an outer
// scrolling layer which applies the scroll transform. Given a content layer,
// this function returns the associated scroll layer if any.
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index b725ef4..4868774 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -282,6 +282,8 @@ class CC_EXPORT LayerTreeHostImpl
return scroll_layer_id_when_mouse_over_scrollbar_;
}
+ bool IsCurrentlyScrolling() const;
+
virtual void SetVisible(bool visible);
bool visible() const { return visible_; }
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index ae2dfe8..23a0378 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -2449,6 +2449,8 @@ class TestScrollOffsetDelegate : public LayerScrollOffsetDelegate {
return getter_return_value_;
}
+ virtual bool IsExternalFlingActive() const OVERRIDE { return false; }
+
virtual void SetPageScaleFactor(float page_scale_factor) OVERRIDE {
page_scale_factor_ = page_scale_factor;
}
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc
index f409762..e184564 100644
--- a/cc/trees/thread_proxy.cc
+++ b/cc/trees/thread_proxy.cc
@@ -1494,7 +1494,7 @@ void ThreadProxy::RenewTreePriority() {
DCHECK(IsImplThread());
bool smoothness_takes_priority =
layer_tree_host_impl_->pinch_gesture_active() ||
- layer_tree_host_impl_->CurrentlyScrollingLayer() ||
+ layer_tree_host_impl_->IsCurrentlyScrolling() ||
layer_tree_host_impl_->page_scale_animation_active();
base::TimeTicks now = layer_tree_host_impl_->CurrentPhysicalTimeTicks();