diff options
author | aelias@chromium.org <aelias@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-29 11:19:19 +0000 |
---|---|---|
committer | aelias@chromium.org <aelias@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-29 11:19:19 +0000 |
commit | bfac689d6c25602931658142b34f34f503aa6c10 (patch) | |
tree | 2aca12b76d41e2338c1192c380351e760d21fa56 /cc | |
parent | 56e8e2029edf5b1a6e733bb43da41e7a543c2dc9 (diff) | |
download | chromium_src-bfac689d6c25602931658142b34f34f503aa6c10.zip chromium_src-bfac689d6c25602931658142b34f34f503aa6c10.tar.gz chromium_src-bfac689d6c25602931658142b34f34f503aa6c10.tar.bz2 |
Optimize alpha software PictureDrawQuads.
Instead of mallocing another bitmap, edit the SkPicture's draw commands
at playback time to use the PictureDrawQuad's opacity. This
results in similar performance as if Blink had baked in the opacity in
the first place. However, it's not correct in some cases:
filed http://crbug.com/280374 to track.
Also turn off setFilterBitmap for software PictureDrawQuads as this is
very costly in practice.
BUG=275048
Review URL: https://chromiumcodereview.appspot.com/22867046
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@220257 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r-- | cc/output/renderer_pixeltest.cc | 73 | ||||
-rw-r--r-- | cc/output/software_renderer.cc | 34 |
2 files changed, 86 insertions, 21 deletions
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc index d85db7f..e8d1323 100644 --- a/cc/output/renderer_pixeltest.cc +++ b/cc/output/renderer_pixeltest.cc @@ -1416,6 +1416,79 @@ TYPED_TEST(RendererPixelTestWithSkiaGPUBackend, PictureDrawQuadIdentityScale) { ExactPixelComparator(true))); } +// Not WithSkiaGPUBackend since that path currently requires tiles for opacity. +TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) { + gfx::Size pile_tile_size(1000, 1000); + gfx::Rect viewport(this->device_viewport_size_); + bool use_skia_gpu_backend = this->UseSkiaGPUBackend(); + bool contents_swizzled = !PlatformColor::SameComponentOrder(GL_RGBA); + + RenderPass::Id id(1, 1); + gfx::Transform transform_to_root; + scoped_ptr<RenderPass> pass = + CreateTestRenderPass(id, viewport, transform_to_root); + + // One viewport-filling 0.5-opacity green quad. + scoped_refptr<FakePicturePileImpl> green_pile = + FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size()); + SkPaint green_paint; + green_paint.setColor(SK_ColorGREEN); + green_pile->add_draw_rect_with_paint(viewport, green_paint); + green_pile->RerecordPile(); + + gfx::Transform green_content_to_target_transform; + scoped_ptr<SharedQuadState> green_shared_state = + CreateTestSharedQuadState(green_content_to_target_transform, viewport); + green_shared_state->opacity = 0.5f; + + scoped_ptr<PictureDrawQuad> green_quad = PictureDrawQuad::Create(); + green_quad->SetNew(green_shared_state.get(), + viewport, + gfx::Rect(), + gfx::RectF(0, 0, 1, 1), + viewport.size(), + contents_swizzled, + viewport, + 1.f, + use_skia_gpu_backend, + green_pile); + pass->quad_list.push_back(green_quad.PassAs<DrawQuad>()); + + // One viewport-filling white quad. + scoped_refptr<FakePicturePileImpl> white_pile = + FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size()); + SkPaint white_paint; + white_paint.setColor(SK_ColorWHITE); + white_pile->add_draw_rect_with_paint(viewport, white_paint); + white_pile->RerecordPile(); + + gfx::Transform white_content_to_target_transform; + scoped_ptr<SharedQuadState> white_shared_state = + CreateTestSharedQuadState(white_content_to_target_transform, viewport); + + scoped_ptr<PictureDrawQuad> white_quad = PictureDrawQuad::Create(); + white_quad->SetNew(white_shared_state.get(), + viewport, + gfx::Rect(), + gfx::RectF(0, 0, 1, 1), + viewport.size(), + contents_swizzled, + viewport, + 1.f, + use_skia_gpu_backend, + white_pile); + pass->quad_list.push_back(white_quad.PassAs<DrawQuad>()); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + + EXPECT_TRUE(this->RunPixelTest( + &pass_list, + PixelTest::NoOffscreenContext, + base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), + FuzzyPixelOffByOneComparator(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 7054fd5..77c44ea 100644 --- a/cc/output/software_renderer.cc +++ b/cc/output/software_renderer.cc @@ -19,7 +19,7 @@ #include "cc/quads/solid_color_draw_quad.h" #include "cc/quads/texture_draw_quad.h" #include "cc/quads/tile_draw_quad.h" -#include "third_party/skia/include/core/SkBitmapDevice.h" +#include "skia/ext/opacity_draw_filter.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkMatrix.h" @@ -313,27 +313,19 @@ void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame, SkMatrix::kFill_ScaleToFit); current_canvas_->concat(content_matrix); - if (quad->ShouldDrawWithBlending()) { - TRACE_EVENT0("cc", "SoftwareRenderer::DrawPictureQuad with blending"); - SkBitmap temp_bitmap; - temp_bitmap.setConfig(SkBitmap::kARGB_8888_Config, - quad->texture_size.width(), - quad->texture_size.height()); - temp_bitmap.allocPixels(); - SkBitmapDevice temp_device(temp_bitmap); - SkCanvas temp_canvas(&temp_device); - - quad->picture_pile->RasterToBitmap( - &temp_canvas, quad->content_rect, quad->contents_scale, NULL); + // TODO(aelias): This isn't correct in all cases. We should detect these + // cases and fall back to a persistent bitmap backing + // (http://crbug.com/280374). + DCHECK(!current_canvas_->getDrawFilter()); + current_canvas_->setDrawFilter(new skia::OpacityDrawFilter(quad->opacity(), + true)); - current_paint_.setFilterBitmap(true); - current_canvas_->drawBitmap(temp_bitmap, 0, 0, ¤t_paint_); - } else { - TRACE_EVENT0("cc", - "SoftwareRenderer::DrawPictureQuad direct from PicturePile"); - quad->picture_pile->RasterDirect( - current_canvas_, quad->content_rect, quad->contents_scale, NULL); - } + TRACE_EVENT0("cc", + "SoftwareRenderer::DrawPictureQuad"); + quad->picture_pile->RasterDirect( + current_canvas_, quad->content_rect, quad->contents_scale, NULL); + + current_canvas_->setDrawFilter(NULL); } void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, |