diff options
author | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-20 06:36:13 +0000 |
---|---|---|
committer | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-20 06:36:13 +0000 |
commit | 353908965d3de013d8de38cfa184f2a40d275046 (patch) | |
tree | ddf87d1ee2d343900a5d2ba935260a9c95c0731c | |
parent | d2af1cdb2415db51159b45dc527cc16695f994b9 (diff) | |
download | chromium_src-353908965d3de013d8de38cfa184f2a40d275046.zip chromium_src-353908965d3de013d8de38cfa184f2a40d275046.tar.gz chromium_src-353908965d3de013d8de38cfa184f2a40d275046.tar.bz2 |
cc: Apply occlusion before creating quads in UIResourceLayerImpl.
This makes the AppendQuads method query occlusion directly and subtract
it from the quads it would create before they are created, skipping
quads that are completely occluded and avoiding a malloc/free for them.
Depends on: https://codereview.chromium.org/201153021/
R=enne
BUG=344962
Review URL: https://codereview.chromium.org/203463015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@258228 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | cc/layers/ui_resource_layer_impl.cc | 8 | ||||
-rw-r--r-- | cc/layers/ui_resource_layer_impl_unittest.cc | 59 | ||||
-rw-r--r-- | cc/test/layer_test_common.h | 1 |
3 files changed, 66 insertions, 2 deletions
diff --git a/cc/layers/ui_resource_layer_impl.cc b/cc/layers/ui_resource_layer_impl.cc index 2a975314..33392af 100644 --- a/cc/layers/ui_resource_layer_impl.cc +++ b/cc/layers/ui_resource_layer_impl.cc @@ -116,7 +116,11 @@ void UIResourceLayerImpl::AppendQuads(QuadSink* quad_sink, gfx::Rect quad_rect(bounds()); gfx::Rect opaque_rect(opaque ? quad_rect : gfx::Rect()); - gfx::Rect visible_quad_rect(quad_rect); + gfx::Rect visible_quad_rect = quad_sink->UnoccludedContentRect( + quad_rect, draw_properties().target_space_transform); + if (visible_quad_rect.IsEmpty()) + return; + scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create(); quad->SetNew(shared_quad_state, quad_rect, @@ -129,7 +133,7 @@ void UIResourceLayerImpl::AppendQuads(QuadSink* quad_sink, SK_ColorTRANSPARENT, vertex_opacity_, flipped); - quad_sink->MaybeAppend(quad.PassAs<DrawQuad>()); + quad_sink->Append(quad.PassAs<DrawQuad>()); } const char* UIResourceLayerImpl::LayerTypeAsString() const { diff --git a/cc/layers/ui_resource_layer_impl_unittest.cc b/cc/layers/ui_resource_layer_impl_unittest.cc index 596cb3b..01c7c40 100644 --- a/cc/layers/ui_resource_layer_impl_unittest.cc +++ b/cc/layers/ui_resource_layer_impl_unittest.cc @@ -148,5 +148,64 @@ TEST(UIResourceLayerImplTest, VerifySetOpaqueOnLayer) { OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds); } +TEST(UIResourceLayerImplTest, Occlusion) { + gfx::Size layer_size(1000, 1000); + gfx::Size viewport_size(1000, 1000); + + LayerTestCommon::LayerImplTest impl; + + SkBitmap sk_bitmap; + sk_bitmap.allocN32Pixels(10, 10); + sk_bitmap.setImmutable(); + UIResourceId uid = 5; + UIResourceBitmap bitmap(sk_bitmap); + impl.host_impl()->CreateUIResource(uid, bitmap); + + UIResourceLayerImpl* ui_resource_layer_impl = + impl.AddChildToRoot<UIResourceLayerImpl>(); + ui_resource_layer_impl->SetAnchorPoint(gfx::PointF()); + ui_resource_layer_impl->SetBounds(layer_size); + ui_resource_layer_impl->SetContentBounds(layer_size); + ui_resource_layer_impl->SetDrawsContent(true); + ui_resource_layer_impl->SetUIResourceId(uid); + + impl.CalcDrawProps(viewport_size); + + { + SCOPED_TRACE("No occlusion"); + gfx::Rect occluded; + impl.AppendQuadsWithOcclusion(ui_resource_layer_impl, occluded); + + LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), + gfx::Rect(layer_size)); + EXPECT_EQ(1u, impl.quad_list().size()); + } + + { + SCOPED_TRACE("Full occlusion"); + gfx::Rect occluded(ui_resource_layer_impl->visible_content_rect()); + impl.AppendQuadsWithOcclusion(ui_resource_layer_impl, occluded); + + LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect()); + EXPECT_EQ(impl.quad_list().size(), 0u); + } + + { + SCOPED_TRACE("Partial occlusion"); + gfx::Rect occluded(200, 0, 800, 1000); + impl.AppendQuadsWithOcclusion(ui_resource_layer_impl, occluded); + + size_t partially_occluded_count = 0; + LayerTestCommon::VerifyQuadsCoverRectWithOcclusion( + impl.quad_list(), + gfx::Rect(layer_size), + occluded, + &partially_occluded_count); + // The layer outputs one quad, which is partially occluded. + EXPECT_EQ(1u, impl.quad_list().size()); + EXPECT_EQ(1u, partially_occluded_count); + } +} + } // namespace } // namespace cc diff --git a/cc/test/layer_test_common.h b/cc/test/layer_test_common.h index a1ca537..12b630f 100644 --- a/cc/test/layer_test_common.h +++ b/cc/test/layer_test_common.h @@ -76,6 +76,7 @@ class LayerTestCommon { ResourceProvider* resource_provider() const { return host_->host_impl()->resource_provider(); } + FakeLayerTreeHostImpl* host_impl() const { return host_->host_impl(); } const QuadList& quad_list() const { return quad_culler_.quad_list(); } private: |