summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authoraelias@chromium.org <aelias@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-29 11:19:19 +0000
committeraelias@chromium.org <aelias@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-29 11:19:19 +0000
commitbfac689d6c25602931658142b34f34f503aa6c10 (patch)
tree2aca12b76d41e2338c1192c380351e760d21fa56 /cc
parent56e8e2029edf5b1a6e733bb43da41e7a543c2dc9 (diff)
downloadchromium_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.cc73
-rw-r--r--cc/output/software_renderer.cc34
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, &current_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,