Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/layer_tree_host.h" | 5 #include "cc/layer_tree_host.h" |
| 6 | 6 |
| 7 #include "cc/delegated_frame_data.h" | |
| 7 #include "cc/delegated_renderer_layer.h" | 8 #include "cc/delegated_renderer_layer.h" |
| 8 #include "cc/delegated_renderer_layer_impl.h" | 9 #include "cc/delegated_renderer_layer_impl.h" |
| 9 #include "cc/layer_tree_impl.h" | 10 #include "cc/layer_tree_impl.h" |
| 10 #include "cc/test/layer_tree_test_common.h" | 11 #include "cc/test/layer_tree_test_common.h" |
| 11 #include "gpu/GLES2/gl2extchromium.h" | 12 #include "gpu/GLES2/gl2extchromium.h" |
| 12 | 13 |
| 13 namespace cc { | 14 namespace cc { |
| 14 namespace { | 15 namespace { |
| 15 | 16 |
| 16 // These tests deal with delegated renderer layers. | 17 // These tests deal with delegated renderer layers. |
| 17 class LayerTreeHostDelegatedTest : public ThreadedTest {}; | 18 class LayerTreeHostDelegatedTest : public ThreadedTest { |
| 19 protected: | |
| 20 class TestDelegatedRendererLayer : public DelegatedRendererLayer { | |
| 21 public: | |
| 22 static scoped_refptr<DelegatedRendererLayer> Create( | |
| 23 LayerTreeHostDelegatedTest* test) { | |
| 24 return new TestDelegatedRendererLayer(test); | |
| 25 } | |
| 18 | 26 |
| 19 class LayerTreeHostDelegatedTestCreateChildId | 27 virtual void update(ResourceUpdateQueue& queue, |
| 28 const OcclusionTracker* occlusion, | |
| 29 RenderingStats* stats) OVERRIDE { | |
| 30 DelegatedRendererLayer::update(queue, occlusion, stats); | |
| 31 test_->UpdateDelegatedLayer(this); | |
| 32 | |
| 33 } | |
| 34 protected: | |
| 35 TestDelegatedRendererLayer(LayerTreeHostDelegatedTest* test) | |
|
piman
2013/02/27 02:27:43
nit: explicit
danakj
2013/02/27 20:05:02
Done.
| |
| 36 : DelegatedRendererLayer(), | |
| 37 test_(test) {} | |
| 38 virtual ~TestDelegatedRendererLayer() {} | |
| 39 LayerTreeHostDelegatedTest* test_; | |
| 40 }; | |
| 41 | |
| 42 // Called by each delegated renderer layer when update is called on it. | |
| 43 virtual void UpdateDelegatedLayer(TestDelegatedRendererLayer* layer) {} | |
| 44 | |
| 45 scoped_ptr<DelegatedFrameData> CreateFrameData(gfx::Rect root_output_rect, | |
| 46 gfx::Rect root_damage_rect) { | |
| 47 scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData); | |
| 48 | |
| 49 scoped_ptr<RenderPass> root_pass(RenderPass::Create()); | |
| 50 root_pass->SetNew(RenderPass::Id(1, 1), | |
| 51 root_output_rect, | |
| 52 root_damage_rect, | |
| 53 gfx::Transform()); | |
| 54 frame->render_pass_list.push_back(root_pass.Pass()); | |
| 55 return frame.Pass(); | |
| 56 } | |
| 57 | |
| 58 scoped_ptr<DelegatedFrameData> CreateEmptyFrameData() { | |
| 59 scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData); | |
| 60 return frame.Pass(); | |
| 61 } | |
| 62 }; | |
| 63 | |
| 64 class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer | |
| 20 : public LayerTreeHostDelegatedTest { | 65 : public LayerTreeHostDelegatedTest { |
| 21 public: | 66 public: |
| 22 virtual void setupTree() OVERRIDE { | 67 virtual void setupTree() OVERRIDE { |
| 23 root_ = Layer::create(); | 68 root_ = Layer::create(); |
| 69 root_->setAnchorPoint(gfx::PointF()); | |
| 24 root_->setBounds(gfx::Size(10, 10)); | 70 root_->setBounds(gfx::Size(10, 10)); |
| 25 | 71 |
| 26 delegated_ = DelegatedRendererLayer::Create(); | 72 delegated_ = TestDelegatedRendererLayer::Create(this); |
| 73 delegated_->setAnchorPoint(gfx::PointF()); | |
| 27 delegated_->setBounds(gfx::Size(10, 10)); | 74 delegated_->setBounds(gfx::Size(10, 10)); |
| 28 delegated_->setIsDrawable(true); | 75 delegated_->setIsDrawable(true); |
| 29 | 76 |
| 30 root_->addChild(delegated_); | 77 root_->addChild(delegated_); |
| 31 m_layerTreeHost->setRootLayer(root_); | 78 m_layerTreeHost->setRootLayer(root_); |
| 32 LayerTreeHostDelegatedTest::setupTree(); | 79 LayerTreeHostDelegatedTest::setupTree(); |
| 33 } | 80 } |
| 34 | 81 |
| 35 virtual void beginTest() OVERRIDE { | 82 virtual void beginTest() OVERRIDE { |
| 36 num_activates_ = 0; | |
| 37 did_reset_child_id_ = false; | |
| 38 postSetNeedsCommitToMainThread(); | 83 postSetNeedsCommitToMainThread(); |
| 39 } | 84 } |
| 40 | 85 |
| 86 virtual void afterTest() OVERRIDE {} | |
| 87 | |
| 88 protected: | |
| 89 scoped_refptr<Layer> root_; | |
| 90 scoped_refptr<DelegatedRendererLayer> delegated_; | |
| 91 }; | |
| 92 | |
| 93 class LayerTreeHostDelegatedTestCreateChildId | |
| 94 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { | |
| 95 public: | |
| 96 LayerTreeHostDelegatedTestCreateChildId() | |
| 97 : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), | |
| 98 num_activates_(0), | |
| 99 did_reset_child_id_(false) {} | |
| 100 | |
| 101 virtual void UpdateDelegatedLayer(TestDelegatedRendererLayer* layer) | |
| 102 OVERRIDE { | |
| 103 if (testEnded()) | |
| 104 return; | |
| 105 layer->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), | |
| 106 gfx::Rect(0, 0, 1, 1))); | |
| 107 } | |
| 108 | |
| 41 virtual void treeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { | 109 virtual void treeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
| 42 LayerImpl* root_impl = host_impl->activeTree()->RootLayer(); | 110 LayerImpl* root_impl = host_impl->activeTree()->RootLayer(); |
| 43 DelegatedRendererLayerImpl* delegated_impl = | 111 DelegatedRendererLayerImpl* delegated_impl = |
| 44 static_cast<DelegatedRendererLayerImpl*>(root_impl->children()[0]); | 112 static_cast<DelegatedRendererLayerImpl*>(root_impl->children()[0]); |
| 45 | 113 |
| 46 ++num_activates_; | 114 ++num_activates_; |
| 47 switch(num_activates_) { | 115 switch(num_activates_) { |
| 48 case 1: | 116 case 1: |
| 49 EXPECT_TRUE(delegated_impl->child_id()); | 117 EXPECT_TRUE(delegated_impl->child_id()); |
| 50 EXPECT_FALSE(did_reset_child_id_); | 118 EXPECT_FALSE(did_reset_child_id_); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 74 EXPECT_EQ(1, num_activates_); | 142 EXPECT_EQ(1, num_activates_); |
| 75 EXPECT_FALSE(delegated_impl->child_id()); | 143 EXPECT_FALSE(delegated_impl->child_id()); |
| 76 did_reset_child_id_ = true; | 144 did_reset_child_id_ = true; |
| 77 } | 145 } |
| 78 | 146 |
| 79 virtual void afterTest() OVERRIDE {} | 147 virtual void afterTest() OVERRIDE {} |
| 80 | 148 |
| 81 protected: | 149 protected: |
| 82 int num_activates_; | 150 int num_activates_; |
| 83 bool did_reset_child_id_; | 151 bool did_reset_child_id_; |
| 84 scoped_refptr<Layer> root_; | |
| 85 scoped_refptr<DelegatedRendererLayer> delegated_; | |
| 86 }; | 152 }; |
| 87 | 153 |
| 88 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId) | 154 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId) |
| 89 | 155 |
| 156 class LayerTreeHostDelegatedTestLayerUsesFrameDamage | |
| 157 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { | |
| 158 public: | |
| 159 LayerTreeHostDelegatedTestLayerUsesFrameDamage() | |
| 160 : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), | |
| 161 first_draw_for_source_frame_(true) {} | |
| 162 | |
| 163 virtual void didCommit() OVERRIDE { | |
| 164 int next_source_frame_number = m_layerTreeHost->commitNumber(); | |
| 165 switch (next_source_frame_number) { | |
| 166 case 1: | |
| 167 // Should create a total amount of gfx::Rect(2, 2, 10, 6) damage. | |
| 168 // The frame size is 20x20 while the layer is 10x10, so this should | |
| 169 // produce a gfx::Rect(1, 1, 5, 3) damage rect. | |
| 170 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20), | |
| 171 gfx::Rect(2, 2, 5, 5))); | |
| 172 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20), | |
| 173 gfx::Rect(7, 2, 5, 6))); | |
| 174 break; | |
| 175 case 2: | |
| 176 // Should create zero damage. | |
| 177 m_layerTreeHost->setNeedsCommit(); | |
| 178 break; | |
| 179 case 3: | |
| 180 // Should damage the full viewport. | |
| 181 delegated_->setBounds(gfx::Size(2, 2)); | |
| 182 break; | |
| 183 case 4: | |
| 184 // Should create zero damage. | |
| 185 m_layerTreeHost->setNeedsCommit(); | |
| 186 break; | |
| 187 case 5: | |
| 188 // Should damage the full layer. | |
| 189 delegated_->setBounds(gfx::Size(6, 6)); | |
| 190 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5), | |
| 191 gfx::Rect(1, 1, 2, 2))); | |
| 192 break; | |
| 193 case 6: | |
| 194 // Should create zero damage. | |
| 195 m_layerTreeHost->setNeedsCommit(); | |
| 196 break; | |
| 197 case 7: | |
| 198 // Should damage the full layer. | |
| 199 delegated_->SetDisplaySize(gfx::Size(10, 10)); | |
| 200 break; | |
| 201 case 8: | |
| 202 // Should create zero damage. | |
| 203 m_layerTreeHost->setNeedsCommit(); | |
| 204 break; | |
| 205 case 9: | |
| 206 // Setting an empty frame should damage the whole layer the | |
| 207 // first time. | |
| 208 delegated_->SetFrameData(CreateEmptyFrameData()); | |
| 209 break; | |
| 210 case 10: | |
| 211 // Setting an empty frame shouldn't damage anything after the | |
| 212 // first time. | |
| 213 delegated_->SetFrameData(CreateEmptyFrameData()); | |
| 214 break; | |
| 215 case 11: | |
| 216 // Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is | |
| 217 // 5x5 and the display size is now set to 10x10, so this should result | |
| 218 // in a gfx::Rect(2, 2, 4, 4) damage rect. | |
| 219 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5), | |
| 220 gfx::Rect(1, 1, 2, 2))); | |
| 221 break; | |
| 222 case 12: | |
| 223 // Should create zero damage. | |
| 224 m_layerTreeHost->setNeedsCommit(); | |
| 225 break; | |
| 226 } | |
| 227 first_draw_for_source_frame_ = true; | |
| 228 } | |
| 229 | |
| 230 virtual bool prepareToDrawOnThread(LayerTreeHostImpl* host_impl, | |
| 231 LayerTreeHostImpl::FrameData& frame, | |
| 232 bool result) { | |
| 233 EXPECT_TRUE(result); | |
| 234 | |
| 235 if (!first_draw_for_source_frame_) | |
| 236 return result; | |
| 237 | |
| 238 gfx::RectF damage_rect = frame.renderPasses.back()->damage_rect; | |
| 239 | |
| 240 switch (host_impl->activeTree()->source_frame_number()) { | |
| 241 case 0: | |
| 242 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(), | |
| 243 damage_rect.ToString()); | |
| 244 break; | |
| 245 case 1: | |
| 246 EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(), | |
| 247 damage_rect.ToString()); | |
| 248 break; | |
| 249 case 2: | |
| 250 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), | |
| 251 damage_rect.ToString()); | |
| 252 break; | |
| 253 case 3: | |
| 254 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(), | |
| 255 damage_rect.ToString()); | |
| 256 break; | |
| 257 case 4: | |
| 258 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), | |
| 259 damage_rect.ToString()); | |
| 260 break; | |
| 261 case 5: | |
| 262 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), | |
| 263 damage_rect.ToString()); | |
| 264 break; | |
| 265 case 6: | |
| 266 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), | |
| 267 damage_rect.ToString()); | |
| 268 break; | |
| 269 case 7: | |
| 270 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), | |
| 271 damage_rect.ToString()); | |
| 272 break; | |
| 273 case 8: | |
| 274 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), | |
| 275 damage_rect.ToString()); | |
| 276 break; | |
| 277 case 9: | |
| 278 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), | |
| 279 damage_rect.ToString()); | |
| 280 break; | |
| 281 case 10: | |
| 282 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), | |
| 283 damage_rect.ToString()); | |
| 284 break; | |
| 285 case 11: | |
| 286 EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(), | |
| 287 damage_rect.ToString()); | |
| 288 break; | |
| 289 case 12: | |
| 290 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), | |
| 291 damage_rect.ToString()); | |
| 292 endTest(); | |
| 293 break; | |
| 294 } | |
| 295 | |
| 296 return result; | |
| 297 } | |
| 298 | |
| 299 protected: | |
| 300 bool first_draw_for_source_frame_; | |
| 301 }; | |
| 302 | |
| 303 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage) | |
| 304 | |
| 90 } // namespace | 305 } // namespace |
| 91 } // namespace cc | 306 } // namespace cc |
| OLD | NEW |