summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authordanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-18 00:52:40 +0000
committerdanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-18 00:52:40 +0000
commit78862e66f4712b0bdabf0a8165c7df1b253c8b6d (patch)
tree27df1fac75b0f1b2b99555e39d56cac8810feac1 /cc
parent723673a3150a5427ba73e9bb8774d79046629fe5 (diff)
downloadchromium_src-78862e66f4712b0bdabf0a8165c7df1b253c8b6d.zip
chromium_src-78862e66f4712b0bdabf0a8165c7df1b253c8b6d.tar.gz
chromium_src-78862e66f4712b0bdabf0a8165c7df1b253c8b6d.tar.bz2
cc: Apply occlusion before creating quads in PictureLayerImpl.
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. R=enne@chromium.org BUG=344962 Review URL: https://codereview.chromium.org/240293009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@264697 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r--cc/layers/picture_layer_impl.cc28
-rw-r--r--cc/layers/picture_layer_impl_unittest.cc59
2 files changed, 76 insertions, 11 deletions
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 558ef91..89e8c53 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -149,7 +149,11 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
gfx::Rect geometry_rect = rect;
gfx::Rect opaque_rect = contents_opaque() ? geometry_rect : gfx::Rect();
- gfx::Rect visible_geometry_rect = geometry_rect;
+ gfx::Rect visible_geometry_rect =
+ quad_sink->UnoccludedContentRect(geometry_rect, draw_transform());
+ if (visible_geometry_rect.IsEmpty())
+ return;
+
gfx::Size texture_size = rect.size();
gfx::RectF texture_rect = gfx::RectF(texture_size);
gfx::Rect quad_content_rect = rect;
@@ -166,8 +170,8 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
quad_content_rect,
contents_scale,
pile_);
- if (quad_sink->MaybeAppend(quad.PassAs<DrawQuad>()))
- append_quads_data->num_missing_tiles++;
+ quad_sink->Append(quad.PassAs<DrawQuad>());
+ append_quads_data->num_missing_tiles++;
return;
}
@@ -216,7 +220,7 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
visible_geometry_rect,
color,
width);
- quad_sink->MaybeAppend(debug_border_quad.PassAs<DrawQuad>());
+ quad_sink->Append(debug_border_quad.PassAs<DrawQuad>());
}
}
@@ -229,16 +233,18 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
iter;
++iter) {
gfx::Rect geometry_rect = iter.geometry_rect();
- gfx::Rect visible_geometry_rect = geometry_rect;
+ gfx::Rect visible_geometry_rect =
+ quad_sink->UnoccludedContentRect(geometry_rect, draw_transform());
+ if (visible_geometry_rect.IsEmpty())
+ continue;
+
if (!*iter || !iter->IsReadyToDraw()) {
if (draw_checkerboard_for_missing_tiles()) {
- // TODO(enne): Figure out how to show debug "invalidated checker" color
scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create();
SkColor color = DebugColors::DefaultCheckerboardColor();
quad->SetNew(
shared_quad_state, geometry_rect, visible_geometry_rect, color);
- if (quad_sink->MaybeAppend(quad.PassAs<DrawQuad>()))
- append_quads_data->num_missing_tiles++;
+ quad_sink->Append(quad.PassAs<DrawQuad>());
} else {
SkColor color = SafeOpaqueBackgroundColor();
scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
@@ -247,10 +253,10 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
visible_geometry_rect,
color,
false);
- if (quad_sink->MaybeAppend(quad.PassAs<DrawQuad>()))
- append_quads_data->num_missing_tiles++;
+ quad_sink->Append(quad.PassAs<DrawQuad>());
}
+ append_quads_data->num_missing_tiles++;
append_quads_data->had_incomplete_tile = true;
continue;
}
@@ -315,7 +321,7 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
}
DCHECK(draw_quad);
- quad_sink->MaybeAppend(draw_quad.Pass());
+ quad_sink->Append(draw_quad.Pass());
if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling())
seen_tilings.push_back(iter.CurrentTiling());
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index d0cb1cb..8fd7185 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -19,6 +19,7 @@
#include "cc/test/fake_picture_pile_impl.h"
#include "cc/test/geometry_test_utils.h"
#include "cc/test/impl_side_painting_settings.h"
+#include "cc/test/layer_test_common.h"
#include "cc/test/mock_quad_culler.h"
#include "cc/test/test_shared_bitmap_manager.h"
#include "cc/test/test_web_graphics_context_3d.h"
@@ -129,6 +130,7 @@ class PictureLayerImplTest : public testing::Test {
scoped_ptr<FakePictureLayerImpl> pending_layer =
FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
pending_layer->SetDrawsContent(true);
+ pending_layer->SetAnchorPoint(gfx::PointF());
pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>());
pending_layer_ = static_cast<FakePictureLayerImpl*>(
@@ -2161,5 +2163,62 @@ TEST_F(PictureLayerImplTest, LayerEvictionTileIterator) {
EXPECT_EQ(all_tiles_set.size(), unique_tiles.size());
}
+TEST_F(PictureLayerImplTest, Occlusion) {
+ gfx::Size tile_size(102, 102);
+ gfx::Size layer_bounds(1000, 1000);
+ gfx::Size viewport_size(1000, 1000);
+
+ LayerTestCommon::LayerImplTest impl;
+
+ scoped_refptr<FakePicturePileImpl> pending_pile =
+ FakePicturePileImpl::CreateFilledPile(layer_bounds, layer_bounds);
+ SetupPendingTree(pending_pile);
+ pending_layer_->SetBounds(layer_bounds);
+ ActivateTree();
+ active_layer_->set_fixed_tile_size(tile_size);
+
+ host_impl_.SetViewportSize(viewport_size);
+ host_impl_.active_tree()->UpdateDrawProperties();
+
+ std::vector<Tile*> tiles =
+ active_layer_->HighResTiling()->AllTilesForTesting();
+ host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
+
+ {
+ SCOPED_TRACE("No occlusion");
+ gfx::Rect occluded;
+ impl.AppendQuadsWithOcclusion(active_layer_, occluded);
+
+ LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
+ gfx::Rect(layer_bounds));
+ EXPECT_EQ(100u, impl.quad_list().size());
+ }
+
+ {
+ SCOPED_TRACE("Full occlusion");
+ gfx::Rect occluded(active_layer_->visible_content_rect());
+ impl.AppendQuadsWithOcclusion(active_layer_, occluded);
+
+ LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect());
+ EXPECT_EQ(impl.quad_list().size(), 0u);
+ }
+
+ {
+ SCOPED_TRACE("Partial occlusion");
+ gfx::Rect occluded(150, 0, 200, 1000);
+ impl.AppendQuadsWithOcclusion(active_layer_, occluded);
+
+ size_t partially_occluded_count = 0;
+ LayerTestCommon::VerifyQuadsCoverRectWithOcclusion(
+ impl.quad_list(),
+ gfx::Rect(layer_bounds),
+ occluded,
+ &partially_occluded_count);
+ // The layer outputs one quad, which is partially occluded.
+ EXPECT_EQ(100u - 10u, impl.quad_list().size());
+ EXPECT_EQ(10u + 10u, partially_occluded_count);
+ }
+}
+
} // namespace
} // namespace cc