#include <vector>
#include "cc/base/math_util.h"
-#include "cc/debug/overdraw_metrics.h"
#include "cc/layers/append_quads_data.h"
#include "cc/layers/render_surface_impl.h"
#include "cc/layers/tiled_layer_impl.h"
#include "cc/resources/layer_tiling_data.h"
#include "cc/test/fake_impl_proxy.h"
#include "cc/test/fake_layer_tree_host_impl.h"
-#include "cc/test/occlusion_tracker_test_common.h"
+#include "cc/test/test_occlusion_tracker.h"
+#include "cc/test/test_shared_bitmap_manager.h"
#include "cc/trees/occlusion_tracker.h"
#include "cc/trees/single_thread_proxy.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace cc {
namespace {
-class TestOcclusionTrackerImpl
- : public TestOcclusionTrackerBase<LayerImpl, RenderSurfaceImpl> {
- public:
- TestOcclusionTrackerImpl(gfx::Rect scissor_rect_in_screen,
- bool record_metrics_for_frame = true)
- : TestOcclusionTrackerBase(scissor_rect_in_screen,
- record_metrics_for_frame) {}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(TestOcclusionTrackerImpl);
-};
-
-typedef LayerIterator<LayerImpl,
- LayerImplList,
- RenderSurfaceImpl,
- LayerIteratorActions::FrontToBack> LayerIteratorType;
+typedef LayerIterator<LayerImpl> LayerIteratorType;
class QuadCullerTest : public testing::Test {
public:
QuadCullerTest()
- : host_impl_(&proxy_),
- layer_id_(1) {}
+ : host_impl_(&proxy_, &shared_bitmap_manager_), layer_id_(1) {}
scoped_ptr<TiledLayerImpl> MakeLayer(TiledLayerImpl* parent,
const gfx::Transform& draw_transform,
- gfx::Rect layer_rect,
+ const gfx::Rect& layer_rect,
float opacity,
bool opaque,
- gfx::Rect layer_opaque_rect,
+ const gfx::Rect& layer_opaque_rect,
LayerImplList& surface_layer_list) {
scoped_ptr<TiledLayerImpl> layer =
TiledLayerImpl::Create(host_impl_.active_tree(), layer_id_++);
}
}
- gfx::Rect rect_in_target = MathUtil::MapClippedRect(
+ gfx::Rect rect_in_target = MathUtil::MapEnclosingClippedRect(
layer->draw_transform(), layer->visible_content_rect());
if (!parent) {
layer->CreateRenderSurface();
} else {
layer->draw_properties().render_target = parent->render_target();
parent->render_surface()->layer_list().push_back(layer.get());
- rect_in_target.Union(MathUtil::MapClippedRect(
+ rect_in_target.Union(MathUtil::MapEnclosingClippedRect(
parent->draw_transform(), parent->visible_content_rect()));
parent->render_surface()->SetContentRect(rect_in_target);
}
SharedQuadStateList* shared_state_list,
TiledLayerImpl* layer,
LayerIteratorType* it,
- OcclusionTrackerImpl* occlusion_tracker) {
- occlusion_tracker->EnterLayer(*it, false);
+ OcclusionTracker<LayerImpl>* occlusion_tracker) {
+ occlusion_tracker->EnterLayer(*it);
QuadCuller quad_culler(
- quad_list, shared_state_list, layer, *occlusion_tracker, false, false);
+ quad_list, shared_state_list, layer, *occlusion_tracker, false);
AppendQuadsData data;
layer->AppendQuads(&quad_culler, &data);
occlusion_tracker->LeaveLayer(*it);
protected:
FakeImplProxy proxy_;
+ TestSharedBitmapManager shared_bitmap_manager_;
FakeLayerTreeHostImpl host_impl_;
int layer_id_;
false,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(13u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(),
- 40000,
- 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
}
TEST_F(QuadCullerTest, CullChildLinesUpTopLeft) {
true,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(9u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(),
- 40000,
- 1);
}
TEST_F(QuadCullerTest, CullWhenChildOpacityNotOne) {
true,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(13u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(),
- 40000,
- 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
}
TEST_F(QuadCullerTest, CullWhenChildOpaqueFlagFalse) {
false,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(13u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(),
- 40000,
- 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
}
TEST_F(QuadCullerTest, CullCenterTileOnly) {
true,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
gfx::Rect quad_visible_rect6 = quad_list[10]->visible_rect;
EXPECT_EQ(50, quad_visible_rect6.height());
EXPECT_EQ(250, quad_visible_rect6.y());
-
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 100000, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(),
- 30000,
- 1);
}
TEST_F(QuadCullerTest, CullCenterTileNonIntegralSize1) {
true,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(2u, quad_list.size());
-
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 20363, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
}
TEST_F(QuadCullerTest, CullCenterTileNonIntegralSize2) {
true,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(2u, quad_list.size());
-
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 19643, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
}
TEST_F(QuadCullerTest, CullChildLinesUpBottomRight) {
true,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(9u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(),
- 40000,
- 1);
}
TEST_F(QuadCullerTest, CullSubRegion) {
false,
child_opaque_rect,
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(12u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(),
- 30000,
- 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(),
- 10000,
- 1);
}
TEST_F(QuadCullerTest, CullSubRegion2) {
false,
child_opaque_rect,
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(12u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(),
- 25000,
- 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(),
- 15000,
- 1);
}
TEST_F(QuadCullerTest, CullSubRegionCheckOvercull) {
false,
child_opaque_rect,
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(13u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 90000, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(),
- 30000,
- 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(),
- 10000,
- 1);
}
TEST_F(QuadCullerTest, NonAxisAlignedQuadsDontOcclude) {
true,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(13u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 130000, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(), 0, 1);
}
// This test requires some explanation: here we are rotating the quads to be
true,
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(
+ gfx::Rect(-100, -100, 1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
AppendQuads(&quad_list,
&it,
&occlusion_tracker);
EXPECT_EQ(12u, quad_list.size());
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque(), 100600, 1);
- EXPECT_NEAR(
- occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent(), 0, 1);
- EXPECT_NEAR(occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing(),
- 29400,
- 1);
-}
-
-TEST_F(QuadCullerTest, WithoutMetrics) {
- DECLARE_AND_INITIALIZE_TEST_QUADS();
- scoped_ptr<TiledLayerImpl> root_layer = MakeLayer(NULL,
- gfx::Transform(),
- root_rect,
- 1.f,
- true,
- gfx::Rect(),
- render_surface_layer_list);
- scoped_ptr<TiledLayerImpl> child_layer = MakeLayer(root_layer.get(),
- gfx::Transform(),
- child_rect,
- 1.f,
- true,
- gfx::Rect(),
- render_surface_layer_list);
- bool record_metrics = false;
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(-100, -100, 1000, 1000),
- record_metrics);
- LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
-
- AppendQuads(&quad_list,
- &shared_state_list,
- child_layer.get(),
- &it,
- &occlusion_tracker);
- AppendQuads(&quad_list,
- &shared_state_list,
- root_layer.get(),
- &it,
- &occlusion_tracker);
- EXPECT_EQ(9u, quad_list.size());
- EXPECT_EQ(0.f,
- occlusion_tracker.overdraw_metrics()->pixels_drawn_opaque());
- EXPECT_EQ(0.f,
- occlusion_tracker.overdraw_metrics()->pixels_drawn_translucent());
- EXPECT_EQ(0.f,
- occlusion_tracker.overdraw_metrics()->pixels_culled_for_drawing());
}
TEST_F(QuadCullerTest, PartialCullingNotDestroyed) {
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(gfx::Rect(1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
QuadCuller culler(&quad_list,
&shared_state_list,
dummy_layer.get(),
occlusion_tracker,
- false,
false);
SharedQuadState* sqs = culler.UseSharedQuadState(SharedQuadState::Create());
scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
- color_quad->SetNew(sqs, gfx::Rect(100, 100), SK_ColorRED, false);
+ color_quad->SetNew(
+ sqs, gfx::Rect(100, 100), gfx::Rect(100, 100), SK_ColorRED, false);
scoped_ptr<RenderPassDrawQuad> pass_quad = RenderPassDrawQuad::Create();
pass_quad->SetNew(sqs,
gfx::Rect(100, 100),
+ gfx::Rect(100, 100),
RenderPass::Id(10, 10),
false,
0,
scoped_ptr<RenderPassDrawQuad> replica_quad = RenderPassDrawQuad::Create();
replica_quad->SetNew(sqs,
gfx::Rect(100, 100),
+ gfx::Rect(100, 100),
RenderPass::Id(10, 10),
true,
0,
replica_quad->visible_rect = gfx::Rect(30, 40, 15, 16);
// Nothing is occluding.
- occlusion_tracker.EnterLayer(it, false);
+ occlusion_tracker.EnterLayer(it);
EXPECT_EQ(0u, quad_list.size());
- AppendQuadsData data;
- culler.Append(color_quad.PassAs<DrawQuad>(), &data);
- culler.Append(pass_quad.PassAs<DrawQuad>(), &data);
- culler.Append(replica_quad.PassAs<DrawQuad>(), &data);
+ culler.MaybeAppend(color_quad.PassAs<DrawQuad>());
+ culler.MaybeAppend(pass_quad.PassAs<DrawQuad>());
+ culler.MaybeAppend(replica_quad.PassAs<DrawQuad>());
ASSERT_EQ(3u, quad_list.size());
gfx::Rect(),
render_surface_layer_list);
- TestOcclusionTrackerImpl occlusion_tracker(gfx::Rect(1000, 1000));
+ TestOcclusionTracker<LayerImpl> occlusion_tracker(gfx::Rect(1000, 1000));
LayerIteratorType it = LayerIteratorType::Begin(&render_surface_layer_list);
QuadCuller culler(&quad_list,
&shared_state_list,
dummy_layer.get(),
occlusion_tracker,
- false,
false);
SharedQuadState* sqs = culler.UseSharedQuadState(SharedQuadState::Create());
scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
- color_quad->SetNew(sqs, gfx::Rect(100, 100), SK_ColorRED, false);
+ color_quad->SetNew(
+ sqs, gfx::Rect(100, 100), gfx::Rect(100, 100), SK_ColorRED, false);
scoped_ptr<RenderPassDrawQuad> pass_quad = RenderPassDrawQuad::Create();
pass_quad->SetNew(sqs,
gfx::Rect(100, 100),
+ gfx::Rect(100, 100),
RenderPass::Id(10, 10),
false,
0,
scoped_ptr<RenderPassDrawQuad> replica_quad = RenderPassDrawQuad::Create();
replica_quad->SetNew(sqs,
gfx::Rect(100, 100),
+ gfx::Rect(100, 100),
RenderPass::Id(10, 10),
true,
0,
replica_quad->visible_rect = gfx::Rect(10, 30, 15, 16);
// Occlude the left part of the visible rects.
- occlusion_tracker.EnterLayer(it, false);
+ occlusion_tracker.EnterLayer(it);
occlusion_tracker.set_occlusion_from_outside_target(gfx::Rect(0, 0, 15, 100));
EXPECT_EQ(0u, quad_list.size());
- AppendQuadsData data;
- culler.Append(color_quad.PassAs<DrawQuad>(), &data);
- culler.Append(pass_quad.PassAs<DrawQuad>(), &data);
- culler.Append(replica_quad.PassAs<DrawQuad>(), &data);
+ culler.MaybeAppend(color_quad.PassAs<DrawQuad>());
+ culler.MaybeAppend(pass_quad.PassAs<DrawQuad>());
+ culler.MaybeAppend(replica_quad.PassAs<DrawQuad>());
ASSERT_EQ(3u, quad_list.size());