summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-20 06:36:13 +0000
committerdanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-20 06:36:13 +0000
commit353908965d3de013d8de38cfa184f2a40d275046 (patch)
treeddf87d1ee2d343900a5d2ba935260a9c95c0731c
parentd2af1cdb2415db51159b45dc527cc16695f994b9 (diff)
downloadchromium_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.cc8
-rw-r--r--cc/layers/ui_resource_layer_impl_unittest.cc59
-rw-r--r--cc/test/layer_test_common.h1
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: