summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authordanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-20 18:36:15 +0000
committerdanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-20 18:36:15 +0000
commit0a1b984aa537859e033de89a3a8392b5d357f951 (patch)
tree35cd291d6d81a75e4651994c92e1407ab9c85545 /cc
parent7a2f984ad53eb52a0c865781ef85390a591f80e4 (diff)
downloadchromium_src-0a1b984aa537859e033de89a3a8392b5d357f951.zip
chromium_src-0a1b984aa537859e033de89a3a8392b5d357f951.tar.gz
chromium_src-0a1b984aa537859e033de89a3a8392b5d357f951.tar.bz2
cc: Apply occlusion before creating quads in SurfaceLayerImpl.
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=jamesr@chromium.org, jamesr BUG=344962 Review URL: https://codereview.chromium.org/205123002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@258364 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r--cc/cc_tests.gyp1
-rw-r--r--cc/layers/surface_layer_impl.cc7
-rw-r--r--cc/layers/surface_layer_impl_unittest.cc66
3 files changed, 72 insertions, 2 deletions
diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp
index d7e6e72..c593e9e 100644
--- a/cc/cc_tests.gyp
+++ b/cc/cc_tests.gyp
@@ -43,6 +43,7 @@
'layers/render_surface_unittest.cc',
'layers/scrollbar_layer_unittest.cc',
'layers/solid_color_layer_impl_unittest.cc',
+ 'layers/surface_layer_impl_unittest.cc',
'layers/texture_layer_unittest.cc',
'layers/texture_layer_impl_unittest.cc',
'layers/tiled_layer_impl_unittest.cc',
diff --git a/cc/layers/surface_layer_impl.cc b/cc/layers/surface_layer_impl.cc
index ffeae2a..2f98805 100644
--- a/cc/layers/surface_layer_impl.cc
+++ b/cc/layers/surface_layer_impl.cc
@@ -46,9 +46,12 @@ void SurfaceLayerImpl::AppendQuads(QuadSink* quad_sink,
scoped_ptr<SurfaceDrawQuad> quad = SurfaceDrawQuad::Create();
gfx::Rect quad_rect(content_bounds());
- 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;
quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect, surface_id_);
- quad_sink->MaybeAppend(quad.PassAs<DrawQuad>());
+ quad_sink->Append(quad.PassAs<DrawQuad>());
}
void SurfaceLayerImpl::GetDebugBorderProperties(SkColor* color,
diff --git a/cc/layers/surface_layer_impl_unittest.cc b/cc/layers/surface_layer_impl_unittest.cc
new file mode 100644
index 0000000..86e3e49c
--- /dev/null
+++ b/cc/layers/surface_layer_impl_unittest.cc
@@ -0,0 +1,66 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/layers/surface_layer_impl.h"
+
+#include "cc/test/layer_test_common.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cc {
+namespace {
+
+TEST(SurfaceLayerImplTest, Occlusion) {
+ gfx::Size layer_size(1000, 1000);
+ gfx::Size viewport_size(1000, 1000);
+
+ LayerTestCommon::LayerImplTest impl;
+
+ SurfaceLayerImpl* surface_layer_impl =
+ impl.AddChildToRoot<SurfaceLayerImpl>();
+ surface_layer_impl->SetAnchorPoint(gfx::PointF());
+ surface_layer_impl->SetBounds(layer_size);
+ surface_layer_impl->SetContentBounds(layer_size);
+ surface_layer_impl->SetDrawsContent(true);
+ surface_layer_impl->SetSurfaceId(9);
+
+ impl.CalcDrawProps(viewport_size);
+
+ {
+ SCOPED_TRACE("No occlusion");
+ gfx::Rect occluded;
+ impl.AppendQuadsWithOcclusion(surface_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(surface_layer_impl->visible_content_rect());
+ impl.AppendQuadsWithOcclusion(surface_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(surface_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