From f31cf7bf95f70d41e183fca70cb9a1cfe86e2850 Mon Sep 17 00:00:00 2001 From: "danakj@chromium.org" Date: Mon, 17 Mar 2014 23:11:38 +0000 Subject: cc: Apply occlusion before creating quads in IOSurfaceLayerImpl. 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 BUG=344962 Review URL: https://codereview.chromium.org/200423005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257520 0039d316-1c4b-4281-b951-d872f2087c98 --- cc/layers/io_surface_layer_impl_unittest.cc | 78 +++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 cc/layers/io_surface_layer_impl_unittest.cc (limited to 'cc/layers/io_surface_layer_impl_unittest.cc') diff --git a/cc/layers/io_surface_layer_impl_unittest.cc b/cc/layers/io_surface_layer_impl_unittest.cc new file mode 100644 index 0000000..30c84ba --- /dev/null +++ b/cc/layers/io_surface_layer_impl_unittest.cc @@ -0,0 +1,78 @@ +// 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/io_surface_layer_impl.h" + +#include "cc/layers/append_quads_data.h" +#include "cc/test/fake_layer_tree_host.h" +#include "cc/test/layer_test_common.h" +#include "cc/test/mock_quad_culler.h" +#include "cc/trees/layer_tree_host_common.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace cc { +namespace { + +TEST(IOSurfaceLayerImplTest, Occlusion) { + gfx::Size layer_size(1000, 1000); + gfx::Size viewport_size(1000, 1000); + + LayerTestCommon::LayerImplTest impl; + MockQuadCuller quad_culler; + AppendQuadsData data; + + IOSurfaceLayerImpl* io_surface_layer_impl = + impl.AddChildToRoot(); + io_surface_layer_impl->SetAnchorPoint(gfx::PointF()); + io_surface_layer_impl->SetBounds(layer_size); + io_surface_layer_impl->SetContentBounds(layer_size); + io_surface_layer_impl->SetDrawsContent(true); + + impl.CalcDrawProps(viewport_size); + + // No occlusion. + { + gfx::Rect occluded; + quad_culler.clear_lists(); + quad_culler.set_occluded_content_rect(occluded); + io_surface_layer_impl->AppendQuads(&quad_culler, &data); + + LayerTestCommon::VerifyQuadsExactlyCoverRect(quad_culler.quad_list(), + gfx::Rect(viewport_size)); + EXPECT_EQ(1u, quad_culler.quad_list().size()); + } + + // Full occlusion. + { + gfx::Rect occluded = io_surface_layer_impl->visible_content_rect(); + quad_culler.clear_lists(); + quad_culler.set_occluded_content_rect(occluded); + io_surface_layer_impl->AppendQuads(&quad_culler, &data); + + LayerTestCommon::VerifyQuadsExactlyCoverRect(quad_culler.quad_list(), + gfx::Rect()); + EXPECT_EQ(quad_culler.quad_list().size(), 0u); + } + + // Partial occlusion. + { + gfx::Rect occluded(200, 0, 800, 1000); + quad_culler.clear_lists(); + quad_culler.set_occluded_content_rect(occluded); + io_surface_layer_impl->AppendQuads(&quad_culler, &data); + + size_t partially_occluded_count = 0; + LayerTestCommon::VerifyQuadsCoverRectWithOcclusion( + quad_culler.quad_list(), + gfx::Rect(viewport_size), + occluded, + &partially_occluded_count); + // The layer outputs one quad, which is partially occluded. + EXPECT_EQ(1u, quad_culler.quad_list().size()); + EXPECT_EQ(1u, partially_occluded_count); + } +} + +} // namespace +} // namespace cc -- cgit v1.1