| Index: cc/layer_tree_host_unittest_delegated.cc
|
| diff --git a/cc/layer_tree_host_unittest_delegated.cc b/cc/layer_tree_host_unittest_delegated.cc
|
| index e3bedfcbc3c107e43eda965def3e21ae290696fd..6fe3f8fa7c1aa93ad7dd2131cf0cd06e6c48ac7a 100644
|
| --- a/cc/layer_tree_host_unittest_delegated.cc
|
| +++ b/cc/layer_tree_host_unittest_delegated.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "cc/layer_tree_host.h"
|
|
|
| +#include "cc/delegated_frame_data.h"
|
| #include "cc/delegated_renderer_layer.h"
|
| #include "cc/delegated_renderer_layer_impl.h"
|
| #include "cc/layer_tree_impl.h"
|
| @@ -14,16 +15,62 @@ namespace cc {
|
| namespace {
|
|
|
| // These tests deal with delegated renderer layers.
|
| -class LayerTreeHostDelegatedTest : public ThreadedTest {};
|
| +class LayerTreeHostDelegatedTest : public ThreadedTest {
|
| + protected:
|
| + class TestDelegatedRendererLayer : public DelegatedRendererLayer {
|
| + public:
|
| + static scoped_refptr<DelegatedRendererLayer> Create(
|
| + LayerTreeHostDelegatedTest* test) {
|
| + return new TestDelegatedRendererLayer(test);
|
| + }
|
|
|
| -class LayerTreeHostDelegatedTestCreateChildId
|
| + virtual void update(ResourceUpdateQueue& queue,
|
| + const OcclusionTracker* occlusion,
|
| + RenderingStats* stats) OVERRIDE {
|
| + DelegatedRendererLayer::update(queue, occlusion, stats);
|
| + test_->UpdateDelegatedLayer(this);
|
| +
|
| + }
|
| + protected:
|
| + explicit TestDelegatedRendererLayer(LayerTreeHostDelegatedTest* test)
|
| + : DelegatedRendererLayer(),
|
| + test_(test) {}
|
| + virtual ~TestDelegatedRendererLayer() {}
|
| + LayerTreeHostDelegatedTest* test_;
|
| + };
|
| +
|
| + // Called by each delegated renderer layer when update is called on it.
|
| + virtual void UpdateDelegatedLayer(TestDelegatedRendererLayer* layer) {}
|
| +
|
| + scoped_ptr<DelegatedFrameData> CreateFrameData(gfx::Rect root_output_rect,
|
| + gfx::Rect root_damage_rect) {
|
| + scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
|
| +
|
| + scoped_ptr<RenderPass> root_pass(RenderPass::Create());
|
| + root_pass->SetNew(RenderPass::Id(1, 1),
|
| + root_output_rect,
|
| + root_damage_rect,
|
| + gfx::Transform());
|
| + frame->render_pass_list.push_back(root_pass.Pass());
|
| + return frame.Pass();
|
| + }
|
| +
|
| + scoped_ptr<DelegatedFrameData> CreateEmptyFrameData() {
|
| + scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
|
| + return frame.Pass();
|
| + }
|
| +};
|
| +
|
| +class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
|
| : public LayerTreeHostDelegatedTest {
|
| public:
|
| virtual void setupTree() OVERRIDE {
|
| root_ = Layer::create();
|
| + root_->setAnchorPoint(gfx::PointF());
|
| root_->setBounds(gfx::Size(10, 10));
|
|
|
| - delegated_ = DelegatedRendererLayer::Create();
|
| + delegated_ = TestDelegatedRendererLayer::Create(this);
|
| + delegated_->setAnchorPoint(gfx::PointF());
|
| delegated_->setBounds(gfx::Size(10, 10));
|
| delegated_->setIsDrawable(true);
|
|
|
| @@ -33,11 +80,32 @@ class LayerTreeHostDelegatedTestCreateChildId
|
| }
|
|
|
| virtual void beginTest() OVERRIDE {
|
| - num_activates_ = 0;
|
| - did_reset_child_id_ = false;
|
| postSetNeedsCommitToMainThread();
|
| }
|
|
|
| + virtual void afterTest() OVERRIDE {}
|
| +
|
| + protected:
|
| + scoped_refptr<Layer> root_;
|
| + scoped_refptr<DelegatedRendererLayer> delegated_;
|
| +};
|
| +
|
| +class LayerTreeHostDelegatedTestCreateChildId
|
| + : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| + public:
|
| + LayerTreeHostDelegatedTestCreateChildId()
|
| + : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
|
| + num_activates_(0),
|
| + did_reset_child_id_(false) {}
|
| +
|
| + virtual void UpdateDelegatedLayer(TestDelegatedRendererLayer* layer)
|
| + OVERRIDE {
|
| + if (testEnded())
|
| + return;
|
| + layer->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1),
|
| + gfx::Rect(0, 0, 1, 1)));
|
| + }
|
| +
|
| virtual void treeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
|
| LayerImpl* root_impl = host_impl->activeTree()->RootLayer();
|
| DelegatedRendererLayerImpl* delegated_impl =
|
| @@ -81,11 +149,158 @@ class LayerTreeHostDelegatedTestCreateChildId
|
| protected:
|
| int num_activates_;
|
| bool did_reset_child_id_;
|
| - scoped_refptr<Layer> root_;
|
| - scoped_refptr<DelegatedRendererLayer> delegated_;
|
| };
|
|
|
| SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId)
|
|
|
| +class LayerTreeHostDelegatedTestLayerUsesFrameDamage
|
| + : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| + public:
|
| + LayerTreeHostDelegatedTestLayerUsesFrameDamage()
|
| + : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
|
| + first_draw_for_source_frame_(true) {}
|
| +
|
| + virtual void didCommit() OVERRIDE {
|
| + int next_source_frame_number = m_layerTreeHost->commitNumber();
|
| + switch (next_source_frame_number) {
|
| + case 1:
|
| + // Should create a total amount of gfx::Rect(2, 2, 10, 6) damage.
|
| + // The frame size is 20x20 while the layer is 10x10, so this should
|
| + // produce a gfx::Rect(1, 1, 5, 3) damage rect.
|
| + delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20),
|
| + gfx::Rect(2, 2, 5, 5)));
|
| + delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20),
|
| + gfx::Rect(7, 2, 5, 6)));
|
| + break;
|
| + case 2:
|
| + // Should create zero damage.
|
| + m_layerTreeHost->setNeedsCommit();
|
| + break;
|
| + case 3:
|
| + // Should damage the full viewport.
|
| + delegated_->setBounds(gfx::Size(2, 2));
|
| + break;
|
| + case 4:
|
| + // Should create zero damage.
|
| + m_layerTreeHost->setNeedsCommit();
|
| + break;
|
| + case 5:
|
| + // Should damage the full layer.
|
| + delegated_->setBounds(gfx::Size(6, 6));
|
| + delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5),
|
| + gfx::Rect(1, 1, 2, 2)));
|
| + break;
|
| + case 6:
|
| + // Should create zero damage.
|
| + m_layerTreeHost->setNeedsCommit();
|
| + break;
|
| + case 7:
|
| + // Should damage the full layer.
|
| + delegated_->SetDisplaySize(gfx::Size(10, 10));
|
| + break;
|
| + case 8:
|
| + // Should create zero damage.
|
| + m_layerTreeHost->setNeedsCommit();
|
| + break;
|
| + case 9:
|
| + // Setting an empty frame should damage the whole layer the
|
| + // first time.
|
| + delegated_->SetFrameData(CreateEmptyFrameData());
|
| + break;
|
| + case 10:
|
| + // Setting an empty frame shouldn't damage anything after the
|
| + // first time.
|
| + delegated_->SetFrameData(CreateEmptyFrameData());
|
| + break;
|
| + case 11:
|
| + // Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is
|
| + // 5x5 and the display size is now set to 10x10, so this should result
|
| + // in a gfx::Rect(2, 2, 4, 4) damage rect.
|
| + delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5),
|
| + gfx::Rect(1, 1, 2, 2)));
|
| + break;
|
| + case 12:
|
| + // Should create zero damage.
|
| + m_layerTreeHost->setNeedsCommit();
|
| + break;
|
| + }
|
| + first_draw_for_source_frame_ = true;
|
| + }
|
| +
|
| + virtual bool prepareToDrawOnThread(LayerTreeHostImpl* host_impl,
|
| + LayerTreeHostImpl::FrameData& frame,
|
| + bool result) {
|
| + EXPECT_TRUE(result);
|
| +
|
| + if (!first_draw_for_source_frame_)
|
| + return result;
|
| +
|
| + gfx::RectF damage_rect = frame.renderPasses.back()->damage_rect;
|
| +
|
| + switch (host_impl->activeTree()->source_frame_number()) {
|
| + case 0:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 1:
|
| + EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 2:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 3:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 4:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 5:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 6:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 7:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 8:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 9:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 10:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 11:
|
| + EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(),
|
| + damage_rect.ToString());
|
| + break;
|
| + case 12:
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
|
| + damage_rect.ToString());
|
| + endTest();
|
| + break;
|
| + }
|
| +
|
| + return result;
|
| + }
|
| +
|
| + protected:
|
| + bool first_draw_for_source_frame_;
|
| +};
|
| +
|
| +SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage)
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|