diff options
author | nick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-25 17:32:20 +0000 |
---|---|---|
committer | nick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-25 17:32:20 +0000 |
commit | f088145ace0e944476074c58114aba217f9438e3 (patch) | |
tree | ceb320ec1f4f7b682743ac13fd5bbd850b5b28a8 /cc | |
parent | 51a5a9dfd1dc14e4bbccbb2cb661f84df495b2fe (diff) | |
download | chromium_src-f088145ace0e944476074c58114aba217f9438e3.zip chromium_src-f088145ace0e944476074c58114aba217f9438e3.tar.gz chromium_src-f088145ace0e944476074c58114aba217f9438e3.tar.bz2 |
Revert 196423 "cc: Fix anti-aliasing of axis-aligned quads."
[Reason for revert: AxisAligned unit test is failing on some of the Mac bots.]
> cc: Fix anti-aliasing of axis-aligned quads.
>
> Axis-aligned quads with edges not aligned to pixel boundaries
> are rendered incorrectly. These quads need anti-aliasing but
> current code that determines if anti-aliasing is needed thinks
> that no axis-aligned quads need it.
>
> This fixes the problem by adding alignment to pixel boundaries
> as an additional requirement to avoid anti-aliasing.
>
> BUG=169374
> TEST=GLRendererPixelTest.AxisAligned,GLRendererShaderTest.DrawSolidColorShad
>
> Review URL: https://chromiumcodereview.appspot.com/12538005
TBR=reveman@chromium.org
Review URL: https://codereview.chromium.org/14465006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@196427 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r-- | cc/output/gl_renderer.cc | 32 | ||||
-rw-r--r-- | cc/output/gl_renderer_pixeltest.cc | 52 | ||||
-rw-r--r-- | cc/output/gl_renderer_unittest.cc | 34 | ||||
-rw-r--r-- | cc/test/data/axis_aligned.png | 0 | ||||
-rw-r--r-- | cc/test/render_pass_test_utils.cc | 16 | ||||
-rw-r--r-- | cc/test/render_pass_test_utils.h | 6 |
6 files changed, 12 insertions, 128 deletions
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc index 19b215b..cf7b64b 100644 --- a/cc/output/gl_renderer.cc +++ b/cc/output/gl_renderer.cc @@ -81,10 +81,6 @@ bool NeedsIOSurfaceReadbackWorkaround() { #endif } -// Smallest unit that impact anti-aliasing output. We use this to -// determine when anti-aliasing is unnecessary. -const float kAntiAliasingEpsilon = 1.0f / 1024.0f; - } // anonymous namespace scoped_ptr<GLRenderer> GLRenderer::Create(RendererClient* client, @@ -719,8 +715,7 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, // Use anti-aliasing programs only when necessary. bool use_aa = (!device_quad.IsRectilinear() || - !gfx::IsNearestRectWithinDistance(device_quad.BoundingBox(), - kAntiAliasingEpsilon)); + !device_quad.BoundingBox().IsExpressibleAsRect()); if (use_aa) { device_layer_bounds.InflateAntiAliasingDistance(); device_layer_edges.InflateAntiAliasingDistance(); @@ -1016,11 +1011,11 @@ bool GLRenderer::SetupQuadForAntialiasing( device_transform, gfx::QuadF(quad->visibleContentRect()), &clipped); DCHECK(!clipped); + // TODO(reveman): Axis-aligned is not enough to avoid anti-aliasing. + // Bounding rectangle for quad also needs to be expressible as an integer + // rectangle. crbug.com/169374 bool is_axis_aligned_in_target = device_layer_quad.IsRectilinear(); - bool is_nearest_rect_within_epsilon = is_axis_aligned_in_target && - gfx::IsNearestRectWithinDistance(device_layer_quad.BoundingBox(), - kAntiAliasingEpsilon); - bool use_aa = !clipped && !is_nearest_rect_within_epsilon && quad->IsEdge(); + bool use_aa = !clipped && !is_axis_aligned_in_target && quad->IsEdge(); if (!use_aa) return false; @@ -1205,16 +1200,13 @@ void GLRenderer::DrawContentQuad(const DrawingFrame* frame, // is mapped to the unit square by the vertex shader and mapped // back to normalized texture coordinates by the fragment shader // after being clamped to 0-1 range. - float tex_clamp_x = std::min( - 0.5f, 0.5f * clamp_tex_rect.width() - kAntiAliasingEpsilon); - float tex_clamp_y = std::min( - 0.5f, 0.5f * clamp_tex_rect.height() - kAntiAliasingEpsilon); - float geom_clamp_x = std::min( - tex_clamp_x * tex_to_geom_scale_x, - 0.5f * clamp_geom_rect.width() - kAntiAliasingEpsilon); - float geom_clamp_y = std::min( - tex_clamp_y * tex_to_geom_scale_y, - 0.5f * clamp_geom_rect.height() - kAntiAliasingEpsilon); + const float epsilon = 1.0f / 1024.0f; + float tex_clamp_x = std::min(0.5f, 0.5f * clamp_tex_rect.width() - epsilon); + float tex_clamp_y = std::min(0.5f, 0.5f * clamp_tex_rect.height() - epsilon); + float geom_clamp_x = std::min(tex_clamp_x * tex_to_geom_scale_x, + 0.5f * clamp_geom_rect.width() - epsilon); + float geom_clamp_y = std::min(tex_clamp_y * tex_to_geom_scale_y, + 0.5f * clamp_geom_rect.height() - epsilon); clamp_geom_rect.Inset(geom_clamp_x, geom_clamp_y, geom_clamp_x, geom_clamp_y); clamp_tex_rect.Inset(tex_clamp_x, tex_clamp_y, tex_clamp_x, tex_clamp_y); diff --git a/cc/output/gl_renderer_pixeltest.cc b/cc/output/gl_renderer_pixeltest.cc index 8da1b24..064b78b 100644 --- a/cc/output/gl_renderer_pixeltest.cc +++ b/cc/output/gl_renderer_pixeltest.cc @@ -524,58 +524,6 @@ TEST_F(GLRendererPixelTest, AntiAliasing) { base::FilePath(FILE_PATH_LITERAL("anti_aliasing.png")), ExactPixelComparator(true))); } - -TEST_F(GLRendererPixelTest, AxisAligned) { - gfx::Rect rect(0, 0, 200, 200); - - RenderPass::Id id(1, 1); - gfx::Transform transform_to_root; - scoped_ptr<RenderPass> pass = - CreateTestRenderPass(id, rect, transform_to_root); - - gfx::Transform red_content_to_target_transform; - red_content_to_target_transform.Translate(50, 50); - red_content_to_target_transform.Scale( - 0.5f + 1.0f / (rect.width() * 2.0f), - 0.5f + 1.0f / (rect.height() * 2.0f)); - scoped_ptr<SharedQuadState> red_shared_state = - CreateTestSharedQuadState(red_content_to_target_transform, rect); - - scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create(); - red->SetNew(red_shared_state.get(), rect, SK_ColorRED); - - pass->quad_list.push_back(red.PassAs<DrawQuad>()); - - gfx::Transform yellow_content_to_target_transform; - yellow_content_to_target_transform.Translate(25.5f, 25.5f); - yellow_content_to_target_transform.Scale(0.5f, 0.5f); - scoped_ptr<SharedQuadState> yellow_shared_state = - CreateTestSharedQuadState(yellow_content_to_target_transform, rect); - - scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); - yellow->SetNew(yellow_shared_state.get(), rect, SK_ColorYELLOW); - - pass->quad_list.push_back(yellow.PassAs<DrawQuad>()); - - gfx::Transform blue_content_to_target_transform; - scoped_ptr<SharedQuadState> blue_shared_state = - CreateTestSharedQuadState(blue_content_to_target_transform, rect); - - scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); - blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE); - - pass->quad_list.push_back(blue.PassAs<DrawQuad>()); - - RenderPassList pass_list; - pass_list.push_back(pass.Pass()); - - renderer_->DrawFrame(&pass_list); - - EXPECT_TRUE(PixelsMatchReference( - base::FilePath(FILE_PATH_LITERAL("axis_aligned.png")), - ExactPixelComparator(true))); -} - #endif } // namespace diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc index bbd261a..ef56cc2 100644 --- a/cc/output/gl_renderer_unittest.cc +++ b/cc/output/gl_renderer_unittest.cc @@ -325,12 +325,6 @@ class GLRendererShaderTest : public testing::Test { renderer_->render_pass_color_matrix_program_aa_->program()); } - void TestSolidColorProgramAA() { - EXPECT_PROGRAM_VALID(renderer_->solid_color_program_aa_); - EXPECT_TRUE(renderer_->program_shadow_ == - renderer_->solid_color_program_aa_->program()); - } - scoped_ptr<OutputSurface> output_surface_; FakeRendererClient mock_client_; scoped_ptr<ResourceProvider> resource_provider_; @@ -1277,34 +1271,6 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) { TestRenderPassMaskColorMatrixProgramAA(); } -TEST_F(GLRendererShaderTest, DrawSolidColorShader) { - gfx::Rect viewport_rect(mock_client_.DeviceViewportSize()); - ScopedPtrVector<RenderPass>* render_passes = - mock_client_.render_passes_in_draw_order(); - - RenderPass::Id root_pass_id(1, 0); - TestRenderPass* root_pass; - - gfx::Transform pixel_aligned_transform_causing_aa; - pixel_aligned_transform_causing_aa.Translate(25.5f, 25.5f); - pixel_aligned_transform_causing_aa.Scale(0.5f, 0.5f); - - render_passes->clear(); - - root_pass = AddRenderPass( - render_passes, root_pass_id, viewport_rect, gfx::Transform()); - AddTransformedQuad(root_pass, - viewport_rect, - SK_ColorYELLOW, - pixel_aligned_transform_causing_aa); - - renderer_->DecideRenderPassAllocationsForFrame( - *mock_client_.render_passes_in_draw_order()); - renderer_->DrawFrame(mock_client_.render_passes_in_draw_order()); - - TestSolidColorProgramAA(); -} - class OutputSurfaceMockContext : public TestWebGraphicsContext3D { public: // Specifically override methods even if they are unused (used in conjunction diff --git a/cc/test/data/axis_aligned.png b/cc/test/data/axis_aligned.png deleted file mode 100644 index e69de29..0000000 --- a/cc/test/data/axis_aligned.png +++ /dev/null diff --git a/cc/test/render_pass_test_utils.cc b/cc/test/render_pass_test_utils.cc index 719be7f..24cb778 100644 --- a/cc/test/render_pass_test_utils.cc +++ b/cc/test/render_pass_test_utils.cc @@ -57,22 +57,6 @@ SolidColorDrawQuad* AddClippedQuad(TestRenderPass* pass, return quad_ptr; } -SolidColorDrawQuad* AddTransformedQuad(TestRenderPass* pass, - gfx::Rect rect, - SkColor color, - const gfx::Transform& transform) { - MockQuadCuller quad_sink(&pass->quad_list, &pass->shared_quad_state_list); - AppendQuadsData data(pass->id); - SharedQuadState* shared_state = - quad_sink.UseSharedQuadState(SharedQuadState::Create()); - shared_state->SetAll(transform, rect.size(), rect, rect, false, 1); - scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); - quad->SetNew(shared_state, rect, color); - SolidColorDrawQuad* quad_ptr = quad.get(); - quad_sink.Append(quad.PassAs<DrawQuad>(), &data); - return quad_ptr; -} - void AddRenderPassQuad(TestRenderPass* to_pass, TestRenderPass* contributing_pass) { MockQuadCuller quad_sink(&to_pass->quad_list, diff --git a/cc/test/render_pass_test_utils.h b/cc/test/render_pass_test_utils.h index 01a7ca0..fdc6366 100644 --- a/cc/test/render_pass_test_utils.h +++ b/cc/test/render_pass_test_utils.h @@ -38,12 +38,6 @@ SolidColorDrawQuad* AddClippedQuad(TestRenderPass* pass, gfx::Rect rect, SkColor color); -// Adds a solid quad with a transform to a given render pass. -SolidColorDrawQuad* AddTransformedQuad(TestRenderPass* pass, - gfx::Rect rect, - SkColor color, - const gfx::Transform& transform); - // Adds a render pass quad to an existing render pass. void AddRenderPassQuad(TestRenderPass* to_pass, TestRenderPass* contributing_pass); |