OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/layers/texture_layer.h" | 5 #include "cc/layers/texture_layer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 return mailbox; | 48 return mailbox; |
49 } | 49 } |
50 | 50 |
51 class MockLayerTreeHost : public LayerTreeHost { | 51 class MockLayerTreeHost : public LayerTreeHost { |
52 public: | 52 public: |
53 explicit MockLayerTreeHost(FakeLayerTreeHostClient* client) | 53 explicit MockLayerTreeHost(FakeLayerTreeHostClient* client) |
54 : LayerTreeHost(client, NULL, LayerTreeSettings()) { | 54 : LayerTreeHost(client, NULL, LayerTreeSettings()) { |
55 InitializeSingleThreaded(client); | 55 InitializeSingleThreaded(client); |
56 } | 56 } |
57 | 57 |
58 MOCK_METHOD0(AcquireLayerTextures, void()); | |
59 MOCK_METHOD0(SetNeedsCommit, void()); | 58 MOCK_METHOD0(SetNeedsCommit, void()); |
60 MOCK_METHOD0(SetNeedsUpdateLayers, void()); | 59 MOCK_METHOD0(SetNeedsUpdateLayers, void()); |
61 MOCK_METHOD0(StartRateLimiter, void()); | 60 MOCK_METHOD0(StartRateLimiter, void()); |
62 MOCK_METHOD0(StopRateLimiter, void()); | 61 MOCK_METHOD0(StopRateLimiter, void()); |
63 }; | 62 }; |
64 | 63 |
65 class FakeTextureLayerClient : public TextureLayerClient { | 64 class FakeTextureLayerClient : public TextureLayerClient { |
66 public: | 65 public: |
67 FakeTextureLayerClient() : texture_(0), mailbox_changed_(true) {} | 66 FakeTextureLayerClient() : mailbox_changed_(true) {} |
68 | |
69 virtual unsigned PrepareTexture() OVERRIDE { return texture_; } | |
70 | 67 |
71 virtual bool PrepareTextureMailbox( | 68 virtual bool PrepareTextureMailbox( |
72 TextureMailbox* mailbox, | 69 TextureMailbox* mailbox, |
73 scoped_ptr<SingleReleaseCallback>* release_callback, | 70 scoped_ptr<SingleReleaseCallback>* release_callback, |
74 bool use_shared_memory) OVERRIDE { | 71 bool use_shared_memory) OVERRIDE { |
75 if (!mailbox_changed_) | 72 if (!mailbox_changed_) |
76 return false; | 73 return false; |
77 | 74 |
78 *mailbox = mailbox_; | 75 *mailbox = mailbox_; |
79 *release_callback = release_callback_.Pass(); | 76 *release_callback = release_callback_.Pass(); |
80 mailbox_changed_ = false; | 77 mailbox_changed_ = false; |
81 return true; | 78 return true; |
82 } | 79 } |
83 | 80 |
84 void set_texture(unsigned texture) { texture_ = texture; } | |
85 | |
86 void set_mailbox(const TextureMailbox& mailbox, | 81 void set_mailbox(const TextureMailbox& mailbox, |
87 scoped_ptr<SingleReleaseCallback> release_callback) { | 82 scoped_ptr<SingleReleaseCallback> release_callback) { |
88 mailbox_ = mailbox; | 83 mailbox_ = mailbox; |
89 release_callback_ = release_callback.Pass(); | 84 release_callback_ = release_callback.Pass(); |
90 mailbox_changed_ = true; | 85 mailbox_changed_ = true; |
91 } | 86 } |
92 | 87 |
93 private: | 88 private: |
94 unsigned texture_; | |
95 TextureMailbox mailbox_; | 89 TextureMailbox mailbox_; |
96 scoped_ptr<SingleReleaseCallback> release_callback_; | 90 scoped_ptr<SingleReleaseCallback> release_callback_; |
97 bool mailbox_changed_; | 91 bool mailbox_changed_; |
98 DISALLOW_COPY_AND_ASSIGN(FakeTextureLayerClient); | 92 DISALLOW_COPY_AND_ASSIGN(FakeTextureLayerClient); |
99 }; | 93 }; |
100 | 94 |
101 class MockMailboxCallback { | 95 class MockMailboxCallback { |
102 public: | 96 public: |
103 MOCK_METHOD3(Release, | 97 MOCK_METHOD3(Release, |
104 void(const gpu::Mailbox& mailbox, | 98 void(const gpu::Mailbox& mailbox, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 protected: | 153 protected: |
160 virtual void SetUp() { | 154 virtual void SetUp() { |
161 layer_tree_host_.reset(new MockLayerTreeHost(&fake_client_)); | 155 layer_tree_host_.reset(new MockLayerTreeHost(&fake_client_)); |
162 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); | 156 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); |
163 layer_tree_host_->SetViewportSize(gfx::Size(10, 10)); | 157 layer_tree_host_->SetViewportSize(gfx::Size(10, 10)); |
164 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 158 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
165 } | 159 } |
166 | 160 |
167 virtual void TearDown() { | 161 virtual void TearDown() { |
168 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 162 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
169 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AnyNumber()); | |
170 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); | 163 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); |
171 | 164 |
172 layer_tree_host_->SetRootLayer(NULL); | 165 layer_tree_host_->SetRootLayer(NULL); |
173 layer_tree_host_.reset(); | 166 layer_tree_host_.reset(); |
174 } | 167 } |
175 | 168 |
176 scoped_ptr<MockLayerTreeHost> layer_tree_host_; | 169 scoped_ptr<MockLayerTreeHost> layer_tree_host_; |
177 FakeImplProxy proxy_; | 170 FakeImplProxy proxy_; |
178 FakeLayerTreeHostClient fake_client_; | 171 FakeLayerTreeHostClient fake_client_; |
179 TestSharedBitmapManager shared_bitmap_manager_; | 172 TestSharedBitmapManager shared_bitmap_manager_; |
180 FakeLayerTreeHostImpl host_impl_; | 173 FakeLayerTreeHostImpl host_impl_; |
181 }; | 174 }; |
182 | 175 |
183 TEST_F(TextureLayerTest, SyncImplWhenClearingTexture) { | |
184 scoped_ptr<TestWebGraphicsContext3D> context( | |
185 TestWebGraphicsContext3D::Create()); | |
186 FakeTextureLayerClient client; | |
187 scoped_refptr<TextureLayer> test_layer = TextureLayer::Create(&client); | |
188 ASSERT_TRUE(test_layer.get()); | |
189 test_layer->SetIsDrawable(true); | |
190 test_layer->SetBounds(gfx::Size(10, 10)); | |
191 | |
192 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
193 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); | |
194 layer_tree_host_->SetRootLayer(test_layer); | |
195 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
196 EXPECT_EQ(test_layer->layer_tree_host(), layer_tree_host_.get()); | |
197 | |
198 // Clearing the texture before we gave one should not sync. | |
199 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
200 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0); | |
201 test_layer->ClearTexture(); | |
202 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
203 | |
204 // Give a texture to the layer through the client. | |
205 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
206 EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); | |
207 client.set_texture(context->createTexture()); | |
208 test_layer->SetNeedsDisplay(); | |
209 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
210 // Force a commit. | |
211 layer_tree_host_->Composite(base::TimeTicks()); | |
212 | |
213 // Clearing the texture should sync. | |
214 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AtLeast(1)); | |
215 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
216 test_layer->ClearTexture(); | |
217 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
218 | |
219 // But only once. | |
220 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
221 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0); | |
222 test_layer->ClearTexture(); | |
223 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
224 | |
225 // Force a commit to give another texture. | |
226 EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); | |
227 test_layer->SetNeedsDisplay(); | |
228 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
229 layer_tree_host_->Composite(base::TimeTicks()); | |
230 | |
231 // Make undrawable and commit. | |
232 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
233 test_layer->SetIsDrawable(false); | |
234 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
235 layer_tree_host_->Composite(base::TimeTicks()); | |
236 | |
237 // Clearing textures should not sync. | |
238 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
239 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
240 test_layer->ClearTexture(); | |
241 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
242 } | |
243 | |
244 TEST_F(TextureLayerTest, SyncImplWhenClearingMailbox) { | |
245 CommonMailboxObjects mailboxes; | |
246 FakeTextureLayerClient client; | |
247 scoped_refptr<TextureLayer> test_layer = | |
248 TextureLayer::CreateForMailbox(&client); | |
249 ASSERT_TRUE(test_layer.get()); | |
250 test_layer->SetIsDrawable(true); | |
251 test_layer->SetBounds(gfx::Size(10, 10)); | |
252 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
253 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); | |
254 layer_tree_host_->SetRootLayer(test_layer); | |
255 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
256 EXPECT_EQ(test_layer->layer_tree_host(), layer_tree_host_.get()); | |
257 | |
258 // Clearing the mailbox before we gave one should not sync. | |
259 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
260 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
261 test_layer->ClearTexture(); | |
262 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
263 | |
264 // Give a mailbox to the layer through the client. | |
265 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
266 client.set_mailbox( | |
267 mailboxes.mailbox1_, | |
268 SingleReleaseCallback::Create(mailboxes.release_mailbox1_)); | |
269 EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); | |
270 test_layer->SetNeedsDisplay(); | |
271 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
272 // Force a commit. | |
273 layer_tree_host_->Composite(base::TimeTicks()); | |
274 | |
275 // Clearing the mailbox should not sync. | |
276 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
277 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
278 test_layer->ClearTexture(); | |
279 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
280 | |
281 // Commit will return mailbox1. | |
282 EXPECT_CALL(mailboxes.mock_callback_, | |
283 Release(mailboxes.mailbox_name1_, _, false)); | |
284 layer_tree_host_->Composite(base::TimeTicks()); | |
285 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
286 | |
287 // Force a commit to give another mailbox. | |
288 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
289 client.set_mailbox( | |
290 mailboxes.mailbox2_, | |
291 SingleReleaseCallback::Create(mailboxes.release_mailbox2_)); | |
292 EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); | |
293 test_layer->SetNeedsDisplay(); | |
294 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
295 layer_tree_host_->Composite(base::TimeTicks()); | |
296 | |
297 // Make undrawable and commit. | |
298 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
299 test_layer->SetIsDrawable(false); | |
300 layer_tree_host_->Composite(base::TimeTicks()); | |
301 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
302 | |
303 // Clearing textures should not sync. | |
304 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
305 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
306 test_layer->ClearTexture(); | |
307 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
308 | |
309 // Commit will return the mailbox. | |
310 EXPECT_CALL(mailboxes.mock_callback_, | |
311 Release(mailboxes.mailbox_name2_, _, false)); | |
312 layer_tree_host_->Composite(base::TimeTicks()); | |
313 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
314 } | |
315 | |
316 TEST_F(TextureLayerTest, SyncImplWhenRemovingFromTree) { | |
317 scoped_ptr<TestWebGraphicsContext3D> context( | |
318 TestWebGraphicsContext3D::Create()); | |
319 scoped_refptr<Layer> root_layer = Layer::Create(); | |
320 ASSERT_TRUE(root_layer.get()); | |
321 scoped_refptr<Layer> child_layer = Layer::Create(); | |
322 ASSERT_TRUE(child_layer.get()); | |
323 root_layer->AddChild(child_layer); | |
324 FakeTextureLayerClient client; | |
325 scoped_refptr<TextureLayer> test_layer = TextureLayer::Create(&client); | |
326 test_layer->SetIsDrawable(true); | |
327 test_layer->SetBounds(gfx::Size(10, 10)); | |
328 ASSERT_TRUE(test_layer.get()); | |
329 child_layer->AddChild(test_layer); | |
330 | |
331 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
332 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); | |
333 layer_tree_host_->SetRootLayer(root_layer); | |
334 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
335 | |
336 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
337 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
338 test_layer->RemoveFromParent(); | |
339 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
340 | |
341 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
342 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
343 child_layer->AddChild(test_layer); | |
344 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
345 | |
346 // Give a texture to the layer through the client. | |
347 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
348 EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(AtLeast(1)); | |
349 client.set_texture(context->createTexture()); | |
350 test_layer->SetNeedsDisplay(); | |
351 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
352 // Force a commit. | |
353 layer_tree_host_->Composite(base::TimeTicks()); | |
354 | |
355 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(AtLeast(1)); | |
356 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | |
357 test_layer->RemoveFromParent(); | |
358 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | |
359 } | |
360 | |
361 TEST_F(TextureLayerTest, CheckPropertyChangeCausesCorrectBehavior) { | 176 TEST_F(TextureLayerTest, CheckPropertyChangeCausesCorrectBehavior) { |
362 scoped_refptr<TextureLayer> test_layer = TextureLayer::Create(NULL); | 177 scoped_refptr<TextureLayer> test_layer = TextureLayer::CreateForMailbox(NULL); |
363 EXPECT_SET_NEEDS_COMMIT(1, layer_tree_host_->SetRootLayer(test_layer)); | 178 EXPECT_SET_NEEDS_COMMIT(1, layer_tree_host_->SetRootLayer(test_layer)); |
364 | 179 |
365 // Test properties that should call SetNeedsCommit. All properties need to | 180 // Test properties that should call SetNeedsCommit. All properties need to |
366 // be set to new values in order for SetNeedsCommit to be called. | 181 // be set to new values in order for SetNeedsCommit to be called. |
367 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetFlipped(false)); | 182 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetFlipped(false)); |
368 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetUV( | 183 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetUV( |
369 gfx::PointF(0.25f, 0.25f), gfx::PointF(0.75f, 0.75f))); | 184 gfx::PointF(0.25f, 0.25f), gfx::PointF(0.75f, 0.75f))); |
370 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetVertexOpacity( | 185 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetVertexOpacity( |
371 0.5f, 0.5f, 0.5f, 0.5f)); | 186 0.5f, 0.5f, 0.5f, 0.5f)); |
372 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetPremultipliedAlpha(false)); | 187 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetPremultipliedAlpha(false)); |
373 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBlendBackgroundColor(true)); | 188 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBlendBackgroundColor(true)); |
374 } | 189 } |
375 | 190 |
376 TEST_F(TextureLayerTest, VisibleContentOpaqueRegion) { | 191 TEST_F(TextureLayerTest, VisibleContentOpaqueRegion) { |
377 const gfx::Size layer_bounds(100, 100); | 192 const gfx::Size layer_bounds(100, 100); |
378 const gfx::Rect layer_rect(layer_bounds); | 193 const gfx::Rect layer_rect(layer_bounds); |
379 const Region layer_region(layer_rect); | 194 const Region layer_region(layer_rect); |
380 | 195 |
381 scoped_refptr<TextureLayer> layer = TextureLayer::Create(NULL); | 196 scoped_refptr<TextureLayer> layer = TextureLayer::CreateForMailbox(NULL); |
382 layer->SetBounds(layer_bounds); | 197 layer->SetBounds(layer_bounds); |
383 layer->draw_properties().visible_content_rect = layer_rect; | 198 layer->draw_properties().visible_content_rect = layer_rect; |
384 layer->SetBlendBackgroundColor(true); | 199 layer->SetBlendBackgroundColor(true); |
385 | 200 |
386 // Verify initial conditions. | 201 // Verify initial conditions. |
387 EXPECT_FALSE(layer->contents_opaque()); | 202 EXPECT_FALSE(layer->contents_opaque()); |
388 EXPECT_EQ(0u, layer->background_color()); | 203 EXPECT_EQ(0u, layer->background_color()); |
389 EXPECT_EQ(Region().ToString(), | 204 EXPECT_EQ(Region().ToString(), |
390 layer->VisibleContentOpaqueRegion().ToString()); | 205 layer->VisibleContentOpaqueRegion().ToString()); |
391 | 206 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 TextureLayerTest::TearDown(); | 284 TextureLayerTest::TearDown(); |
470 } | 285 } |
471 | 286 |
472 CommonMailboxObjects test_data_; | 287 CommonMailboxObjects test_data_; |
473 }; | 288 }; |
474 | 289 |
475 TEST_F(TextureLayerWithMailboxTest, ReplaceMailboxOnMainThreadBeforeCommit) { | 290 TEST_F(TextureLayerWithMailboxTest, ReplaceMailboxOnMainThreadBeforeCommit) { |
476 scoped_refptr<TextureLayer> test_layer = TextureLayer::CreateForMailbox(NULL); | 291 scoped_refptr<TextureLayer> test_layer = TextureLayer::CreateForMailbox(NULL); |
477 ASSERT_TRUE(test_layer.get()); | 292 ASSERT_TRUE(test_layer.get()); |
478 | 293 |
479 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
480 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); | 294 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); |
481 layer_tree_host_->SetRootLayer(test_layer); | 295 layer_tree_host_->SetRootLayer(test_layer); |
482 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 296 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
483 | 297 |
484 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
485 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 298 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
486 test_layer->SetTextureMailbox( | 299 test_layer->SetTextureMailbox( |
487 test_data_.mailbox1_, | 300 test_data_.mailbox1_, |
488 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 301 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
489 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 302 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
490 | 303 |
491 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
492 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 304 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
493 EXPECT_CALL(test_data_.mock_callback_, | 305 EXPECT_CALL(test_data_.mock_callback_, |
494 Release(test_data_.mailbox_name1_, | 306 Release(test_data_.mailbox_name1_, |
495 test_data_.sync_point1_, | 307 test_data_.sync_point1_, |
496 false)) | 308 false)) |
497 .Times(1); | 309 .Times(1); |
498 test_layer->SetTextureMailbox( | 310 test_layer->SetTextureMailbox( |
499 test_data_.mailbox2_, | 311 test_data_.mailbox2_, |
500 SingleReleaseCallback::Create(test_data_.release_mailbox2_)); | 312 SingleReleaseCallback::Create(test_data_.release_mailbox2_)); |
501 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 313 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
502 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 314 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
503 | 315 |
504 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
505 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 316 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
506 EXPECT_CALL(test_data_.mock_callback_, | 317 EXPECT_CALL(test_data_.mock_callback_, |
507 Release(test_data_.mailbox_name2_, | 318 Release(test_data_.mailbox_name2_, |
508 test_data_.sync_point2_, | 319 test_data_.sync_point2_, |
509 false)) | 320 false)) |
510 .Times(1); | 321 .Times(1); |
511 test_layer->SetTextureMailbox(TextureMailbox(), | 322 test_layer->SetTextureMailbox(TextureMailbox(), |
512 scoped_ptr<SingleReleaseCallback>()); | 323 scoped_ptr<SingleReleaseCallback>()); |
513 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 324 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
514 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 325 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
515 | 326 |
516 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
517 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 327 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
518 test_layer->SetTextureMailbox( | 328 test_layer->SetTextureMailbox( |
519 test_data_.mailbox3_, | 329 test_data_.mailbox3_, |
520 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); | 330 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); |
521 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 331 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
522 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 332 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
523 | 333 |
524 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
525 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 334 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
526 EXPECT_CALL(test_data_.mock_callback_, | 335 EXPECT_CALL(test_data_.mock_callback_, |
527 Release2(test_data_.shared_memory_.get(), | 336 Release2(test_data_.shared_memory_.get(), |
528 0, false)) | 337 0, false)) |
529 .Times(1); | 338 .Times(1); |
530 test_layer->SetTextureMailbox(TextureMailbox(), | 339 test_layer->SetTextureMailbox(TextureMailbox(), |
531 scoped_ptr<SingleReleaseCallback>()); | 340 scoped_ptr<SingleReleaseCallback>()); |
532 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 341 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
533 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 342 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
534 | 343 |
535 // Test destructor. | 344 // Test destructor. |
536 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 345 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
537 test_layer->SetTextureMailbox( | 346 test_layer->SetTextureMailbox( |
538 test_data_.mailbox1_, | 347 test_data_.mailbox1_, |
539 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 348 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
540 } | 349 } |
541 | 350 |
542 TEST_F(TextureLayerTest, SetTextureMailboxWithoutReleaseCallback) { | 351 TEST_F(TextureLayerTest, SetTextureMailboxWithoutReleaseCallback) { |
543 scoped_refptr<TextureLayer> test_layer = TextureLayer::CreateForMailbox(NULL); | 352 scoped_refptr<TextureLayer> test_layer = TextureLayer::CreateForMailbox(NULL); |
544 ASSERT_TRUE(test_layer.get()); | 353 ASSERT_TRUE(test_layer.get()); |
545 | 354 |
546 // These use the same gpu::Mailbox, but different sync points. | 355 // These use the same gpu::Mailbox, but different sync points. |
547 TextureMailbox mailbox1(MailboxFromChar('a'), GL_TEXTURE_2D, 1); | 356 TextureMailbox mailbox1(MailboxFromChar('a'), GL_TEXTURE_2D, 1); |
548 TextureMailbox mailbox2(MailboxFromChar('a'), GL_TEXTURE_2D, 2); | 357 TextureMailbox mailbox2(MailboxFromChar('a'), GL_TEXTURE_2D, 2); |
549 | 358 |
550 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
551 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); | 359 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); |
552 layer_tree_host_->SetRootLayer(test_layer); | 360 layer_tree_host_->SetRootLayer(test_layer); |
553 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 361 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
554 | 362 |
555 // Set the mailbox the first time. It should cause a commit. | 363 // Set the mailbox the first time. It should cause a commit. |
556 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
557 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 364 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
558 test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox1); | 365 test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox1); |
559 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 366 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
560 | 367 |
561 // Set the mailbox again with a new sync point, as the backing texture has | 368 // Set the mailbox again with a new sync point, as the backing texture has |
562 // been updated. It should cause a new commit. | 369 // been updated. It should cause a new commit. |
563 EXPECT_CALL(*layer_tree_host_, AcquireLayerTextures()).Times(0); | |
564 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); | 370 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); |
565 test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox2); | 371 test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox2); |
566 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); | 372 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); |
567 } | 373 } |
568 | 374 |
569 class TextureLayerMailboxHolderTest : public TextureLayerTest { | 375 class TextureLayerMailboxHolderTest : public TextureLayerTest { |
570 public: | 376 public: |
571 TextureLayerMailboxHolderTest() | 377 TextureLayerMailboxHolderTest() |
572 : main_thread_("MAIN") { | 378 : main_thread_("MAIN") { |
573 main_thread_.Start(); | 379 main_thread_.Start(); |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 int callback_count_; | 794 int callback_count_; |
989 int commit_count_; | 795 int commit_count_; |
990 scoped_refptr<Layer> root_; | 796 scoped_refptr<Layer> root_; |
991 scoped_refptr<TextureLayer> layer_; | 797 scoped_refptr<TextureLayer> layer_; |
992 }; | 798 }; |
993 | 799 |
994 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 800 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
995 TextureLayerImplWithMailboxThreadedCallback); | 801 TextureLayerImplWithMailboxThreadedCallback); |
996 | 802 |
997 | 803 |
998 class TextureLayerNoMailboxIsActivatedDuringCommit : public LayerTreeTest, | |
999 public TextureLayerClient { | |
1000 protected: | |
1001 TextureLayerNoMailboxIsActivatedDuringCommit() | |
1002 : texture_(0u), activate_count_(0) {} | |
1003 | |
1004 virtual void BeginTest() OVERRIDE { | |
1005 gfx::Size bounds(100, 100); | |
1006 root_ = Layer::Create(); | |
1007 root_->SetAnchorPoint(gfx::PointF()); | |
1008 root_->SetBounds(bounds); | |
1009 | |
1010 layer_ = TextureLayer::Create(this); | |
1011 layer_->SetIsDrawable(true); | |
1012 layer_->SetAnchorPoint(gfx::PointF()); | |
1013 layer_->SetBounds(bounds); | |
1014 | |
1015 root_->AddChild(layer_); | |
1016 layer_tree_host()->SetRootLayer(root_); | |
1017 layer_tree_host()->SetViewportSize(bounds); | |
1018 | |
1019 PostSetNeedsCommitToMainThread(); | |
1020 } | |
1021 | |
1022 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) | |
1023 OVERRIDE { | |
1024 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); | |
1025 texture_ = provider->UnboundTestContext3d()->createExternalTexture(); | |
1026 return FakeOutputSurface::Create3d(provider); | |
1027 } | |
1028 | |
1029 // TextureLayerClient implementation. | |
1030 virtual unsigned PrepareTexture() OVERRIDE { | |
1031 return texture_; | |
1032 } | |
1033 virtual bool PrepareTextureMailbox( | |
1034 TextureMailbox* mailbox, | |
1035 scoped_ptr<SingleReleaseCallback>* release_callback, | |
1036 bool use_shared_memory) OVERRIDE { | |
1037 return false; | |
1038 } | |
1039 | |
1040 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { | |
1041 ++activate_count_; | |
1042 } | |
1043 | |
1044 virtual void DidCommit() OVERRIDE { | |
1045 switch (layer_tree_host()->source_frame_number()) { | |
1046 case 1: | |
1047 // The first texture has been activated. Invalidate the layer so it | |
1048 // grabs a new texture id from the client. | |
1049 layer_->SetNeedsDisplay(); | |
1050 break; | |
1051 case 2: | |
1052 // The second mailbox has been activated. Remove the layer from | |
1053 // the tree to cause another commit/activation. The commit should | |
1054 // finish *after* the layer is removed from the active tree. | |
1055 layer_->RemoveFromParent(); | |
1056 break; | |
1057 case 3: | |
1058 EndTest(); | |
1059 break; | |
1060 } | |
1061 } | |
1062 | |
1063 virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { | |
1064 switch (host_impl->active_tree()->source_frame_number()) { | |
1065 case 2: { | |
1066 // The activate for the 2nd texture should have happened before now. | |
1067 EXPECT_EQ(2, activate_count_); | |
1068 break; | |
1069 } | |
1070 case 3: { | |
1071 // The activate to remove the layer should have happened before now. | |
1072 EXPECT_EQ(3, activate_count_); | |
1073 break; | |
1074 } | |
1075 } | |
1076 } | |
1077 | |
1078 virtual void AfterTest() OVERRIDE {} | |
1079 | |
1080 unsigned texture_; | |
1081 int activate_count_; | |
1082 scoped_refptr<Layer> root_; | |
1083 scoped_refptr<TextureLayer> layer_; | |
1084 }; | |
1085 | |
1086 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | |
1087 TextureLayerNoMailboxIsActivatedDuringCommit); | |
1088 | |
1089 class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest { | 804 class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest { |
1090 protected: | 805 protected: |
1091 TextureLayerMailboxIsActivatedDuringCommit() : activate_count_(0) {} | 806 TextureLayerMailboxIsActivatedDuringCommit() : activate_count_(0) {} |
1092 | 807 |
1093 static void ReleaseCallback(uint32 sync_point, bool lost_resource) {} | 808 static void ReleaseCallback(uint32 sync_point, bool lost_resource) {} |
1094 | 809 |
1095 void SetMailbox(char mailbox_char) { | 810 void SetMailbox(char mailbox_char) { |
1096 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( | 811 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( |
1097 base::Bind( | 812 base::Bind( |
1098 &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback)); | 813 &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback)); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1201 Release(test_data_.mailbox_name1_, | 916 Release(test_data_.mailbox_name1_, |
1202 test_data_.sync_point1_, | 917 test_data_.sync_point1_, |
1203 false)) | 918 false)) |
1204 .Times(AnyNumber()); | 919 .Times(AnyNumber()); |
1205 EXPECT_CALL(test_data_.mock_callback_, | 920 EXPECT_CALL(test_data_.mock_callback_, |
1206 Release2(test_data_.shared_memory_.get(), 0, false)) | 921 Release2(test_data_.shared_memory_.get(), 0, false)) |
1207 .Times(AnyNumber()); | 922 .Times(AnyNumber()); |
1208 // Hardware mode. | 923 // Hardware mode. |
1209 { | 924 { |
1210 scoped_ptr<TextureLayerImpl> impl_layer = | 925 scoped_ptr<TextureLayerImpl> impl_layer = |
1211 TextureLayerImpl::Create(host_impl_.active_tree(), 1, true); | 926 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
1212 impl_layer->SetDrawsContent(true); | 927 impl_layer->SetDrawsContent(true); |
1213 impl_layer->SetTextureMailbox( | 928 impl_layer->SetTextureMailbox( |
1214 test_data_.mailbox1_, | 929 test_data_.mailbox1_, |
1215 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 930 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
1216 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); | 931 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); |
1217 } | 932 } |
1218 | 933 |
1219 { | 934 { |
1220 scoped_ptr<TextureLayerImpl> impl_layer = | 935 scoped_ptr<TextureLayerImpl> impl_layer = |
1221 TextureLayerImpl::Create(host_impl_.active_tree(), 1, true); | 936 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
1222 impl_layer->SetDrawsContent(true); | 937 impl_layer->SetDrawsContent(true); |
1223 impl_layer->SetTextureMailbox(TextureMailbox(), | 938 impl_layer->SetTextureMailbox(TextureMailbox(), |
1224 scoped_ptr<SingleReleaseCallback>()); | 939 scoped_ptr<SingleReleaseCallback>()); |
1225 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); | 940 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); |
1226 } | 941 } |
1227 | 942 |
1228 { | 943 { |
1229 // Software resource. | 944 // Software resource. |
1230 scoped_ptr<TextureLayerImpl> impl_layer = | 945 scoped_ptr<TextureLayerImpl> impl_layer = |
1231 TextureLayerImpl::Create(host_impl_.active_tree(), 1, true); | 946 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
1232 impl_layer->SetDrawsContent(true); | 947 impl_layer->SetDrawsContent(true); |
1233 impl_layer->SetTextureMailbox( | 948 impl_layer->SetTextureMailbox( |
1234 test_data_.mailbox3_, | 949 test_data_.mailbox3_, |
1235 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); | 950 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); |
1236 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); | 951 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); |
1237 } | 952 } |
1238 | 953 |
1239 { | |
1240 scoped_ptr<TextureLayerImpl> impl_layer = | |
1241 TextureLayerImpl::Create(host_impl_.active_tree(), 1, false); | |
1242 impl_layer->SetDrawsContent(true); | |
1243 ContextProvider* context_provider = | |
1244 host_impl_.output_surface()->context_provider(); | |
1245 GLuint texture = 0; | |
1246 context_provider->ContextGL()->GenTextures(1, &texture); | |
1247 impl_layer->SetTextureId(texture); | |
1248 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); | |
1249 } | |
1250 | |
1251 { | |
1252 scoped_ptr<TextureLayerImpl> impl_layer = | |
1253 TextureLayerImpl::Create(host_impl_.active_tree(), 1, false); | |
1254 impl_layer->SetDrawsContent(true); | |
1255 impl_layer->SetTextureId(0); | |
1256 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE)); | |
1257 } | |
1258 | |
1259 // Software mode. | 954 // Software mode. |
1260 { | 955 { |
1261 scoped_ptr<TextureLayerImpl> impl_layer = | 956 scoped_ptr<TextureLayerImpl> impl_layer = |
1262 TextureLayerImpl::Create(host_impl_.active_tree(), 1, true); | 957 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
1263 impl_layer->SetDrawsContent(true); | 958 impl_layer->SetDrawsContent(true); |
1264 impl_layer->SetTextureMailbox( | 959 impl_layer->SetTextureMailbox( |
1265 test_data_.mailbox1_, | 960 test_data_.mailbox1_, |
1266 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 961 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
1267 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); | 962 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); |
1268 } | 963 } |
1269 | 964 |
1270 { | 965 { |
1271 scoped_ptr<TextureLayerImpl> impl_layer = | 966 scoped_ptr<TextureLayerImpl> impl_layer = |
1272 TextureLayerImpl::Create(host_impl_.active_tree(), 1, true); | 967 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
1273 impl_layer->SetDrawsContent(true); | 968 impl_layer->SetDrawsContent(true); |
1274 impl_layer->SetTextureMailbox(TextureMailbox(), | 969 impl_layer->SetTextureMailbox(TextureMailbox(), |
1275 scoped_ptr<SingleReleaseCallback>()); | 970 scoped_ptr<SingleReleaseCallback>()); |
1276 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); | 971 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); |
1277 } | 972 } |
1278 | 973 |
1279 { | 974 { |
1280 // Software resource. | 975 // Software resource. |
1281 scoped_ptr<TextureLayerImpl> impl_layer = | 976 scoped_ptr<TextureLayerImpl> impl_layer = |
1282 TextureLayerImpl::Create(host_impl_.active_tree(), 1, true); | 977 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
1283 impl_layer->SetDrawsContent(true); | 978 impl_layer->SetDrawsContent(true); |
1284 impl_layer->SetTextureMailbox( | 979 impl_layer->SetTextureMailbox( |
1285 test_data_.mailbox3_, | 980 test_data_.mailbox3_, |
1286 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); | 981 SingleReleaseCallback::Create(test_data_.release_mailbox3_)); |
1287 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); | 982 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); |
1288 } | 983 } |
1289 | 984 |
1290 { | |
1291 scoped_ptr<TextureLayerImpl> impl_layer = | |
1292 TextureLayerImpl::Create(host_impl_.active_tree(), 1, false); | |
1293 impl_layer->SetDrawsContent(true); | |
1294 ContextProvider* context_provider = | |
1295 host_impl_.output_surface()->context_provider(); | |
1296 GLuint texture = 0; | |
1297 context_provider->ContextGL()->GenTextures(1, &texture); | |
1298 impl_layer->SetTextureId(texture); | |
1299 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); | |
1300 } | |
1301 | |
1302 { | |
1303 scoped_ptr<TextureLayerImpl> impl_layer = | |
1304 TextureLayerImpl::Create(host_impl_.active_tree(), 1, false); | |
1305 impl_layer->SetDrawsContent(true); | |
1306 impl_layer->SetTextureId(0); | |
1307 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE)); | |
1308 } | |
1309 | |
1310 // Resourceless software mode. | 985 // Resourceless software mode. |
1311 { | 986 { |
1312 scoped_ptr<TextureLayerImpl> impl_layer = | 987 scoped_ptr<TextureLayerImpl> impl_layer = |
1313 TextureLayerImpl::Create(host_impl_.active_tree(), 1, true); | 988 TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
1314 impl_layer->SetDrawsContent(true); | 989 impl_layer->SetDrawsContent(true); |
1315 impl_layer->SetTextureMailbox( | 990 impl_layer->SetTextureMailbox( |
1316 test_data_.mailbox1_, | 991 test_data_.mailbox1_, |
1317 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 992 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
1318 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_RESOURCELESS_SOFTWARE)); | 993 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_RESOURCELESS_SOFTWARE)); |
1319 } | 994 } |
1320 | |
1321 { | |
1322 scoped_ptr<TextureLayerImpl> impl_layer = | |
1323 TextureLayerImpl::Create(host_impl_.active_tree(), 1, false); | |
1324 impl_layer->SetDrawsContent(true); | |
1325 ContextProvider* context_provider = | |
1326 host_impl_.output_surface()->context_provider(); | |
1327 GLuint texture = 0; | |
1328 context_provider->ContextGL()->GenTextures(1, &texture); | |
1329 impl_layer->SetTextureId(texture); | |
1330 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_RESOURCELESS_SOFTWARE)); | |
1331 } | |
1332 } | 995 } |
1333 | 996 |
1334 TEST_F(TextureLayerImplWithMailboxTest, TestImplLayerCallbacks) { | 997 TEST_F(TextureLayerImplWithMailboxTest, TestImplLayerCallbacks) { |
1335 host_impl_.CreatePendingTree(); | 998 host_impl_.CreatePendingTree(); |
1336 scoped_ptr<TextureLayerImpl> pending_layer; | 999 scoped_ptr<TextureLayerImpl> pending_layer; |
1337 pending_layer = TextureLayerImpl::Create(host_impl_.pending_tree(), 1, true); | 1000 pending_layer = TextureLayerImpl::Create(host_impl_.pending_tree(), 1); |
1338 ASSERT_TRUE(pending_layer); | 1001 ASSERT_TRUE(pending_layer); |
1339 | 1002 |
1340 scoped_ptr<LayerImpl> active_layer( | 1003 scoped_ptr<LayerImpl> active_layer( |
1341 pending_layer->CreateLayerImpl(host_impl_.active_tree())); | 1004 pending_layer->CreateLayerImpl(host_impl_.active_tree())); |
1342 ASSERT_TRUE(active_layer); | 1005 ASSERT_TRUE(active_layer); |
1343 | 1006 |
1344 pending_layer->SetTextureMailbox( | 1007 pending_layer->SetTextureMailbox( |
1345 test_data_.mailbox1_, | 1008 test_data_.mailbox1_, |
1346 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 1009 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
1347 | 1010 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1390 false)) | 1053 false)) |
1391 .Times(1); | 1054 .Times(1); |
1392 pending_layer->SetTextureMailbox( | 1055 pending_layer->SetTextureMailbox( |
1393 test_data_.mailbox1_, | 1056 test_data_.mailbox1_, |
1394 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 1057 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
1395 } | 1058 } |
1396 | 1059 |
1397 TEST_F(TextureLayerImplWithMailboxTest, | 1060 TEST_F(TextureLayerImplWithMailboxTest, |
1398 TestDestructorCallbackOnCreatedResource) { | 1061 TestDestructorCallbackOnCreatedResource) { |
1399 scoped_ptr<TextureLayerImpl> impl_layer; | 1062 scoped_ptr<TextureLayerImpl> impl_layer; |
1400 impl_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1, true); | 1063 impl_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1); |
1401 ASSERT_TRUE(impl_layer); | 1064 ASSERT_TRUE(impl_layer); |
1402 | 1065 |
1403 EXPECT_CALL(test_data_.mock_callback_, | 1066 EXPECT_CALL(test_data_.mock_callback_, |
1404 Release(test_data_.mailbox_name1_, _, false)) | 1067 Release(test_data_.mailbox_name1_, _, false)) |
1405 .Times(1); | 1068 .Times(1); |
1406 impl_layer->SetTextureMailbox( | 1069 impl_layer->SetTextureMailbox( |
1407 test_data_.mailbox1_, | 1070 test_data_.mailbox1_, |
1408 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); | 1071 SingleReleaseCallback::Create(test_data_.release_mailbox1_)); |
1409 impl_layer->SetDrawsContent(true); | 1072 impl_layer->SetDrawsContent(true); |
1410 impl_layer->DidBecomeActive(); | 1073 impl_layer->DidBecomeActive(); |
(...skipping 22 matching lines...) Expand all Loading... |
1433 provider->DeleteResource(id); | 1096 provider->DeleteResource(id); |
1434 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); | 1097 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_); |
1435 EXPECT_CALL(test_data_.mock_callback_, | 1098 EXPECT_CALL(test_data_.mock_callback_, |
1436 Release(test_data_.mailbox_name1_, _, false)) | 1099 Release(test_data_.mailbox_name1_, _, false)) |
1437 .Times(1); | 1100 .Times(1); |
1438 ReturnedResourceArray returned; | 1101 ReturnedResourceArray returned; |
1439 TransferableResource::ReturnResources(list, &returned); | 1102 TransferableResource::ReturnResources(list, &returned); |
1440 provider->ReceiveReturnsFromParent(returned); | 1103 provider->ReceiveReturnsFromParent(returned); |
1441 } | 1104 } |
1442 | 1105 |
1443 // Check that ClearClient correctly clears the state so that the impl side | |
1444 // doesn't try to use a texture that could have been destroyed. | |
1445 class TextureLayerClientTest | |
1446 : public LayerTreeTest, | |
1447 public TextureLayerClient { | |
1448 public: | |
1449 TextureLayerClientTest() | |
1450 : texture_(0), | |
1451 commit_count_(0), | |
1452 expected_used_textures_on_draw_(0), | |
1453 expected_used_textures_on_commit_(0) {} | |
1454 | |
1455 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) | |
1456 OVERRIDE { | |
1457 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); | |
1458 texture_ = provider->UnboundTestContext3d()->createExternalTexture(); | |
1459 return FakeOutputSurface::Create3d(provider); | |
1460 } | |
1461 | |
1462 virtual unsigned PrepareTexture() OVERRIDE { return texture_; } | |
1463 | |
1464 virtual bool PrepareTextureMailbox( | |
1465 TextureMailbox* mailbox, | |
1466 scoped_ptr<SingleReleaseCallback>* release_callback, | |
1467 bool use_shared_memory) OVERRIDE { | |
1468 return false; | |
1469 } | |
1470 | |
1471 virtual void SetupTree() OVERRIDE { | |
1472 scoped_refptr<Layer> root = Layer::Create(); | |
1473 root->SetBounds(gfx::Size(10, 10)); | |
1474 root->SetAnchorPoint(gfx::PointF()); | |
1475 root->SetIsDrawable(true); | |
1476 | |
1477 texture_layer_ = TextureLayer::Create(this); | |
1478 texture_layer_->SetBounds(gfx::Size(10, 10)); | |
1479 texture_layer_->SetAnchorPoint(gfx::PointF()); | |
1480 texture_layer_->SetIsDrawable(true); | |
1481 root->AddChild(texture_layer_); | |
1482 | |
1483 layer_tree_host()->SetRootLayer(root); | |
1484 LayerTreeTest::SetupTree(); | |
1485 { | |
1486 base::AutoLock lock(lock_); | |
1487 expected_used_textures_on_commit_ = 1; | |
1488 } | |
1489 } | |
1490 | |
1491 virtual void BeginTest() OVERRIDE { | |
1492 PostSetNeedsCommitToMainThread(); | |
1493 } | |
1494 | |
1495 virtual void DidCommitAndDrawFrame() OVERRIDE { | |
1496 ++commit_count_; | |
1497 switch (commit_count_) { | |
1498 case 1: | |
1499 texture_layer_->ClearClient(); | |
1500 texture_layer_->SetNeedsDisplay(); | |
1501 { | |
1502 base::AutoLock lock(lock_); | |
1503 expected_used_textures_on_commit_ = 0; | |
1504 } | |
1505 break; | |
1506 case 2: | |
1507 EndTest(); | |
1508 break; | |
1509 default: | |
1510 NOTREACHED(); | |
1511 break; | |
1512 } | |
1513 } | |
1514 | |
1515 virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { | |
1516 base::AutoLock lock(lock_); | |
1517 expected_used_textures_on_draw_ = expected_used_textures_on_commit_; | |
1518 } | |
1519 | |
1520 virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( | |
1521 LayerTreeHostImpl* host_impl, | |
1522 LayerTreeHostImpl::FrameData* frame_data, | |
1523 DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { | |
1524 ContextForImplThread(host_impl)->ResetUsedTextures(); | |
1525 return DrawSwapReadbackResult::DRAW_SUCCESS; | |
1526 } | |
1527 | |
1528 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, | |
1529 bool result) OVERRIDE { | |
1530 ASSERT_TRUE(result); | |
1531 EXPECT_EQ(expected_used_textures_on_draw_, | |
1532 ContextForImplThread(host_impl)->NumUsedTextures()); | |
1533 } | |
1534 | |
1535 virtual void AfterTest() OVERRIDE {} | |
1536 | |
1537 private: | |
1538 TestWebGraphicsContext3D* ContextForImplThread(LayerTreeHostImpl* host_impl) { | |
1539 return static_cast<TestContextProvider*>( | |
1540 host_impl->output_surface()->context_provider().get())->TestContext3d(); | |
1541 } | |
1542 | |
1543 scoped_refptr<TextureLayer> texture_layer_; | |
1544 unsigned texture_; | |
1545 int commit_count_; | |
1546 | |
1547 // Used only on thread. | |
1548 unsigned expected_used_textures_on_draw_; | |
1549 | |
1550 // Used on either thread, protected by lock_. | |
1551 base::Lock lock_; | |
1552 unsigned expected_used_textures_on_commit_; | |
1553 }; | |
1554 | |
1555 // The TextureLayerClient does not use mailboxes, so can't use a delegating | |
1556 // renderer. | |
1557 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(TextureLayerClientTest); | |
1558 | |
1559 | |
1560 // Checks that changing a texture in the client for a TextureLayer that's | |
1561 // invisible correctly works without drawing a deleted texture. See | |
1562 // crbug.com/266628 | |
1563 class TextureLayerChangeInvisibleTest | |
1564 : public LayerTreeTest, | |
1565 public TextureLayerClient { | |
1566 public: | |
1567 TextureLayerChangeInvisibleTest() | |
1568 : texture_(0u), | |
1569 prepare_called_(0), | |
1570 commit_count_(0), | |
1571 expected_texture_on_draw_(0) {} | |
1572 | |
1573 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) | |
1574 OVERRIDE { | |
1575 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); | |
1576 texture_ = provider->UnboundTestContext3d()->createExternalTexture(); | |
1577 return FakeOutputSurface::Create3d(provider); | |
1578 } | |
1579 | |
1580 // TextureLayerClient implementation. | |
1581 virtual unsigned PrepareTexture() OVERRIDE { | |
1582 ++prepare_called_; | |
1583 return texture_; | |
1584 } | |
1585 virtual bool PrepareTextureMailbox( | |
1586 TextureMailbox* mailbox, | |
1587 scoped_ptr<SingleReleaseCallback>* release_callback, | |
1588 bool use_shared_memory) OVERRIDE { | |
1589 return false; | |
1590 } | |
1591 | |
1592 virtual void SetupTree() OVERRIDE { | |
1593 scoped_refptr<Layer> root = Layer::Create(); | |
1594 root->SetBounds(gfx::Size(10, 10)); | |
1595 root->SetAnchorPoint(gfx::PointF()); | |
1596 root->SetIsDrawable(true); | |
1597 | |
1598 solid_layer_ = SolidColorLayer::Create(); | |
1599 solid_layer_->SetBounds(gfx::Size(10, 10)); | |
1600 solid_layer_->SetIsDrawable(true); | |
1601 solid_layer_->SetBackgroundColor(SK_ColorWHITE); | |
1602 root->AddChild(solid_layer_); | |
1603 | |
1604 parent_layer_ = Layer::Create(); | |
1605 parent_layer_->SetBounds(gfx::Size(10, 10)); | |
1606 parent_layer_->SetIsDrawable(true); | |
1607 root->AddChild(parent_layer_); | |
1608 | |
1609 texture_layer_ = TextureLayer::Create(this); | |
1610 texture_layer_->SetBounds(gfx::Size(10, 10)); | |
1611 texture_layer_->SetAnchorPoint(gfx::PointF()); | |
1612 texture_layer_->SetIsDrawable(true); | |
1613 parent_layer_->AddChild(texture_layer_); | |
1614 | |
1615 layer_tree_host()->SetRootLayer(root); | |
1616 LayerTreeTest::SetupTree(); | |
1617 } | |
1618 | |
1619 virtual void BeginTest() OVERRIDE { | |
1620 PostSetNeedsCommitToMainThread(); | |
1621 } | |
1622 | |
1623 virtual void DidCommitAndDrawFrame() OVERRIDE { | |
1624 ++commit_count_; | |
1625 switch (commit_count_) { | |
1626 case 1: | |
1627 // We should have updated the layer, committing the texture. | |
1628 EXPECT_EQ(1, prepare_called_); | |
1629 // Make layer invisible. | |
1630 parent_layer_->SetOpacity(0.f); | |
1631 break; | |
1632 case 2: { | |
1633 // Layer shouldn't have been updated. | |
1634 EXPECT_EQ(1, prepare_called_); | |
1635 texture_layer_->SetNeedsDisplay(); | |
1636 // Force a change to make sure we draw a frame. | |
1637 solid_layer_->SetBackgroundColor(SK_ColorGRAY); | |
1638 break; | |
1639 } | |
1640 case 3: | |
1641 EXPECT_EQ(1, prepare_called_); | |
1642 // Make layer visible again. | |
1643 parent_layer_->SetOpacity(1.f); | |
1644 break; | |
1645 case 4: { | |
1646 // Layer should have been updated. | |
1647 EXPECT_EQ(2, prepare_called_); | |
1648 texture_layer_->ClearClient(); | |
1649 texture_ = 0; | |
1650 break; | |
1651 } | |
1652 case 5: | |
1653 EndTest(); | |
1654 break; | |
1655 default: | |
1656 NOTREACHED(); | |
1657 break; | |
1658 } | |
1659 } | |
1660 | |
1661 virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { | |
1662 ASSERT_TRUE(proxy()->IsMainThreadBlocked()); | |
1663 // This is the only texture that can be drawn this frame. | |
1664 expected_texture_on_draw_ = texture_; | |
1665 } | |
1666 | |
1667 virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( | |
1668 LayerTreeHostImpl* host_impl, | |
1669 LayerTreeHostImpl::FrameData* frame_data, | |
1670 DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { | |
1671 ContextForImplThread(host_impl)->ResetUsedTextures(); | |
1672 return DrawSwapReadbackResult::DRAW_SUCCESS; | |
1673 } | |
1674 | |
1675 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, | |
1676 bool result) OVERRIDE { | |
1677 ASSERT_TRUE(result); | |
1678 TestWebGraphicsContext3D* context = ContextForImplThread(host_impl); | |
1679 int used_textures = context->NumUsedTextures(); | |
1680 switch (host_impl->active_tree()->source_frame_number()) { | |
1681 case 0: | |
1682 EXPECT_EQ(1, used_textures); | |
1683 EXPECT_TRUE(context->UsedTexture(expected_texture_on_draw_)); | |
1684 break; | |
1685 case 1: | |
1686 case 2: | |
1687 EXPECT_EQ(0, used_textures); | |
1688 break; | |
1689 case 3: | |
1690 EXPECT_EQ(1, used_textures); | |
1691 EXPECT_TRUE(context->UsedTexture(expected_texture_on_draw_)); | |
1692 break; | |
1693 default: | |
1694 break; | |
1695 } | |
1696 } | |
1697 | |
1698 virtual void AfterTest() OVERRIDE {} | |
1699 | |
1700 private: | |
1701 TestWebGraphicsContext3D* ContextForImplThread(LayerTreeHostImpl* host_impl) { | |
1702 return static_cast<TestContextProvider*>( | |
1703 host_impl->output_surface()->context_provider().get())->TestContext3d(); | |
1704 } | |
1705 | |
1706 scoped_refptr<SolidColorLayer> solid_layer_; | |
1707 scoped_refptr<Layer> parent_layer_; | |
1708 scoped_refptr<TextureLayer> texture_layer_; | |
1709 | |
1710 // Used on the main thread, and on the impl thread while the main thread is | |
1711 // blocked. | |
1712 unsigned texture_; | |
1713 | |
1714 // Used on the main thread. | |
1715 int prepare_called_; | |
1716 int commit_count_; | |
1717 | |
1718 // Used on the compositor thread. | |
1719 unsigned expected_texture_on_draw_; | |
1720 }; | |
1721 | |
1722 // The TextureLayerChangeInvisibleTest does not use mailboxes, so can't use a | |
1723 // delegating renderer. | |
1724 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(TextureLayerChangeInvisibleTest); | |
1725 | |
1726 // Checks that TextureLayer::Update does not cause an extra commit when setting | 1106 // Checks that TextureLayer::Update does not cause an extra commit when setting |
1727 // the texture mailbox. | 1107 // the texture mailbox. |
1728 class TextureLayerNoExtraCommitForMailboxTest | 1108 class TextureLayerNoExtraCommitForMailboxTest |
1729 : public LayerTreeTest, | 1109 : public LayerTreeTest, |
1730 public TextureLayerClient { | 1110 public TextureLayerClient { |
1731 public: | 1111 public: |
1732 // TextureLayerClient implementation. | 1112 // TextureLayerClient implementation. |
1733 virtual unsigned PrepareTexture() OVERRIDE { | |
1734 NOTREACHED(); | |
1735 return 0; | |
1736 } | |
1737 virtual bool PrepareTextureMailbox( | 1113 virtual bool PrepareTextureMailbox( |
1738 TextureMailbox* texture_mailbox, | 1114 TextureMailbox* texture_mailbox, |
1739 scoped_ptr<SingleReleaseCallback>* release_callback, | 1115 scoped_ptr<SingleReleaseCallback>* release_callback, |
1740 bool use_shared_memory) OVERRIDE { | 1116 bool use_shared_memory) OVERRIDE { |
1741 if (layer_tree_host()->source_frame_number() == 1) { | 1117 if (layer_tree_host()->source_frame_number() == 1) { |
1742 *texture_mailbox = TextureMailbox(); | 1118 *texture_mailbox = TextureMailbox(); |
1743 return true; | 1119 return true; |
1744 } | 1120 } |
1745 | 1121 |
1746 *texture_mailbox = TextureMailbox(MailboxFromChar('1'), GL_TEXTURE_2D, 0); | 1122 *texture_mailbox = TextureMailbox(MailboxFromChar('1'), GL_TEXTURE_2D, 0); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1827 public: | 1203 public: |
1828 TextureLayerChangeInvisibleMailboxTest() | 1204 TextureLayerChangeInvisibleMailboxTest() |
1829 : mailbox_changed_(true), | 1205 : mailbox_changed_(true), |
1830 mailbox_returned_(0), | 1206 mailbox_returned_(0), |
1831 prepare_called_(0), | 1207 prepare_called_(0), |
1832 commit_count_(0) { | 1208 commit_count_(0) { |
1833 mailbox_ = MakeMailbox('1'); | 1209 mailbox_ = MakeMailbox('1'); |
1834 } | 1210 } |
1835 | 1211 |
1836 // TextureLayerClient implementation. | 1212 // TextureLayerClient implementation. |
1837 virtual unsigned PrepareTexture() OVERRIDE { | |
1838 NOTREACHED(); | |
1839 return 0; | |
1840 } | |
1841 | |
1842 virtual bool PrepareTextureMailbox( | 1213 virtual bool PrepareTextureMailbox( |
1843 TextureMailbox* mailbox, | 1214 TextureMailbox* mailbox, |
1844 scoped_ptr<SingleReleaseCallback>* release_callback, | 1215 scoped_ptr<SingleReleaseCallback>* release_callback, |
1845 bool use_shared_memory) OVERRIDE { | 1216 bool use_shared_memory) OVERRIDE { |
1846 ++prepare_called_; | 1217 ++prepare_called_; |
1847 if (!mailbox_changed_) | 1218 if (!mailbox_changed_) |
1848 return false; | 1219 return false; |
1849 *mailbox = mailbox_; | 1220 *mailbox = mailbox_; |
1850 *release_callback = SingleReleaseCallback::Create( | 1221 *release_callback = SingleReleaseCallback::Create( |
1851 base::Bind(&TextureLayerChangeInvisibleMailboxTest::MailboxReleased, | 1222 base::Bind(&TextureLayerChangeInvisibleMailboxTest::MailboxReleased, |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1972 | 1343 |
1973 SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerChangeInvisibleMailboxTest); | 1344 SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerChangeInvisibleMailboxTest); |
1974 | 1345 |
1975 // Test that TextureLayerImpl::ReleaseResources can be called which releases | 1346 // Test that TextureLayerImpl::ReleaseResources can be called which releases |
1976 // the mailbox back to TextureLayerClient. | 1347 // the mailbox back to TextureLayerClient. |
1977 class TextureLayerReleaseResourcesBase | 1348 class TextureLayerReleaseResourcesBase |
1978 : public LayerTreeTest, | 1349 : public LayerTreeTest, |
1979 public TextureLayerClient { | 1350 public TextureLayerClient { |
1980 public: | 1351 public: |
1981 // TextureLayerClient implementation. | 1352 // TextureLayerClient implementation. |
1982 virtual unsigned PrepareTexture() OVERRIDE { | |
1983 NOTREACHED(); | |
1984 return 0; | |
1985 } | |
1986 virtual bool PrepareTextureMailbox( | 1353 virtual bool PrepareTextureMailbox( |
1987 TextureMailbox* mailbox, | 1354 TextureMailbox* mailbox, |
1988 scoped_ptr<SingleReleaseCallback>* release_callback, | 1355 scoped_ptr<SingleReleaseCallback>* release_callback, |
1989 bool use_shared_memory) OVERRIDE { | 1356 bool use_shared_memory) OVERRIDE { |
1990 *mailbox = TextureMailbox(MailboxFromChar('1'), GL_TEXTURE_2D, 0); | 1357 *mailbox = TextureMailbox(MailboxFromChar('1'), GL_TEXTURE_2D, 0); |
1991 *release_callback = SingleReleaseCallback::Create( | 1358 *release_callback = SingleReleaseCallback::Create( |
1992 base::Bind(&TextureLayerReleaseResourcesBase::MailboxReleased, | 1359 base::Bind(&TextureLayerReleaseResourcesBase::MailboxReleased, |
1993 base::Unretained(this))); | 1360 base::Unretained(this))); |
1994 return true; | 1361 return true; |
1995 } | 1362 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2045 class TextureLayerReleaseResourcesAfterActivate | 1412 class TextureLayerReleaseResourcesAfterActivate |
2046 : public TextureLayerReleaseResourcesBase { | 1413 : public TextureLayerReleaseResourcesBase { |
2047 public: | 1414 public: |
2048 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { | 1415 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
2049 host_impl->active_tree()->root_layer()->children()[0]->ReleaseResources(); | 1416 host_impl->active_tree()->root_layer()->children()[0]->ReleaseResources(); |
2050 } | 1417 } |
2051 }; | 1418 }; |
2052 | 1419 |
2053 SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerReleaseResourcesAfterActivate); | 1420 SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerReleaseResourcesAfterActivate); |
2054 | 1421 |
2055 // Test recovering from a lost context. | |
2056 class TextureLayerLostContextTest | |
2057 : public LayerTreeTest, | |
2058 public TextureLayerClient { | |
2059 public: | |
2060 TextureLayerLostContextTest() | |
2061 : context_lost_(false), | |
2062 draw_count_(0) {} | |
2063 | |
2064 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) | |
2065 OVERRIDE { | |
2066 return FakeOutputSurface::Create3d(); | |
2067 } | |
2068 | |
2069 virtual unsigned PrepareTexture() OVERRIDE { | |
2070 if (draw_count_ == 0) | |
2071 context_lost_ = true; | |
2072 if (context_lost_) | |
2073 return 0u; | |
2074 return 1u; | |
2075 } | |
2076 | |
2077 virtual bool PrepareTextureMailbox( | |
2078 TextureMailbox* mailbox, | |
2079 scoped_ptr<SingleReleaseCallback>* release_callback, | |
2080 bool use_shared_memory) OVERRIDE { | |
2081 return false; | |
2082 } | |
2083 | |
2084 virtual void SetupTree() OVERRIDE { | |
2085 scoped_refptr<Layer> root = Layer::Create(); | |
2086 root->SetBounds(gfx::Size(10, 10)); | |
2087 root->SetIsDrawable(true); | |
2088 | |
2089 texture_layer_ = TextureLayer::Create(this); | |
2090 texture_layer_->SetBounds(gfx::Size(10, 10)); | |
2091 texture_layer_->SetIsDrawable(true); | |
2092 root->AddChild(texture_layer_); | |
2093 | |
2094 layer_tree_host()->SetRootLayer(root); | |
2095 LayerTreeTest::SetupTree(); | |
2096 } | |
2097 | |
2098 virtual void BeginTest() OVERRIDE { | |
2099 PostSetNeedsCommitToMainThread(); | |
2100 } | |
2101 | |
2102 virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread( | |
2103 LayerTreeHostImpl* host_impl, | |
2104 LayerTreeHostImpl::FrameData* frame_data, | |
2105 DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE { | |
2106 LayerImpl* root = host_impl->RootLayer(); | |
2107 TextureLayerImpl* texture_layer = | |
2108 static_cast<TextureLayerImpl*>(root->children()[0]); | |
2109 if (++draw_count_ == 1) | |
2110 EXPECT_EQ(0u, texture_layer->texture_id()); | |
2111 else | |
2112 EXPECT_EQ(1u, texture_layer->texture_id()); | |
2113 return DrawSwapReadbackResult::DRAW_SUCCESS; | |
2114 } | |
2115 | |
2116 virtual void DidCommitAndDrawFrame() OVERRIDE { | |
2117 EndTest(); | |
2118 } | |
2119 | |
2120 virtual void AfterTest() OVERRIDE {} | |
2121 | |
2122 private: | |
2123 scoped_refptr<TextureLayer> texture_layer_; | |
2124 bool context_lost_; | |
2125 int draw_count_; | |
2126 }; | |
2127 | |
2128 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(TextureLayerLostContextTest); | |
2129 | |
2130 class TextureLayerWithMailboxMainThreadDeleted : public LayerTreeTest { | 1422 class TextureLayerWithMailboxMainThreadDeleted : public LayerTreeTest { |
2131 public: | 1423 public: |
2132 void ReleaseCallback(uint32 sync_point, bool lost_resource) { | 1424 void ReleaseCallback(uint32 sync_point, bool lost_resource) { |
2133 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); | 1425 EXPECT_EQ(true, main_thread_.CalledOnValidThread()); |
2134 EXPECT_FALSE(lost_resource); | 1426 EXPECT_FALSE(lost_resource); |
2135 ++callback_count_; | 1427 ++callback_count_; |
2136 EndTest(); | 1428 EndTest(); |
2137 } | 1429 } |
2138 | 1430 |
2139 void SetMailbox(char mailbox_char) { | 1431 void SetMailbox(char mailbox_char) { |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2271 int callback_count_; | 1563 int callback_count_; |
2272 scoped_refptr<Layer> root_; | 1564 scoped_refptr<Layer> root_; |
2273 scoped_refptr<TextureLayer> layer_; | 1565 scoped_refptr<TextureLayer> layer_; |
2274 }; | 1566 }; |
2275 | 1567 |
2276 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 1568 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
2277 TextureLayerWithMailboxImplThreadDeleted); | 1569 TextureLayerWithMailboxImplThreadDeleted); |
2278 | 1570 |
2279 } // namespace | 1571 } // namespace |
2280 } // namespace cc | 1572 } // namespace cc |
OLD | NEW |