Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(357)

Side by Side Diff: cc/layer_tree_host_unittest_delegated.cc

Issue 12340095: cc: Make damage on delegated frame damage the host layer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698