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

Side by Side Diff: cc/trees/layer_tree_host_unittest_delegated.cc

Issue 26023004: aura: Allow delegated frames to be used by more than one impl layer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: frameprovider: are_layers_attached checks Created 7 years, 2 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/trees/layer_tree_host.h" 5 #include "cc/trees/layer_tree_host.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/location.h"
11 #include "base/synchronization/waitable_event.h" 11 #include "base/synchronization/waitable_event.h"
12 #include "base/threading/thread.h" 12 #include "base/threading/thread.h"
13 #include "base/time/time.h" 13 #include "base/time/time.h"
14 #include "cc/layers/delegated_frame_provider.h"
15 #include "cc/layers/delegated_frame_resource_collection.h"
14 #include "cc/layers/delegated_renderer_layer.h" 16 #include "cc/layers/delegated_renderer_layer.h"
15 #include "cc/layers/delegated_renderer_layer_client.h" 17 #include "cc/layers/delegated_renderer_layer_client.h"
16 #include "cc/layers/delegated_renderer_layer_impl.h" 18 #include "cc/layers/delegated_renderer_layer_impl.h"
17 #include "cc/output/compositor_frame.h" 19 #include "cc/output/compositor_frame.h"
18 #include "cc/output/compositor_frame_ack.h" 20 #include "cc/output/compositor_frame_ack.h"
19 #include "cc/output/delegated_frame_data.h" 21 #include "cc/output/delegated_frame_data.h"
20 #include "cc/quads/render_pass_draw_quad.h" 22 #include "cc/quads/render_pass_draw_quad.h"
21 #include "cc/quads/shared_quad_state.h" 23 #include "cc/quads/shared_quad_state.h"
22 #include "cc/quads/texture_draw_quad.h" 24 #include "cc/quads/texture_draw_quad.h"
23 #include "cc/resources/returned_resource.h" 25 #include "cc/resources/returned_resource.h"
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 false, // is_replica 184 false, // is_replica
183 0, // mask_resource_id 185 0, // mask_resource_id
184 damage_rect, 186 damage_rect,
185 gfx::Rect(0, 0, 1, 1), // mask_uv_rect 187 gfx::Rect(0, 0, 1, 1), // mask_uv_rect
186 filters, 188 filters,
187 background_filters); 189 background_filters);
188 frame->render_pass_list[0]->shared_quad_state_list.push_back(sqs.Pass()); 190 frame->render_pass_list[0]->shared_quad_state_list.push_back(sqs.Pass());
189 frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>()); 191 frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>());
190 } 192 }
191 193
192 scoped_ptr<DelegatedFrameData> CreateEmptyFrameData() {
193 scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
194 return frame.Pass();
195 }
196
197
198 static ResourceProvider::ResourceId AppendResourceId( 194 static ResourceProvider::ResourceId AppendResourceId(
199 std::vector<ResourceProvider::ResourceId>* resources_in_last_sent_frame, 195 std::vector<ResourceProvider::ResourceId>* resources_in_last_sent_frame,
200 ResourceProvider::ResourceId resource_id) { 196 ResourceProvider::ResourceId resource_id) {
201 resources_in_last_sent_frame->push_back(resource_id); 197 resources_in_last_sent_frame->push_back(resource_id);
202 return resource_id; 198 return resource_id;
203 } 199 }
204 200
205 void ReturnUnusedResourcesFromParent(LayerTreeHostImpl* host_impl) { 201 void ReturnUnusedResourcesFromParent(LayerTreeHostImpl* host_impl) {
206 DelegatedFrameData* delegated_frame_data = 202 DelegatedFrameData* delegated_frame_data =
207 output_surface()->last_sent_frame().delegated_frame_data.get(); 203 output_surface()->last_sent_frame().delegated_frame_data.get();
208 if (!delegated_frame_data) 204 if (!delegated_frame_data)
209 return; 205 return;
210 206
211 std::vector<ResourceProvider::ResourceId> resources_in_last_sent_frame; 207 std::vector<ResourceProvider::ResourceId> resources_in_last_sent_frame;
212 for (size_t i = 0; i < delegated_frame_data->render_pass_list.size(); ++i) { 208 for (size_t i = 0; i < delegated_frame_data->resource_list.size(); ++i) {
213 RenderPass* pass = delegated_frame_data->render_pass_list.at(i); 209 resources_in_last_sent_frame.push_back(
214 for (size_t j = 0; j < pass->quad_list.size(); ++j) { 210 delegated_frame_data->resource_list[i].id);
215 DrawQuad* quad = pass->quad_list[j];
216 quad->IterateResources(base::Bind(&AppendResourceId,
217 &resources_in_last_sent_frame));
218 }
219 } 211 }
220 212
221 std::vector<ResourceProvider::ResourceId> resources_to_return; 213 std::vector<ResourceProvider::ResourceId> resources_to_return;
222 214
223 const TransferableResourceArray& resources_held_by_parent = 215 const TransferableResourceArray& resources_held_by_parent =
224 output_surface()->resources_held_by_parent(); 216 output_surface()->resources_held_by_parent();
225 for (size_t i = 0; i < resources_held_by_parent.size(); ++i) { 217 for (size_t i = 0; i < resources_held_by_parent.size(); ++i) {
226 ResourceProvider::ResourceId resource_in_parent = 218 ResourceProvider::ResourceId resource_in_parent =
227 resources_held_by_parent[i].id; 219 resources_held_by_parent[i].id;
228 bool resource_in_parent_is_not_part_of_frame = 220 bool resource_in_parent_is_not_part_of_frame =
(...skipping 10 matching lines...) Expand all
239 CompositorFrameAck ack; 231 CompositorFrameAck ack;
240 for (size_t i = 0; i < resources_to_return.size(); ++i) 232 for (size_t i = 0; i < resources_to_return.size(); ++i)
241 output_surface()->ReturnResource(resources_to_return[i], &ack); 233 output_surface()->ReturnResource(resources_to_return[i], &ack);
242 host_impl->ReclaimResources(&ack); 234 host_impl->ReclaimResources(&ack);
243 host_impl->OnSwapBuffersComplete(); 235 host_impl->OnSwapBuffersComplete();
244 } 236 }
245 }; 237 };
246 238
247 class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer 239 class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
248 : public LayerTreeHostDelegatedTest, 240 : public LayerTreeHostDelegatedTest,
249 public DelegatedRendererLayerClient { 241 public DelegatedRendererLayerClient,
242 public DelegatedFrameResourceCollectionClient {
250 public: 243 public:
251 LayerTreeHostDelegatedTestCaseSingleDelegatedLayer() : available_(false) {} 244 LayerTreeHostDelegatedTestCaseSingleDelegatedLayer()
245 : resource_collection_(new DelegatedFrameResourceCollection),
246 available_(false) {
247 resource_collection_->SetClient(this);
248 }
252 249
253 virtual void SetupTree() OVERRIDE { 250 virtual void SetupTree() OVERRIDE {
254 root_ = Layer::Create(); 251 root_ = Layer::Create();
255 root_->SetAnchorPoint(gfx::PointF()); 252 root_->SetAnchorPoint(gfx::PointF());
256 root_->SetBounds(gfx::Size(10, 10)); 253 root_->SetBounds(gfx::Size(10, 10));
257 254
258 delegated_ = FakeDelegatedRendererLayer::Create(this);
259 delegated_->SetAnchorPoint(gfx::PointF());
260 delegated_->SetBounds(gfx::Size(10, 10));
261 delegated_->SetIsDrawable(true);
262
263 root_->AddChild(delegated_);
264 layer_tree_host()->SetRootLayer(root_); 255 layer_tree_host()->SetRootLayer(root_);
265 LayerTreeHostDelegatedTest::SetupTree(); 256 LayerTreeHostDelegatedTest::SetupTree();
266 } 257 }
267 258
268 virtual void BeginTest() OVERRIDE { 259 virtual void BeginTest() OVERRIDE {
260 resource_collection_->SetClient(this);
269 PostSetNeedsCommitToMainThread(); 261 PostSetNeedsCommitToMainThread();
270 } 262 }
271 263
272 virtual void AfterTest() OVERRIDE {} 264 void SetFrameData(scoped_ptr<DelegatedFrameData> frame_data) {
265 RenderPass* root_pass = frame_data->render_pass_list.back();
266 gfx::Size frame_size = root_pass->output_rect.size();
267
268 if (frame_provider_.get() && frame_size == frame_provider_->frame_size()) {
269 frame_provider_->SetFrameData(frame_data.Pass());
270 return;
271 }
272
273 if (delegated_.get()) {
274 delegated_->RemoveFromParent();
275 delegated_ = NULL;
276 frame_provider_ = NULL;
277 }
278
279 frame_provider_ = new DelegatedFrameProvider(resource_collection_.get(),
280 frame_data.Pass());
281
282 delegated_ = CreateDelegatedLayer(frame_provider_.get());
283 }
284
285 scoped_refptr<DelegatedRendererLayer> CreateDelegatedLayer(
286 DelegatedFrameProvider* frame_provider) {
287 scoped_refptr<DelegatedRendererLayer> delegated =
288 FakeDelegatedRendererLayer::Create(this, frame_provider);
289 delegated->SetAnchorPoint(gfx::PointF());
290 delegated->SetBounds(gfx::Size(10, 10));
291 delegated->SetIsDrawable(true);
292
293 root_->AddChild(delegated);
294 return delegated;
295 }
296
297 virtual void AfterTest() OVERRIDE { resource_collection_->SetClient(NULL); }
273 298
274 // DelegatedRendererLayerClient implementation. 299 // DelegatedRendererLayerClient implementation.
275 virtual void DidCommitFrameData() OVERRIDE {} 300 virtual void DidCommitFrameData() OVERRIDE {}
301
302 // DelegatedFrameProviderClient implementation.
276 virtual void UnusedResourcesAreAvailable() OVERRIDE { available_ = true; } 303 virtual void UnusedResourcesAreAvailable() OVERRIDE { available_ = true; }
277 304
278 bool TestAndResetAvailable() { 305 bool TestAndResetAvailable() {
279 bool available = available_; 306 bool available = available_;
280 available_ = false; 307 available_ = false;
281 return available; 308 return available;
282 } 309 }
283 310
284 protected: 311 protected:
312 scoped_refptr<DelegatedFrameResourceCollection> resource_collection_;
313 scoped_refptr<DelegatedFrameProvider> frame_provider_;
285 scoped_refptr<Layer> root_; 314 scoped_refptr<Layer> root_;
286 scoped_refptr<DelegatedRendererLayer> delegated_; 315 scoped_refptr<DelegatedRendererLayer> delegated_;
287 bool available_; 316 bool available_;
288 }; 317 };
289 318
290 class LayerTreeHostDelegatedTestClientDidCommitCallback 319 class LayerTreeHostDelegatedTestClientDidCommitCallback
291 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 320 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
292 public: 321 public:
293 LayerTreeHostDelegatedTestClientDidCommitCallback() 322 LayerTreeHostDelegatedTestClientDidCommitCallback()
294 : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), 323 : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
295 num_did_commit_frame_data_(0) {} 324 num_did_commit_frame_data_(0) {}
296 325
297 virtual void DidCommit() OVERRIDE { 326 virtual void DidCommit() OVERRIDE {
298 if (TestEnded()) 327 if (TestEnded())
299 return; 328 return;
300 329
301 EXPECT_EQ(1, num_did_commit_frame_data_); 330 EXPECT_EQ(1, num_did_commit_frame_data_);
302 EndTest(); 331 EndTest();
303 } 332 }
304 333
305 virtual void BeginTest() OVERRIDE { 334 virtual void BeginTest() OVERRIDE {
306 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), 335 SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
307 gfx::Rect(0, 0, 1, 1)));
308 PostSetNeedsCommitToMainThread(); 336 PostSetNeedsCommitToMainThread();
309 } 337 }
310 338
311 virtual void DidCommitFrameData() OVERRIDE { 339 virtual void DidCommitFrameData() OVERRIDE {
312 num_did_commit_frame_data_++; 340 num_did_commit_frame_data_++;
313 } 341 }
314 342
315 protected: 343 protected:
316 int num_did_commit_frame_data_; 344 int num_did_commit_frame_data_;
317 }; 345 };
318 346
319 SINGLE_AND_MULTI_THREAD_TEST_F( 347 SINGLE_AND_MULTI_THREAD_TEST_F(
320 LayerTreeHostDelegatedTestClientDidCommitCallback); 348 LayerTreeHostDelegatedTestClientDidCommitCallback);
321 349
322 class LayerTreeHostDelegatedTestCreateChildId 350 class LayerTreeHostDelegatedTestCreateChildId
323 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 351 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
324 public: 352 public:
325 LayerTreeHostDelegatedTestCreateChildId() 353 LayerTreeHostDelegatedTestCreateChildId()
326 : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), 354 : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
327 num_activates_(0), 355 num_activates_(0),
328 did_reset_child_id_(false) {} 356 did_reset_child_id_(false) {}
329 357
330 virtual void DidCommit() OVERRIDE { 358 virtual void DidCommit() OVERRIDE {
331 if (TestEnded()) 359 if (TestEnded())
332 return; 360 return;
333 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), 361 SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
334 gfx::Rect(0, 0, 1, 1)));
335 } 362 }
336 363
337 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 364 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
365 if (host_impl->active_tree()->source_frame_number() < 1)
366 return;
367
338 LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 368 LayerImpl* root_impl = host_impl->active_tree()->root_layer();
339 FakeDelegatedRendererLayerImpl* delegated_impl = 369 FakeDelegatedRendererLayerImpl* delegated_impl =
340 static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 370 static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
341 371
342 ContextProvider* context_provider = 372 ContextProvider* context_provider =
343 host_impl->output_surface()->context_provider(); 373 host_impl->output_surface()->context_provider();
344 374
345 ++num_activates_; 375 ++num_activates_;
346 switch (num_activates_) { 376 switch (num_activates_) {
347 case 2: 377 case 2:
(...skipping 21 matching lines...) Expand all
369 399
370 LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 400 LayerImpl* root_impl = host_impl->active_tree()->root_layer();
371 FakeDelegatedRendererLayerImpl* delegated_impl = 401 FakeDelegatedRendererLayerImpl* delegated_impl =
372 static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 402 static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
373 403
374 EXPECT_EQ(2, num_activates_); 404 EXPECT_EQ(2, num_activates_);
375 EXPECT_FALSE(delegated_impl->ChildId()); 405 EXPECT_FALSE(delegated_impl->ChildId());
376 did_reset_child_id_ = true; 406 did_reset_child_id_ = true;
377 } 407 }
378 408
379 virtual void AfterTest() OVERRIDE {}
380
381 protected: 409 protected:
382 int num_activates_; 410 int num_activates_;
383 bool did_reset_child_id_; 411 bool did_reset_child_id_;
384 }; 412 };
385 413
386 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId); 414 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId);
387 415
388 class LayerTreeHostDelegatedTestOffscreenContext_NoFilters 416 class LayerTreeHostDelegatedTestOffscreenContext_NoFilters
389 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 417 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
390 protected: 418 protected:
391 virtual void BeginTest() OVERRIDE { 419 virtual void BeginTest() OVERRIDE {
392 scoped_ptr<DelegatedFrameData> frame = 420 scoped_ptr<DelegatedFrameData> frame =
393 CreateFrameData(gfx::Rect(0, 0, 1, 1), 421 CreateFrameData(gfx::Rect(0, 0, 1, 1),
394 gfx::Rect(0, 0, 1, 1)); 422 gfx::Rect(0, 0, 1, 1));
395 delegated_->SetFrameData(frame.Pass()); 423 SetFrameData(frame.Pass());
396 424
397 PostSetNeedsCommitToMainThread(); 425 PostSetNeedsCommitToMainThread();
398 } 426 }
399 427
400 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 428 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
401 EXPECT_FALSE(host_impl->offscreen_context_provider()); 429 EXPECT_FALSE(host_impl->offscreen_context_provider());
402 EndTest(); 430 EndTest();
403 } 431 }
404
405 virtual void AfterTest() OVERRIDE {}
406 }; 432 };
407 433
408 SINGLE_AND_MULTI_THREAD_TEST_F( 434 SINGLE_AND_MULTI_THREAD_TEST_F(
409 LayerTreeHostDelegatedTestOffscreenContext_NoFilters); 435 LayerTreeHostDelegatedTestOffscreenContext_NoFilters);
410 436
411 class LayerTreeHostDelegatedTestOffscreenContext_Filters 437 class LayerTreeHostDelegatedTestOffscreenContext_Filters
412 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 438 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
413 protected: 439 protected:
414 virtual void BeginTest() OVERRIDE { 440 virtual void BeginTest() OVERRIDE {
415 scoped_ptr<DelegatedFrameData> frame = 441 scoped_ptr<DelegatedFrameData> frame =
416 CreateFrameData(gfx::Rect(0, 0, 1, 1), 442 CreateFrameData(gfx::Rect(0, 0, 1, 1),
417 gfx::Rect(0, 0, 1, 1)); 443 gfx::Rect(0, 0, 1, 1));
418 444
419 FilterOperations filters; 445 FilterOperations filters;
420 filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f)); 446 filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
421 AddRenderPass(frame.get(), 447 AddRenderPass(frame.get(),
422 RenderPass::Id(2, 1), 448 RenderPass::Id(2, 1),
423 gfx::Rect(0, 0, 1, 1), 449 gfx::Rect(0, 0, 1, 1),
424 gfx::Rect(0, 0, 1, 1), 450 gfx::Rect(0, 0, 1, 1),
425 filters, 451 filters,
426 FilterOperations()); 452 FilterOperations());
427 delegated_->SetFrameData(frame.Pass()); 453 SetFrameData(frame.Pass());
428 454
429 PostSetNeedsCommitToMainThread(); 455 PostSetNeedsCommitToMainThread();
430 } 456 }
431 457
432 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 458 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
433 bool expect_context = !delegating_renderer(); 459 bool expect_context = !delegating_renderer();
434 EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider()); 460 EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
435 EndTest(); 461 EndTest();
436 } 462 }
437
438 virtual void AfterTest() OVERRIDE {}
439 }; 463 };
440 464
441 SINGLE_AND_MULTI_THREAD_TEST_F( 465 SINGLE_AND_MULTI_THREAD_TEST_F(
442 LayerTreeHostDelegatedTestOffscreenContext_Filters); 466 LayerTreeHostDelegatedTestOffscreenContext_Filters);
443 467
444 class LayerTreeHostDelegatedTestOffscreenContext_BackgroundFilters 468 class LayerTreeHostDelegatedTestOffscreenContext_BackgroundFilters
445 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 469 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
446 protected: 470 protected:
447 virtual void BeginTest() OVERRIDE { 471 virtual void BeginTest() OVERRIDE {
448 scoped_ptr<DelegatedFrameData> frame = 472 scoped_ptr<DelegatedFrameData> frame =
449 CreateFrameData(gfx::Rect(0, 0, 1, 1), 473 CreateFrameData(gfx::Rect(0, 0, 1, 1),
450 gfx::Rect(0, 0, 1, 1)); 474 gfx::Rect(0, 0, 1, 1));
451 475
452 FilterOperations filters; 476 FilterOperations filters;
453 filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f)); 477 filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
454 AddRenderPass(frame.get(), 478 AddRenderPass(frame.get(),
455 RenderPass::Id(2, 1), 479 RenderPass::Id(2, 1),
456 gfx::Rect(0, 0, 1, 1), 480 gfx::Rect(0, 0, 1, 1),
457 gfx::Rect(0, 0, 1, 1), 481 gfx::Rect(0, 0, 1, 1),
458 FilterOperations(), 482 FilterOperations(),
459 filters); 483 filters);
460 delegated_->SetFrameData(frame.Pass()); 484 SetFrameData(frame.Pass());
461 485
462 PostSetNeedsCommitToMainThread(); 486 PostSetNeedsCommitToMainThread();
463 } 487 }
464 488
465 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 489 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
466 bool expect_context = !delegating_renderer(); 490 bool expect_context = !delegating_renderer();
467 EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider()); 491 EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
468 EndTest(); 492 EndTest();
469 } 493 }
470
471 virtual void AfterTest() OVERRIDE {}
472 }; 494 };
473 495
474 SINGLE_AND_MULTI_THREAD_TEST_F( 496 SINGLE_AND_MULTI_THREAD_TEST_F(
475 LayerTreeHostDelegatedTestOffscreenContext_BackgroundFilters); 497 LayerTreeHostDelegatedTestOffscreenContext_BackgroundFilters);
476 498
477 class LayerTreeHostDelegatedTestOffscreenContext_Filters_AddedToTree 499 class LayerTreeHostDelegatedTestOffscreenContext_Filters_AddedToTree
478 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 500 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
479 protected: 501 protected:
480 virtual void BeginTest() OVERRIDE { 502 virtual void BeginTest() OVERRIDE {
481 scoped_ptr<DelegatedFrameData> frame = 503 scoped_ptr<DelegatedFrameData> frame_no_filters =
482 CreateFrameData(gfx::Rect(0, 0, 1, 1), 504 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
483 gfx::Rect(0, 0, 1, 1)); 505
506 scoped_ptr<DelegatedFrameData> frame_with_filters =
507 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
484 508
485 FilterOperations filters; 509 FilterOperations filters;
486 filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f)); 510 filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
487 AddRenderPass(frame.get(), 511 AddRenderPass(frame_with_filters.get(),
488 RenderPass::Id(2, 1), 512 RenderPass::Id(2, 1),
489 gfx::Rect(0, 0, 1, 1), 513 gfx::Rect(0, 0, 1, 1),
490 gfx::Rect(0, 0, 1, 1), 514 gfx::Rect(0, 0, 1, 1),
491 filters, 515 filters,
492 FilterOperations()); 516 FilterOperations());
493 517
518 SetFrameData(frame_no_filters.Pass());
494 delegated_->RemoveFromParent(); 519 delegated_->RemoveFromParent();
495 delegated_->SetFrameData(frame.Pass()); 520 SetFrameData(frame_with_filters.Pass());
496 layer_tree_host()->root_layer()->AddChild(delegated_); 521 layer_tree_host()->root_layer()->AddChild(delegated_);
497 522
498 PostSetNeedsCommitToMainThread(); 523 PostSetNeedsCommitToMainThread();
499 } 524 }
500 525
501 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 526 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
502 bool expect_context = !delegating_renderer(); 527 bool expect_context = !delegating_renderer();
503 EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider()); 528 EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
504 EndTest(); 529 EndTest();
505 } 530 }
506
507 virtual void AfterTest() OVERRIDE {}
508 }; 531 };
509 532
510 SINGLE_AND_MULTI_THREAD_TEST_F( 533 SINGLE_AND_MULTI_THREAD_TEST_F(
511 LayerTreeHostDelegatedTestOffscreenContext_Filters_AddedToTree); 534 LayerTreeHostDelegatedTestOffscreenContext_Filters_AddedToTree);
512 535
513 class LayerTreeHostDelegatedTestLayerUsesFrameDamage 536 class LayerTreeHostDelegatedTestLayerUsesFrameDamage
514 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 537 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
515 public: 538 public:
516 LayerTreeHostDelegatedTestLayerUsesFrameDamage() 539 LayerTreeHostDelegatedTestLayerUsesFrameDamage()
517 : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), 540 : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
518 first_draw_for_source_frame_(true) {} 541 first_draw_for_source_frame_(true) {}
519 542
520 virtual void DidCommit() OVERRIDE { 543 virtual void DidCommit() OVERRIDE {
521 int next_source_frame_number = layer_tree_host()->source_frame_number(); 544 int next_source_frame_number = layer_tree_host()->source_frame_number();
522 switch (next_source_frame_number) { 545 switch (next_source_frame_number) {
523 case 1: 546 case 1:
524 // The first time the layer gets a frame the whole layer should be 547 // The first time the layer gets a frame the whole layer should be
525 // damaged. 548 // damaged.
526 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), 549 SetFrameData(
527 gfx::Rect(0, 0, 1, 1))); 550 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
528 break; 551 break;
529 case 2: 552 case 2:
553 // A different frame size will damage the whole layer.
554 SetFrameData(
555 CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(0, 0, 0, 0)));
556 break;
557 case 3:
530 // Should create a total amount of gfx::Rect(2, 2, 10, 6) damage. 558 // Should create a total amount of gfx::Rect(2, 2, 10, 6) damage.
531 // The frame size is 20x20 while the layer is 10x10, so this should 559 // The frame size is 20x20 while the layer is 10x10, so this should
532 // produce a gfx::Rect(1, 1, 5, 3) damage rect. 560 // produce a gfx::Rect(1, 1, 5, 3) damage rect.
533 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20), 561 SetFrameData(
534 gfx::Rect(2, 2, 5, 5))); 562 CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(2, 2, 5, 5)));
535 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20), 563 SetFrameData(
536 gfx::Rect(7, 2, 5, 6))); 564 CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(7, 2, 5, 6)));
537 break; 565 break;
538 case 3: 566 case 4:
539 // Should create zero damage. 567 // Should create zero damage.
540 layer_tree_host()->SetNeedsCommit(); 568 layer_tree_host()->SetNeedsCommit();
541 break; 569 break;
542 case 4: 570 case 5:
543 // Should damage the full viewport. 571 // Should damage the full viewport.
544 delegated_->SetBounds(gfx::Size(2, 2)); 572 delegated_->SetBounds(gfx::Size(2, 2));
545 break; 573 break;
546 case 5: 574 case 6:
547 // Should create zero damage. 575 // Should create zero damage.
548 layer_tree_host()->SetNeedsCommit(); 576 layer_tree_host()->SetNeedsCommit();
549 break; 577 break;
550 case 6: 578 case 7:
551 // Should damage the full layer. 579 // Should damage the full layer, tho the frame size is not changing.
552 delegated_->SetBounds(gfx::Size(6, 6)); 580 delegated_->SetBounds(gfx::Size(6, 6));
553 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5), 581 SetFrameData(
554 gfx::Rect(1, 1, 2, 2))); 582 CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(1, 1, 2, 2)));
555 break; 583 break;
556 case 7: 584 case 8:
557 // Should create zero damage. 585 // Should create zero damage.
558 layer_tree_host()->SetNeedsCommit(); 586 layer_tree_host()->SetNeedsCommit();
559 break; 587 break;
560 case 8: 588 case 9:
561 // Should damage the full layer. 589 // Should damage the full layer.
562 delegated_->SetDisplaySize(gfx::Size(10, 10)); 590 delegated_->SetDisplaySize(gfx::Size(10, 10));
563 break; 591 break;
564 case 9: 592 case 10:
565 // Should create zero damage. 593 // Should create zero damage.
566 layer_tree_host()->SetNeedsCommit(); 594 layer_tree_host()->SetNeedsCommit();
567 break; 595 break;
568 case 10:
569 // Setting an empty frame should damage the whole layer the
570 // first time.
571 delegated_->SetFrameData(CreateEmptyFrameData());
572 break;
573 case 11: 596 case 11:
574 // Setting an empty frame shouldn't damage anything after the 597 // Changing the frame size damages the full layer.
575 // first time. 598 SetFrameData(
576 delegated_->SetFrameData(CreateEmptyFrameData()); 599 CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(4, 4, 1, 1)));
577 break; 600 break;
578 case 12: 601 case 12:
579 // Having valid content to display agains should damage the whole layer. 602 // An invalid frame isn't used, so it should not cause damage.
580 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 10, 10), 603 SetFrameData(CreateInvalidFrameData(gfx::Rect(0, 0, 5, 5),
581 gfx::Rect(5, 5, 1, 1))); 604 gfx::Rect(4, 4, 1, 1)));
582 break; 605 break;
583 case 13: 606 case 13:
584 // An invalid frame isn't used, so it should not cause damage.
585 delegated_->SetFrameData(CreateInvalidFrameData(gfx::Rect(0, 0, 10, 10),
586 gfx::Rect(5, 5, 1, 1)));
587 break;
588 case 14:
589 // Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is 607 // Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is
590 // 5x5 and the display size is now set to 10x10, so this should result 608 // 5x5 and the display size is now set to 10x10, so this should result
591 // in a gfx::Rect(2, 2, 4, 4) damage rect. 609 // in a gfx::Rect(2, 2, 4, 4) damage rect.
592 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5), 610 SetFrameData(
593 gfx::Rect(1, 1, 2, 2))); 611 CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
594 break; 612 break;
595 case 15: 613 case 14:
596 // Should create zero damage. 614 // Should create zero damage.
597 layer_tree_host()->SetNeedsCommit(); 615 layer_tree_host()->SetNeedsCommit();
598 break; 616 break;
599 case 16: 617 case 15:
600 // Moving the layer out of the tree and back in will damage the whole 618 // Moving the layer out of the tree and back in will damage the whole
601 // impl layer. 619 // impl layer.
602 delegated_->RemoveFromParent(); 620 delegated_->RemoveFromParent();
603 layer_tree_host()->root_layer()->AddChild(delegated_); 621 layer_tree_host()->root_layer()->AddChild(delegated_);
604 break; 622 break;
605 case 17: 623 case 16:
606 // Make a larger frame with lots of damage. Then a frame smaller than 624 // Make a larger frame with lots of damage. Then a frame smaller than
607 // the first frame's damage. The entire layer should be damaged, but 625 // the first frame's damage. The entire layer should be damaged, but
608 // nothing more. 626 // nothing more.
609 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 10, 10), 627 SetFrameData(
610 gfx::Rect(0, 0, 10, 10))); 628 CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
611 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5), 629 SetFrameData(
612 gfx::Rect(1, 1, 2, 2))); 630 CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
631 break;
632 case 17:
633 // Make a frame with lots of damage. Then replace it with a frame with
634 // no damage. The entire layer should be damaged, but nothing more.
635 SetFrameData(
636 CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
637 SetFrameData(
638 CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 0, 0)));
613 break; 639 break;
614 case 18: 640 case 18:
615 // Make a frame with lots of damage. Then replace it with an empty 641 // Make another layer that uses the same frame provider. The new layer
616 // frame. The entire layer should be damaged, but nothing more. 642 // should be damaged.
617 delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 10, 10), 643 delegated_copy_ = CreateDelegatedLayer(frame_provider_);
618 gfx::Rect(0, 0, 10, 10))); 644 delegated_copy_->SetPosition(gfx::Point(5, 0));
619 delegated_->SetFrameData(CreateEmptyFrameData()); 645
646 // Also set a new frame.
647 SetFrameData(
648 CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(4, 0, 1, 1)));
620 break; 649 break;
650 case 19:
651 // Set another new frame, both layers should be damaged in the same
652 // ways.
653 SetFrameData(
654 CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(3, 3, 1, 1)));
621 } 655 }
622 first_draw_for_source_frame_ = true; 656 first_draw_for_source_frame_ = true;
623 } 657 }
624 658
625 virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 659 virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
626 LayerTreeHostImpl::FrameData* frame, 660 LayerTreeHostImpl::FrameData* frame,
627 bool result) OVERRIDE { 661 bool result) OVERRIDE {
628 EXPECT_TRUE(result); 662 EXPECT_TRUE(result);
629 663
630 if (!first_draw_for_source_frame_) 664 if (!first_draw_for_source_frame_)
(...skipping 11 matching lines...) Expand all
642 case 0: 676 case 0:
643 // First frame is damaged because of viewport resize. 677 // First frame is damaged because of viewport resize.
644 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(), 678 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
645 damage_rect.ToString()); 679 damage_rect.ToString());
646 break; 680 break;
647 case 1: 681 case 1:
648 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(), 682 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
649 damage_rect.ToString()); 683 damage_rect.ToString());
650 break; 684 break;
651 case 2: 685 case 2:
686 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
687 damage_rect.ToString());
688 break;
689 case 3:
652 EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(), 690 EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(),
653 damage_rect.ToString()); 691 damage_rect.ToString());
654 break; 692 break;
655 case 3: 693 case 4:
656 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 694 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
657 damage_rect.ToString()); 695 damage_rect.ToString());
658 break; 696 break;
659 case 4: 697 case 5:
660 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(), 698 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
661 damage_rect.ToString()); 699 damage_rect.ToString());
662 break; 700 break;
663 case 5: 701 case 6:
664 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 702 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
665 damage_rect.ToString()); 703 damage_rect.ToString());
666 break; 704 break;
667 case 6: 705 case 7:
668 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 706 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
669 damage_rect.ToString()); 707 damage_rect.ToString());
670 break; 708 break;
671 case 7: 709 case 8:
672 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 710 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
673 damage_rect.ToString()); 711 damage_rect.ToString());
674 break; 712 break;
675 case 8: 713 case 9:
676 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 714 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
677 damage_rect.ToString()); 715 damage_rect.ToString());
678 break; 716 break;
679 case 9: 717 case 10:
680 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 718 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
681 damage_rect.ToString()); 719 damage_rect.ToString());
682 break; 720 break;
683 case 10: 721 case 11:
684 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 722 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
685 damage_rect.ToString()); 723 damage_rect.ToString());
686 break; 724 break;
687 case 11: 725 case 12:
688 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 726 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
689 damage_rect.ToString()); 727 damage_rect.ToString());
690 break; 728 break;
691 case 12: 729 case 13:
692 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 730 EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(),
693 damage_rect.ToString()); 731 damage_rect.ToString());
694 break; 732 break;
695 case 13: 733 case 14:
696 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 734 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
697 damage_rect.ToString()); 735 damage_rect.ToString());
698 break; 736 break;
699 case 14:
700 EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(),
701 damage_rect.ToString());
702 break;
703 case 15: 737 case 15:
704 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 738 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
705 damage_rect.ToString()); 739 damage_rect.ToString());
706 break; 740 break;
707 case 16: 741 case 16:
708 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 742 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
709 damage_rect.ToString()); 743 damage_rect.ToString());
710 break; 744 break;
711 case 17: 745 case 17:
712 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 746 EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
713 damage_rect.ToString()); 747 damage_rect.ToString());
714 break; 748 break;
715 case 18: 749 case 18:
716 EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 750 EXPECT_EQ(gfx::UnionRects(gfx::RectF(5.f, 0.f, 10.f, 10.f),
751 gfx::RectF(4.f, 0.f, 1.f, 1.f)).ToString(),
752 damage_rect.ToString());
753 break;
754 case 19:
755 EXPECT_EQ(gfx::RectF(3.f, 3.f, 6.f, 1.f).ToString(),
717 damage_rect.ToString()); 756 damage_rect.ToString());
718 EndTest(); 757 EndTest();
719 break; 758 break;
720 } 759 }
721 760
722 return result; 761 return result;
723 } 762 }
724 763
725 protected: 764 protected:
765 scoped_refptr<DelegatedRendererLayer> delegated_copy_;
726 bool first_draw_for_source_frame_; 766 bool first_draw_for_source_frame_;
727 }; 767 };
728 768
729 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage); 769 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage);
730 770
731 class LayerTreeHostDelegatedTestMergeResources 771 class LayerTreeHostDelegatedTestMergeResources
732 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 772 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
733 public: 773 public:
734 virtual void BeginTest() OVERRIDE { 774 virtual void BeginTest() OVERRIDE {
735 // Push two frames to the delegated renderer layer with no commit between. 775 // Push two frames to the delegated renderer layer with no commit between.
736 776
737 // The first frame has resource 999. 777 // The first frame has resource 999.
738 scoped_ptr<DelegatedFrameData> frame1 = 778 scoped_ptr<DelegatedFrameData> frame1 =
739 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 779 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
740 AddTextureQuad(frame1.get(), 999); 780 AddTextureQuad(frame1.get(), 999);
741 AddTransferableResource(frame1.get(), 999); 781 AddTransferableResource(frame1.get(), 999);
742 delegated_->SetFrameData(frame1.Pass()); 782 SetFrameData(frame1.Pass());
743 783
744 // The second frame uses resource 999 still, but also adds 555. 784 // The second frame uses resource 999 still, but also adds 555.
745 scoped_ptr<DelegatedFrameData> frame2 = 785 scoped_ptr<DelegatedFrameData> frame2 =
746 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 786 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
747 AddTextureQuad(frame2.get(), 999); 787 AddTextureQuad(frame2.get(), 999);
748 AddTransferableResource(frame2.get(), 999); 788 AddTransferableResource(frame2.get(), 999);
749 AddTextureQuad(frame2.get(), 555); 789 AddTextureQuad(frame2.get(), 555);
750 AddTransferableResource(frame2.get(), 555); 790 AddTransferableResource(frame2.get(), 555);
751 delegated_->SetFrameData(frame2.Pass()); 791 SetFrameData(frame2.Pass());
752 792
753 // The resource 999 from frame1 is returned since it is still on the main 793 // The resource 999 from frame1 is returned since it is still on the main
754 // thread. 794 // thread.
755 ReturnedResourceArray returned_resources; 795 ReturnedResourceArray returned_resources;
756 delegated_->TakeUnusedResourcesForChildCompositor(&returned_resources); 796 resource_collection_->TakeUnusedResourcesForChildCompositor(
797 &returned_resources);
757 { 798 {
758 unsigned expected[] = {999}; 799 unsigned expected[] = {999};
759 EXPECT_RESOURCES(expected, returned_resources); 800 EXPECT_RESOURCES(expected, returned_resources);
760 EXPECT_TRUE(TestAndResetAvailable()); 801 EXPECT_TRUE(TestAndResetAvailable());
761 } 802 }
762 803
763 PostSetNeedsCommitToMainThread(); 804 PostSetNeedsCommitToMainThread();
764 } 805 }
765 806
766 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 807 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
767 LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 808 LayerImpl* root_impl = host_impl->active_tree()->root_layer();
768 FakeDelegatedRendererLayerImpl* delegated_impl = 809 FakeDelegatedRendererLayerImpl* delegated_impl =
769 static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 810 static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
770 811
771 const ResourceProvider::ResourceIdMap& map = 812 const ResourceProvider::ResourceIdMap& map =
772 host_impl->resource_provider()->GetChildToParentMap( 813 host_impl->resource_provider()->GetChildToParentMap(
773 delegated_impl->ChildId()); 814 delegated_impl->ChildId());
774 815
775 // Both frames' resources should be in the parent's resource provider. 816 // Both frames' resources should be in the parent's resource provider.
776 EXPECT_EQ(2u, map.size()); 817 EXPECT_EQ(2u, map.size());
777 EXPECT_EQ(1u, map.count(999)); 818 EXPECT_EQ(1u, map.count(999));
778 EXPECT_EQ(1u, map.count(555)); 819 EXPECT_EQ(1u, map.count(555));
779 820
780 EXPECT_EQ(2u, delegated_impl->Resources().size()); 821 EXPECT_EQ(2u, delegated_impl->Resources().size());
781 EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 822 EXPECT_EQ(1u, delegated_impl->Resources().count(999));
782 EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 823 EXPECT_EQ(1u, delegated_impl->Resources().count(555));
783 824
784 EndTest(); 825 EndTest();
785 } 826 }
786
787 virtual void AfterTest() OVERRIDE {}
788 }; 827 };
789 828
790 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestMergeResources); 829 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestMergeResources);
791 830
792 class LayerTreeHostDelegatedTestRemapResourcesInQuads 831 class LayerTreeHostDelegatedTestRemapResourcesInQuads
793 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 832 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
794 public: 833 public:
795 virtual void BeginTest() OVERRIDE { 834 virtual void BeginTest() OVERRIDE {
796 // Generate a frame with two resources in it. 835 // Generate a frame with two resources in it.
797 scoped_ptr<DelegatedFrameData> frame = 836 scoped_ptr<DelegatedFrameData> frame =
798 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 837 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
799 AddTextureQuad(frame.get(), 999); 838 AddTextureQuad(frame.get(), 999);
800 AddTransferableResource(frame.get(), 999); 839 AddTransferableResource(frame.get(), 999);
801 AddTextureQuad(frame.get(), 555); 840 AddTextureQuad(frame.get(), 555);
802 AddTransferableResource(frame.get(), 555); 841 AddTransferableResource(frame.get(), 555);
803 delegated_->SetFrameData(frame.Pass()); 842 SetFrameData(frame.Pass());
804 843
805 PostSetNeedsCommitToMainThread(); 844 PostSetNeedsCommitToMainThread();
806 } 845 }
807 846
808 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 847 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
809 LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 848 LayerImpl* root_impl = host_impl->active_tree()->root_layer();
810 FakeDelegatedRendererLayerImpl* delegated_impl = 849 FakeDelegatedRendererLayerImpl* delegated_impl =
811 static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 850 static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
812 851
813 const ResourceProvider::ResourceIdMap& map = 852 const ResourceProvider::ResourceIdMap& map =
(...skipping 13 matching lines...) Expand all
827 // The resources in the quads should be remapped to the parent's namespace. 866 // The resources in the quads should be remapped to the parent's namespace.
828 const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast( 867 const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
829 delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[0]); 868 delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[0]);
830 EXPECT_EQ(parent_resource_id1, quad1->resource_id); 869 EXPECT_EQ(parent_resource_id1, quad1->resource_id);
831 const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast( 870 const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
832 delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[1]); 871 delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[1]);
833 EXPECT_EQ(parent_resource_id2, quad2->resource_id); 872 EXPECT_EQ(parent_resource_id2, quad2->resource_id);
834 873
835 EndTest(); 874 EndTest();
836 } 875 }
837
838 virtual void AfterTest() OVERRIDE {}
839 }; 876 };
840 877
841 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemapResourcesInQuads); 878 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemapResourcesInQuads);
842 879
843 class LayerTreeHostDelegatedTestReturnUnusedResources 880 class LayerTreeHostDelegatedTestReturnUnusedResources
844 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 881 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
845 public: 882 public:
846 virtual void BeginTest() OVERRIDE { 883 virtual void BeginTest() OVERRIDE {
847 PostSetNeedsCommitToMainThread(); 884 PostSetNeedsCommitToMainThread();
848 } 885 }
849 886
850 virtual void DidCommitAndDrawFrame() OVERRIDE { 887 virtual void DidCommitAndDrawFrame() OVERRIDE {
851 scoped_ptr<DelegatedFrameData> frame; 888 scoped_ptr<DelegatedFrameData> frame;
852 ReturnedResourceArray resources; 889 ReturnedResourceArray resources;
853 890
854 int next_source_frame_number = layer_tree_host()->source_frame_number(); 891 int next_source_frame_number = layer_tree_host()->source_frame_number();
855 switch (next_source_frame_number) { 892 switch (next_source_frame_number) {
856 case 1: 893 case 1:
857 // Generate a frame with two resources in it. 894 // Generate a frame with two resources in it.
858 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 895 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
859 AddTextureQuad(frame.get(), 999); 896 AddTextureQuad(frame.get(), 999);
860 AddTransferableResource(frame.get(), 999); 897 AddTransferableResource(frame.get(), 999);
861 AddTextureQuad(frame.get(), 555); 898 AddTextureQuad(frame.get(), 555);
862 AddTransferableResource(frame.get(), 555); 899 AddTransferableResource(frame.get(), 555);
863 delegated_->SetFrameData(frame.Pass()); 900 SetFrameData(frame.Pass());
864 break; 901 break;
865 case 2: 902 case 2:
866 // All of the resources are in use. 903 // All of the resources are in use.
867 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 904 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
868 EXPECT_EQ(0u, resources.size()); 905 EXPECT_EQ(0u, resources.size());
869 EXPECT_FALSE(TestAndResetAvailable()); 906 EXPECT_FALSE(TestAndResetAvailable());
870 907
871 // Keep using 999 but stop using 555. 908 // Keep using 999 but stop using 555.
872 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 909 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
873 AddTextureQuad(frame.get(), 999); 910 AddTextureQuad(frame.get(), 999);
874 AddTransferableResource(frame.get(), 999); 911 AddTransferableResource(frame.get(), 999);
875 AddTextureQuad(frame.get(), 444); 912 AddTextureQuad(frame.get(), 444);
876 AddTransferableResource(frame.get(), 444); 913 AddTransferableResource(frame.get(), 444);
877 delegated_->SetFrameData(frame.Pass()); 914 SetFrameData(frame.Pass());
878 break; 915 break;
879 case 3: 916 case 3:
880 // 555 is no longer in use. 917 // 555 is no longer in use.
881 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 918 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
882 { 919 {
883 unsigned expected[] = {555}; 920 unsigned expected[] = {555};
884 EXPECT_RESOURCES(expected, resources); 921 EXPECT_RESOURCES(expected, resources);
885 EXPECT_TRUE(TestAndResetAvailable()); 922 EXPECT_TRUE(TestAndResetAvailable());
886 } 923 }
887 924
888 // Stop using any resources. 925 // Stop using any resources.
889 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 926 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
890 delegated_->SetFrameData(frame.Pass()); 927 SetFrameData(frame.Pass());
891 break; 928 break;
892 case 4: 929 case 4:
893 // Postpone collecting resources for a frame. They should still be there 930 // Postpone collecting resources for a frame. They should still be there
894 // the next frame. 931 // the next frame.
895 layer_tree_host()->SetNeedsCommit(); 932 layer_tree_host()->SetNeedsCommit();
896 return; 933 return;
897 case 5: 934 case 5:
898 // 444 and 999 are no longer in use. We sent two refs to 999, so we 935 // 444 and 999 are no longer in use. We sent two refs to 999, so we
899 // should get two back. 936 // should get two back.
900 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 937 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
901 { 938 {
902 unsigned expected[] = {444, 999, 999}; 939 unsigned expected[] = {444, 999, 999};
903 EXPECT_RESOURCES(expected, resources); 940 EXPECT_RESOURCES(expected, resources);
904 EXPECT_TRUE(TestAndResetAvailable()); 941 EXPECT_TRUE(TestAndResetAvailable());
905 } 942 }
906 EndTest(); 943 EndTest();
907 break; 944 break;
908 } 945 }
909 946
910 // Resources are never immediately released. 947 // Resources are never immediately released.
911 ReturnedResourceArray empty_resources; 948 ReturnedResourceArray empty_resources;
912 delegated_->TakeUnusedResourcesForChildCompositor(&empty_resources); 949 resource_collection_->TakeUnusedResourcesForChildCompositor(
950 &empty_resources);
913 EXPECT_EQ(0u, empty_resources.size()); 951 EXPECT_EQ(0u, empty_resources.size());
914 EXPECT_FALSE(TestAndResetAvailable()); 952 EXPECT_FALSE(TestAndResetAvailable());
915 } 953 }
916 954
917 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 955 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
918 bool result) OVERRIDE { 956 bool result) OVERRIDE {
919 ReturnUnusedResourcesFromParent(host_impl); 957 ReturnUnusedResourcesFromParent(host_impl);
920 } 958 }
921
922 virtual void AfterTest() OVERRIDE {}
923 }; 959 };
924 960
925 SINGLE_AND_MULTI_THREAD_TEST_F( 961 SINGLE_AND_MULTI_THREAD_TEST_F(
926 LayerTreeHostDelegatedTestReturnUnusedResources); 962 LayerTreeHostDelegatedTestReturnUnusedResources);
927 963
928 class LayerTreeHostDelegatedTestReusedResources 964 class LayerTreeHostDelegatedTestReusedResources
929 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 965 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
930 public: 966 public:
931 virtual void BeginTest() OVERRIDE { 967 virtual void BeginTest() OVERRIDE {
932 PostSetNeedsCommitToMainThread(); 968 PostSetNeedsCommitToMainThread();
933 } 969 }
934 970
935 virtual void DidCommitAndDrawFrame() OVERRIDE { 971 virtual void DidCommitAndDrawFrame() OVERRIDE {
936 scoped_ptr<DelegatedFrameData> frame; 972 scoped_ptr<DelegatedFrameData> frame;
937 ReturnedResourceArray resources; 973 ReturnedResourceArray resources;
938 974
939 int next_source_frame_number = layer_tree_host()->source_frame_number(); 975 int next_source_frame_number = layer_tree_host()->source_frame_number();
940 switch (next_source_frame_number) { 976 switch (next_source_frame_number) {
941 case 1: 977 case 1:
942 // Generate a frame with some resources in it. 978 // Generate a frame with some resources in it.
943 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 979 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
944 AddTextureQuad(frame.get(), 999); 980 AddTextureQuad(frame.get(), 999);
945 AddTransferableResource(frame.get(), 999); 981 AddTransferableResource(frame.get(), 999);
946 AddTextureQuad(frame.get(), 555); 982 AddTextureQuad(frame.get(), 555);
947 AddTransferableResource(frame.get(), 555); 983 AddTransferableResource(frame.get(), 555);
948 AddTextureQuad(frame.get(), 444); 984 AddTextureQuad(frame.get(), 444);
949 AddTransferableResource(frame.get(), 444); 985 AddTransferableResource(frame.get(), 444);
950 delegated_->SetFrameData(frame.Pass()); 986 SetFrameData(frame.Pass());
951 break; 987 break;
952 case 2: 988 case 2:
953 // All of the resources are in use. 989 // All of the resources are in use.
954 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 990 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
955 EXPECT_EQ(0u, resources.size()); 991 EXPECT_EQ(0u, resources.size());
956 EXPECT_FALSE(TestAndResetAvailable()); 992 EXPECT_FALSE(TestAndResetAvailable());
957 993
958 // Keep using 999 but stop using 555 and 444. 994 // Keep using 999 but stop using 555 and 444.
959 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 995 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
960 AddTextureQuad(frame.get(), 999); 996 AddTextureQuad(frame.get(), 999);
961 AddTransferableResource(frame.get(), 999); 997 AddTransferableResource(frame.get(), 999);
962 delegated_->SetFrameData(frame.Pass()); 998 SetFrameData(frame.Pass());
963 999
964 // Resource are not immediately released. 1000 // Resource are not immediately released.
965 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1001 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
966 EXPECT_EQ(0u, resources.size()); 1002 EXPECT_EQ(0u, resources.size());
967 EXPECT_FALSE(TestAndResetAvailable()); 1003 EXPECT_FALSE(TestAndResetAvailable());
968 1004
969 // Now using 555 and 444 again, but not 999. 1005 // Now using 555 and 444 again, but not 999.
970 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1006 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
971 AddTextureQuad(frame.get(), 555); 1007 AddTextureQuad(frame.get(), 555);
972 AddTransferableResource(frame.get(), 555); 1008 AddTransferableResource(frame.get(), 555);
973 AddTextureQuad(frame.get(), 444); 1009 AddTextureQuad(frame.get(), 444);
974 AddTransferableResource(frame.get(), 444); 1010 AddTransferableResource(frame.get(), 444);
975 delegated_->SetFrameData(frame.Pass()); 1011 SetFrameData(frame.Pass());
976 break; 1012 break;
977 case 3: 1013 case 3:
978 // The 999 resource is the only unused one. Two references were sent, so 1014 // The 999 resource is the only unused one. Two references were sent, so
979 // two should be returned. 1015 // two should be returned.
980 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1016 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
981 { 1017 {
982 unsigned expected[] = {999, 999}; 1018 unsigned expected[] = {999, 999};
983 EXPECT_RESOURCES(expected, resources); 1019 EXPECT_RESOURCES(expected, resources);
984 EXPECT_TRUE(TestAndResetAvailable()); 1020 EXPECT_TRUE(TestAndResetAvailable());
985 } 1021 }
986 EndTest(); 1022 EndTest();
987 break; 1023 break;
988 } 1024 }
989 } 1025 }
990 1026
991 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 1027 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
992 bool result) OVERRIDE { 1028 bool result) OVERRIDE {
993 ReturnUnusedResourcesFromParent(host_impl); 1029 ReturnUnusedResourcesFromParent(host_impl);
994 } 1030 }
995
996 virtual void AfterTest() OVERRIDE {}
997 }; 1031 };
998 1032
999 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestReusedResources); 1033 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestReusedResources);
1000 1034
1001 class LayerTreeHostDelegatedTestFrameBeforeAck 1035 class LayerTreeHostDelegatedTestFrameBeforeAck
1002 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1036 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1003 public: 1037 public:
1004 virtual void BeginTest() OVERRIDE { 1038 virtual void BeginTest() OVERRIDE {
1005 PostSetNeedsCommitToMainThread(); 1039 PostSetNeedsCommitToMainThread();
1006 } 1040 }
1007 1041
1008 virtual void DidCommitAndDrawFrame() OVERRIDE { 1042 virtual void DidCommitAndDrawFrame() OVERRIDE {
1009 scoped_ptr<DelegatedFrameData> frame; 1043 scoped_ptr<DelegatedFrameData> frame;
1010 ReturnedResourceArray resources; 1044 ReturnedResourceArray resources;
1011 1045
1012 int next_source_frame_number = layer_tree_host()->source_frame_number(); 1046 int next_source_frame_number = layer_tree_host()->source_frame_number();
1013 switch (next_source_frame_number) { 1047 switch (next_source_frame_number) {
1014 case 1: 1048 case 1:
1015 // Generate a frame with some resources in it. 1049 // Generate a frame with some resources in it.
1016 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1050 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1017 AddTextureQuad(frame.get(), 999); 1051 AddTextureQuad(frame.get(), 999);
1018 AddTransferableResource(frame.get(), 999); 1052 AddTransferableResource(frame.get(), 999);
1019 AddTextureQuad(frame.get(), 555); 1053 AddTextureQuad(frame.get(), 555);
1020 AddTransferableResource(frame.get(), 555); 1054 AddTransferableResource(frame.get(), 555);
1021 AddTextureQuad(frame.get(), 444); 1055 AddTextureQuad(frame.get(), 444);
1022 AddTransferableResource(frame.get(), 444); 1056 AddTransferableResource(frame.get(), 444);
1023 delegated_->SetFrameData(frame.Pass()); 1057 SetFrameData(frame.Pass());
1024 break; 1058 break;
1025 case 2: 1059 case 2:
1026 // All of the resources are in use. 1060 // All of the resources are in use.
1027 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1061 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1028 EXPECT_EQ(0u, resources.size()); 1062 EXPECT_EQ(0u, resources.size());
1029 EXPECT_FALSE(TestAndResetAvailable()); 1063 EXPECT_FALSE(TestAndResetAvailable());
1030 1064
1031 // Keep using 999 but stop using 555 and 444. 1065 // Keep using 999 but stop using 555 and 444.
1032 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1066 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1033 AddTextureQuad(frame.get(), 999); 1067 AddTextureQuad(frame.get(), 999);
1034 AddTransferableResource(frame.get(), 999); 1068 AddTransferableResource(frame.get(), 999);
1035 delegated_->SetFrameData(frame.Pass()); 1069 SetFrameData(frame.Pass());
1036 1070
1037 // Resource are not immediately released. 1071 // Resource are not immediately released.
1038 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1072 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1039 EXPECT_EQ(0u, resources.size()); 1073 EXPECT_EQ(0u, resources.size());
1040 EXPECT_FALSE(TestAndResetAvailable()); 1074 EXPECT_FALSE(TestAndResetAvailable());
1041 1075
1042 // The parent compositor (this one) does a commit. 1076 // The parent compositor (this one) does a commit.
1043 break; 1077 break;
1044 case 3: 1078 case 3:
1045 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1079 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1046 { 1080 {
1047 unsigned expected[] = {444, 555}; 1081 unsigned expected[] = {444, 555};
1048 EXPECT_RESOURCES(expected, resources); 1082 EXPECT_RESOURCES(expected, resources);
1049 EXPECT_TRUE(TestAndResetAvailable()); 1083 EXPECT_TRUE(TestAndResetAvailable());
1050 } 1084 }
1051 1085
1052 // The child compositor sends a frame referring to resources not in the 1086 // The child compositor sends a frame referring to resources not in the
1053 // frame. 1087 // frame.
1054 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1088 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1055 AddTextureQuad(frame.get(), 999); 1089 AddTextureQuad(frame.get(), 999);
1056 AddTextureQuad(frame.get(), 555); 1090 AddTextureQuad(frame.get(), 555);
1057 AddTextureQuad(frame.get(), 444); 1091 AddTextureQuad(frame.get(), 444);
1058 delegated_->SetFrameData(frame.Pass()); 1092 SetFrameData(frame.Pass());
1059 break; 1093 break;
1060 } 1094 }
1061 } 1095 }
1062 1096
1063 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1097 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1064 if (host_impl->active_tree()->source_frame_number() != 3) 1098 if (host_impl->active_tree()->source_frame_number() != 3)
1065 return; 1099 return;
1066 1100
1067 LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 1101 LayerImpl* root_impl = host_impl->active_tree()->root_layer();
1068 FakeDelegatedRendererLayerImpl* delegated_impl = 1102 FakeDelegatedRendererLayerImpl* delegated_impl =
(...skipping 18 matching lines...) Expand all
1087 pass->quad_list[0]); 1121 pass->quad_list[0]);
1088 EXPECT_EQ(map.find(999)->second, quad->resource_id); 1122 EXPECT_EQ(map.find(999)->second, quad->resource_id);
1089 1123
1090 EndTest(); 1124 EndTest();
1091 } 1125 }
1092 1126
1093 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 1127 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1094 bool result) OVERRIDE { 1128 bool result) OVERRIDE {
1095 ReturnUnusedResourcesFromParent(host_impl); 1129 ReturnUnusedResourcesFromParent(host_impl);
1096 } 1130 }
1097
1098 virtual void AfterTest() OVERRIDE {}
1099 }; 1131 };
1100 1132
1101 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestFrameBeforeAck); 1133 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestFrameBeforeAck);
1102 1134
1103 class LayerTreeHostDelegatedTestFrameBeforeTakeResources 1135 class LayerTreeHostDelegatedTestFrameBeforeTakeResources
1104 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1136 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1105 public: 1137 public:
1106 virtual void BeginTest() OVERRIDE { 1138 virtual void BeginTest() OVERRIDE {
1107 PostSetNeedsCommitToMainThread(); 1139 PostSetNeedsCommitToMainThread();
1108 } 1140 }
1109 1141
1110 virtual void DidCommitAndDrawFrame() OVERRIDE { 1142 virtual void DidCommitAndDrawFrame() OVERRIDE {
1111 scoped_ptr<DelegatedFrameData> frame; 1143 scoped_ptr<DelegatedFrameData> frame;
1112 ReturnedResourceArray resources; 1144 ReturnedResourceArray resources;
1113 1145
1114 int next_source_frame_number = layer_tree_host()->source_frame_number(); 1146 int next_source_frame_number = layer_tree_host()->source_frame_number();
1115 switch (next_source_frame_number) { 1147 switch (next_source_frame_number) {
1116 case 1: 1148 case 1:
1117 // Generate a frame with some resources in it. 1149 // Generate a frame with some resources in it.
1118 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1150 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1119 AddTextureQuad(frame.get(), 999); 1151 AddTextureQuad(frame.get(), 999);
1120 AddTransferableResource(frame.get(), 999); 1152 AddTransferableResource(frame.get(), 999);
1121 AddTextureQuad(frame.get(), 555); 1153 AddTextureQuad(frame.get(), 555);
1122 AddTransferableResource(frame.get(), 555); 1154 AddTransferableResource(frame.get(), 555);
1123 AddTextureQuad(frame.get(), 444); 1155 AddTextureQuad(frame.get(), 444);
1124 AddTransferableResource(frame.get(), 444); 1156 AddTransferableResource(frame.get(), 444);
1125 delegated_->SetFrameData(frame.Pass()); 1157 SetFrameData(frame.Pass());
1126 break; 1158 break;
1127 case 2: 1159 case 2:
1128 // All of the resources are in use. 1160 // All of the resources are in use.
1129 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1161 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1130 EXPECT_EQ(0u, resources.size()); 1162 EXPECT_EQ(0u, resources.size());
1131 EXPECT_FALSE(TestAndResetAvailable()); 1163 EXPECT_FALSE(TestAndResetAvailable());
1132 1164
1133 // Keep using 999 but stop using 555 and 444. 1165 // Keep using 999 but stop using 555 and 444.
1134 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1166 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1135 AddTextureQuad(frame.get(), 999); 1167 AddTextureQuad(frame.get(), 999);
1136 AddTransferableResource(frame.get(), 999); 1168 AddTransferableResource(frame.get(), 999);
1137 delegated_->SetFrameData(frame.Pass()); 1169 SetFrameData(frame.Pass());
1138 1170
1139 // Resource are not immediately released. 1171 // Resource are not immediately released.
1140 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1172 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1141 EXPECT_EQ(0u, resources.size()); 1173 EXPECT_EQ(0u, resources.size());
1142 EXPECT_FALSE(TestAndResetAvailable()); 1174 EXPECT_FALSE(TestAndResetAvailable());
1143 1175
1144 // The parent compositor (this one) does a commit. 1176 // The parent compositor (this one) does a commit.
1145 break; 1177 break;
1146 case 3: 1178 case 3:
1147 // The child compositor sends a frame before taking resources back 1179 // The child compositor sends a frame before taking resources back
1148 // from the previous commit. This frame makes use of the resources 555 1180 // from the previous commit. This frame makes use of the resources 555
1149 // and 444, which were just released during commit. 1181 // and 444, which were just released during commit.
1150 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1182 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1151 AddTextureQuad(frame.get(), 999); 1183 AddTextureQuad(frame.get(), 999);
1152 AddTransferableResource(frame.get(), 999); 1184 AddTransferableResource(frame.get(), 999);
1153 AddTextureQuad(frame.get(), 555); 1185 AddTextureQuad(frame.get(), 555);
1154 AddTransferableResource(frame.get(), 555); 1186 AddTransferableResource(frame.get(), 555);
1155 AddTextureQuad(frame.get(), 444); 1187 AddTextureQuad(frame.get(), 444);
1156 AddTransferableResource(frame.get(), 444); 1188 AddTransferableResource(frame.get(), 444);
1157 delegated_->SetFrameData(frame.Pass()); 1189 SetFrameData(frame.Pass());
1158 1190
1159 // The resources are used by the new frame but are returned anyway since 1191 // The resources are used by the new frame but are returned anyway since
1160 // we passed them again. 1192 // we passed them again.
1161 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1193 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1162 { 1194 {
1163 unsigned expected[] = {444, 555}; 1195 unsigned expected[] = {444, 555};
1164 EXPECT_RESOURCES(expected, resources); 1196 EXPECT_RESOURCES(expected, resources);
1165 EXPECT_TRUE(TestAndResetAvailable()); 1197 EXPECT_TRUE(TestAndResetAvailable());
1166 } 1198 }
1167 break; 1199 break;
1168 case 4: 1200 case 4:
1169 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1201 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1170 EXPECT_EQ(0u, resources.size()); 1202 EXPECT_EQ(0u, resources.size());
1171 EXPECT_FALSE(TestAndResetAvailable()); 1203 EXPECT_FALSE(TestAndResetAvailable());
1172 EndTest(); 1204 EndTest();
1173 break; 1205 break;
1174 } 1206 }
1175 } 1207 }
1176 1208
1177 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1209 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1178 if (host_impl->active_tree()->source_frame_number() != 3) 1210 if (host_impl->active_tree()->source_frame_number() != 3)
1179 return; 1211 return;
(...skipping 28 matching lines...) Expand all
1208 EXPECT_EQ(map.find(555)->second, quad2->resource_id); 1240 EXPECT_EQ(map.find(555)->second, quad2->resource_id);
1209 const TextureDrawQuad* quad3 = TextureDrawQuad::MaterialCast( 1241 const TextureDrawQuad* quad3 = TextureDrawQuad::MaterialCast(
1210 pass->quad_list[2]); 1242 pass->quad_list[2]);
1211 EXPECT_EQ(map.find(444)->second, quad3->resource_id); 1243 EXPECT_EQ(map.find(444)->second, quad3->resource_id);
1212 } 1244 }
1213 1245
1214 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 1246 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1215 bool result) OVERRIDE { 1247 bool result) OVERRIDE {
1216 ReturnUnusedResourcesFromParent(host_impl); 1248 ReturnUnusedResourcesFromParent(host_impl);
1217 } 1249 }
1218
1219 virtual void AfterTest() OVERRIDE {}
1220 }; 1250 };
1221 1251
1222 SINGLE_AND_MULTI_THREAD_TEST_F( 1252 SINGLE_AND_MULTI_THREAD_TEST_F(
1223 LayerTreeHostDelegatedTestFrameBeforeTakeResources); 1253 LayerTreeHostDelegatedTestFrameBeforeTakeResources);
1224 1254
1225 class LayerTreeHostDelegatedTestBadFrame 1255 class LayerTreeHostDelegatedTestBadFrame
1226 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1256 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1227 public: 1257 public:
1228 virtual void BeginTest() OVERRIDE { 1258 virtual void BeginTest() OVERRIDE {
1229 PostSetNeedsCommitToMainThread(); 1259 PostSetNeedsCommitToMainThread();
1230 } 1260 }
1231 1261
1232 virtual void DidCommitAndDrawFrame() OVERRIDE { 1262 virtual void DidCommitAndDrawFrame() OVERRIDE {
1233 scoped_ptr<DelegatedFrameData> frame; 1263 scoped_ptr<DelegatedFrameData> frame;
1234 ReturnedResourceArray resources; 1264 ReturnedResourceArray resources;
1235 1265
1236 int next_source_frame_number = layer_tree_host()->source_frame_number(); 1266 int next_source_frame_number = layer_tree_host()->source_frame_number();
1237 switch (next_source_frame_number) { 1267 switch (next_source_frame_number) {
1238 case 1: 1268 case 1:
1239 // Generate a frame with some resources in it. 1269 // Generate a frame with some resources in it.
1240 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1270 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1241 AddTextureQuad(frame.get(), 999); 1271 AddTextureQuad(frame.get(), 999);
1242 AddTransferableResource(frame.get(), 999); 1272 AddTransferableResource(frame.get(), 999);
1243 AddTextureQuad(frame.get(), 555); 1273 AddTextureQuad(frame.get(), 555);
1244 AddTransferableResource(frame.get(), 555); 1274 AddTransferableResource(frame.get(), 555);
1245 delegated_->SetFrameData(frame.Pass()); 1275 SetFrameData(frame.Pass());
1246 break; 1276 break;
1247 case 2: 1277 case 2:
1248 // All of the resources are in use. 1278 // All of the resources are in use.
1249 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1279 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1250 EXPECT_EQ(0u, resources.size()); 1280 EXPECT_EQ(0u, resources.size());
1251 EXPECT_FALSE(TestAndResetAvailable()); 1281 EXPECT_FALSE(TestAndResetAvailable());
1252 1282
1253 // Generate a bad frame with a resource the layer doesn't have. The 1283 // Generate a bad frame with a resource the layer doesn't have. The
1254 // 885 and 775 resources are unknown, while ownership of the legit 444 1284 // 885 and 775 resources are unknown, while ownership of the legit 444
1255 // resource is passed in here. The bad frame does not use any of the 1285 // resource is passed in here. The bad frame does not use any of the
1256 // previous resources, 999 or 555. 1286 // previous resources, 999 or 555.
1257 // A bad quad is present both before and after the good quad. 1287 // A bad quad is present both before and after the good quad.
1258 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1288 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1259 AddTextureQuad(frame.get(), 885); 1289 AddTextureQuad(frame.get(), 885);
1260 AddTextureQuad(frame.get(), 444); 1290 AddTextureQuad(frame.get(), 444);
1261 AddTransferableResource(frame.get(), 444); 1291 AddTransferableResource(frame.get(), 444);
1262 AddTextureQuad(frame.get(), 775); 1292 AddTextureQuad(frame.get(), 775);
1263 delegated_->SetFrameData(frame.Pass()); 1293 SetFrameData(frame.Pass());
1264 1294
1265 // The parent compositor (this one) does a commit. 1295 // The parent compositor (this one) does a commit.
1266 break; 1296 break;
1267 case 3: 1297 case 3:
1298 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1299 EXPECT_EQ(0u, resources.size());
1300 EXPECT_FALSE(TestAndResetAvailable());
1301
1302 // Now send a good frame with 999 again.
1303 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1304 AddTextureQuad(frame.get(), 999);
1305 SetFrameData(frame.Pass());
1306
1268 // The bad frame's resource is given back to the child compositor. 1307 // The bad frame's resource is given back to the child compositor.
1269 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1308 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1270 { 1309 {
1271 unsigned expected[] = {444}; 1310 unsigned expected[] = {444};
1272 EXPECT_RESOURCES(expected, resources); 1311 EXPECT_RESOURCES(expected, resources);
1273 EXPECT_TRUE(TestAndResetAvailable()); 1312 EXPECT_TRUE(TestAndResetAvailable());
1274 } 1313 }
1275
1276 // Now send a good frame with 999 again.
1277 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1278 AddTextureQuad(frame.get(), 999);
1279 delegated_->SetFrameData(frame.Pass());
1280 break; 1314 break;
1281 case 4: 1315 case 4:
1282 // The unused 555 from the last good frame is now released. 1316 // The unused 555 from the last good frame is now released.
1283 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1317 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1284 { 1318 {
1285 unsigned expected[] = {555}; 1319 unsigned expected[] = {555};
1286 EXPECT_RESOURCES(expected, resources); 1320 EXPECT_RESOURCES(expected, resources);
1287 EXPECT_TRUE(TestAndResetAvailable()); 1321 EXPECT_TRUE(TestAndResetAvailable());
1288 } 1322 }
1289 1323
1290 EndTest(); 1324 EndTest();
1291 break; 1325 break;
1292 } 1326 }
1293 } 1327 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1361 1395
1362 const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 1396 const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
1363 EXPECT_EQ(1u, pass->quad_list.size()); 1397 EXPECT_EQ(1u, pass->quad_list.size());
1364 const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast( 1398 const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
1365 pass->quad_list[0]); 1399 pass->quad_list[0]);
1366 EXPECT_EQ(map.find(999)->second, quad1->resource_id); 1400 EXPECT_EQ(map.find(999)->second, quad1->resource_id);
1367 break; 1401 break;
1368 } 1402 }
1369 } 1403 }
1370 } 1404 }
1371
1372 virtual void AfterTest() OVERRIDE {}
1373 }; 1405 };
1374 1406
1375 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestBadFrame); 1407 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestBadFrame);
1376 1408
1377 class LayerTreeHostDelegatedTestUnnamedResource 1409 class LayerTreeHostDelegatedTestUnnamedResource
1378 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1410 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1379 public: 1411 public:
1380 virtual void BeginTest() OVERRIDE { 1412 virtual void BeginTest() OVERRIDE {
1381 PostSetNeedsCommitToMainThread(); 1413 PostSetNeedsCommitToMainThread();
1382 } 1414 }
1383 1415
1384 virtual void DidCommit() OVERRIDE { 1416 virtual void DidCommit() OVERRIDE {
1385 scoped_ptr<DelegatedFrameData> frame; 1417 scoped_ptr<DelegatedFrameData> frame;
1386 ReturnedResourceArray resources; 1418 ReturnedResourceArray resources;
1387 1419
1388 int next_source_frame_number = layer_tree_host()->source_frame_number(); 1420 int next_source_frame_number = layer_tree_host()->source_frame_number();
1389 switch (next_source_frame_number) { 1421 switch (next_source_frame_number) {
1390 case 1: 1422 case 1:
1391 // This frame includes two resources in it, but only uses one. 1423 // This frame includes two resources in it, but only uses one.
1392 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1424 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1393 AddTransferableResource(frame.get(), 999); 1425 AddTransferableResource(frame.get(), 999);
1394 AddTextureQuad(frame.get(), 555); 1426 AddTextureQuad(frame.get(), 555);
1395 AddTransferableResource(frame.get(), 555); 1427 AddTransferableResource(frame.get(), 555);
1396 delegated_->SetFrameData(frame.Pass()); 1428 SetFrameData(frame.Pass());
1397 break; 1429 break;
1398 case 2: 1430 case 2:
1431 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1432 EXPECT_EQ(0u, resources.size());
1433 EXPECT_FALSE(TestAndResetAvailable());
1434
1435 // Now send an empty frame.
1436 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1437 SetFrameData(frame.Pass());
1438
1399 // The unused resource should be returned. 1439 // The unused resource should be returned.
1400 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1440 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1401 { 1441 {
1402 unsigned expected[] = {999}; 1442 unsigned expected[] = {999};
1403 EXPECT_RESOURCES(expected, resources); 1443 EXPECT_RESOURCES(expected, resources);
1404 EXPECT_TRUE(TestAndResetAvailable()); 1444 EXPECT_TRUE(TestAndResetAvailable());
1405 } 1445 }
1406 1446
1407 EndTest(); 1447 EndTest();
1408 break; 1448 break;
1409 } 1449 }
1410 } 1450 }
(...skipping 10 matching lines...) Expand all
1421 host_impl->resource_provider()->GetChildToParentMap( 1461 host_impl->resource_provider()->GetChildToParentMap(
1422 delegated_impl->ChildId()); 1462 delegated_impl->ChildId());
1423 1463
1424 // The layer only held on to the resource that was used. 1464 // The layer only held on to the resource that was used.
1425 EXPECT_EQ(1u, map.size()); 1465 EXPECT_EQ(1u, map.size());
1426 EXPECT_EQ(1u, map.count(555)); 1466 EXPECT_EQ(1u, map.count(555));
1427 1467
1428 EXPECT_EQ(1u, delegated_impl->Resources().size()); 1468 EXPECT_EQ(1u, delegated_impl->Resources().size());
1429 EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 1469 EXPECT_EQ(1u, delegated_impl->Resources().count(555));
1430 } 1470 }
1431
1432 virtual void AfterTest() OVERRIDE {}
1433 }; 1471 };
1434 1472
1435 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestUnnamedResource); 1473 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestUnnamedResource);
1436 1474
1437 class LayerTreeHostDelegatedTestDontLeakResource 1475 class LayerTreeHostDelegatedTestDontLeakResource
1438 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1476 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1439 public: 1477 public:
1440 virtual void BeginTest() OVERRIDE { 1478 virtual void BeginTest() OVERRIDE {
1441 PostSetNeedsCommitToMainThread(); 1479 PostSetNeedsCommitToMainThread();
1442 } 1480 }
1443 1481
1444 virtual void DidCommitAndDrawFrame() OVERRIDE { 1482 virtual void DidCommitAndDrawFrame() OVERRIDE {
1445 scoped_ptr<DelegatedFrameData> frame; 1483 scoped_ptr<DelegatedFrameData> frame;
1446 ReturnedResourceArray resources; 1484 ReturnedResourceArray resources;
1447 1485
1448 int next_source_frame_number = layer_tree_host()->source_frame_number(); 1486 int next_source_frame_number = layer_tree_host()->source_frame_number();
1449 switch (next_source_frame_number) { 1487 switch (next_source_frame_number) {
1450 case 1: 1488 case 1:
1451 // This frame includes two resources in it. 1489 // This frame includes two resources in it.
1452 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1490 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1453 AddTextureQuad(frame.get(), 999); 1491 AddTextureQuad(frame.get(), 999);
1454 AddTransferableResource(frame.get(), 999); 1492 AddTransferableResource(frame.get(), 999);
1455 AddTextureQuad(frame.get(), 555); 1493 AddTextureQuad(frame.get(), 555);
1456 AddTransferableResource(frame.get(), 555); 1494 AddTransferableResource(frame.get(), 555);
1457 delegated_->SetFrameData(frame.Pass()); 1495 SetFrameData(frame.Pass());
1458 1496
1459 // But then we immediately stop using 999. 1497 // But then we immediately stop using 999.
1460 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1498 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1461 AddTextureQuad(frame.get(), 555); 1499 AddTextureQuad(frame.get(), 555);
1462 AddTransferableResource(frame.get(), 555); 1500 AddTransferableResource(frame.get(), 555);
1463 delegated_->SetFrameData(frame.Pass()); 1501 SetFrameData(frame.Pass());
1464 break; 1502 break;
1465 case 2: 1503 case 2:
1466 // The unused resources should be returned. 555 is still used, but it's 1504 // The unused resources should be returned. 555 is still used, but it's
1467 // returned once to account for the first frame. 1505 // returned once to account for the first frame.
1468 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1506 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1469 { 1507 {
1470 unsigned expected[] = {555, 999}; 1508 unsigned expected[] = {555, 999};
1471 EXPECT_RESOURCES(expected, resources); 1509 EXPECT_RESOURCES(expected, resources);
1472 EXPECT_TRUE(TestAndResetAvailable()); 1510 EXPECT_TRUE(TestAndResetAvailable());
1473 } 1511 }
1474 // Send a frame with no resources in it. 1512 // Send a frame with no resources in it.
1475 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1513 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1476 delegated_->SetFrameData(frame.Pass()); 1514 SetFrameData(frame.Pass());
1477 break; 1515 break;
1478 case 3: 1516 case 3:
1479 // The now unused resource 555 should be returned. 1517 // The now unused resource 555 should be returned.
1480 resources.clear(); 1518 resources.clear();
1481 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1519 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1482 { 1520 {
1483 unsigned expected[] = {555}; 1521 unsigned expected[] = {555};
1484 EXPECT_RESOURCES(expected, resources); 1522 EXPECT_RESOURCES(expected, resources);
1485 EXPECT_TRUE(TestAndResetAvailable()); 1523 EXPECT_TRUE(TestAndResetAvailable());
1486 } 1524 }
1487 EndTest(); 1525 EndTest();
1488 break; 1526 break;
1489 } 1527 }
1490 } 1528 }
1491 1529
(...skipping 14 matching lines...) Expand all
1506 EXPECT_EQ(1u, map.count(555)); 1544 EXPECT_EQ(1u, map.count(555));
1507 1545
1508 EXPECT_EQ(1u, delegated_impl->Resources().size()); 1546 EXPECT_EQ(1u, delegated_impl->Resources().size());
1509 EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 1547 EXPECT_EQ(1u, delegated_impl->Resources().count(555));
1510 } 1548 }
1511 1549
1512 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 1550 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1513 bool result) OVERRIDE { 1551 bool result) OVERRIDE {
1514 ReturnUnusedResourcesFromParent(host_impl); 1552 ReturnUnusedResourcesFromParent(host_impl);
1515 } 1553 }
1516
1517 virtual void AfterTest() OVERRIDE {}
1518 }; 1554 };
1519 1555
1520 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestDontLeakResource); 1556 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestDontLeakResource);
1521 1557
1522 class LayerTreeHostDelegatedTestResourceSentToParent 1558 class LayerTreeHostDelegatedTestResourceSentToParent
1523 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1559 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1524 public: 1560 public:
1525 virtual void DidCommitAndDrawFrame() OVERRIDE { 1561 virtual void DidCommitAndDrawFrame() OVERRIDE {
1526 scoped_ptr<DelegatedFrameData> frame; 1562 scoped_ptr<DelegatedFrameData> frame;
1527 ReturnedResourceArray resources; 1563 ReturnedResourceArray resources;
1528 1564
1529 int next_source_frame_number = layer_tree_host()->source_frame_number(); 1565 int next_source_frame_number = layer_tree_host()->source_frame_number();
1530 switch (next_source_frame_number) { 1566 switch (next_source_frame_number) {
1531 case 1: 1567 case 1:
1532 // This frame includes two resources in it. 1568 // This frame includes two resources in it.
1533 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1569 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1534 AddTextureQuad(frame.get(), 999); 1570 AddTextureQuad(frame.get(), 999);
1535 AddTransferableResource(frame.get(), 999); 1571 AddTransferableResource(frame.get(), 999);
1536 AddTextureQuad(frame.get(), 555); 1572 AddTextureQuad(frame.get(), 555);
1537 AddTransferableResource(frame.get(), 555); 1573 AddTransferableResource(frame.get(), 555);
1538 delegated_->SetFrameData(frame.Pass()); 1574 SetFrameData(frame.Pass());
1539 break; 1575 break;
1540 case 2: 1576 case 2:
1541 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1577 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1542 EXPECT_EQ(0u, resources.size()); 1578 EXPECT_EQ(0u, resources.size());
1543 EXPECT_FALSE(TestAndResetAvailable()); 1579 EXPECT_FALSE(TestAndResetAvailable());
1544 1580
1545 // 999 is in use in the grandparent compositor, generate a frame without 1581 // 999 is in use in the grandparent compositor, generate a frame without
1546 // it present. 1582 // it present.
1547 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1583 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1548 AddTextureQuad(frame.get(), 555); 1584 AddTextureQuad(frame.get(), 555);
1549 AddTransferableResource(frame.get(), 555); 1585 AddTransferableResource(frame.get(), 555);
1550 delegated_->SetFrameData(frame.Pass()); 1586 SetFrameData(frame.Pass());
1551 break; 1587 break;
1552 case 3: 1588 case 3:
1553 // Since 999 is in the grandparent it is not returned. 1589 // Since 999 is in the grandparent it is not returned.
1554 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1590 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1555 EXPECT_EQ(0u, resources.size()); 1591 EXPECT_EQ(0u, resources.size());
1556 EXPECT_FALSE(TestAndResetAvailable()); 1592 EXPECT_FALSE(TestAndResetAvailable());
1557 1593
1558 // The impl side will get back the resource at some point. 1594 // The impl side will get back the resource at some point.
1559 ImplThreadTaskRunner()->PostTask(FROM_HERE, 1595 ImplThreadTaskRunner()->PostTask(FROM_HERE,
1560 receive_resource_on_thread_); 1596 receive_resource_on_thread_);
1561 break; 1597 break;
1562 } 1598 }
1563 } 1599 }
1564 1600
(...skipping 12 matching lines...) Expand all
1577 host_impl->ReclaimResources(&ack); 1613 host_impl->ReclaimResources(&ack);
1578 host_impl->OnSwapBuffersComplete(); 1614 host_impl->OnSwapBuffersComplete();
1579 } 1615 }
1580 1616
1581 virtual void UnusedResourcesAreAvailable() OVERRIDE { 1617 virtual void UnusedResourcesAreAvailable() OVERRIDE {
1582 EXPECT_EQ(3, layer_tree_host()->source_frame_number()); 1618 EXPECT_EQ(3, layer_tree_host()->source_frame_number());
1583 1619
1584 ReturnedResourceArray resources; 1620 ReturnedResourceArray resources;
1585 1621
1586 // 999 was returned from the grandparent and could be released. 1622 // 999 was returned from the grandparent and could be released.
1587 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1623 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1588 { 1624 {
1589 unsigned expected[] = {999}; 1625 unsigned expected[] = {999};
1590 EXPECT_RESOURCES(expected, resources); 1626 EXPECT_RESOURCES(expected, resources);
1591 } 1627 }
1592 1628
1593 EndTest(); 1629 EndTest();
1594 } 1630 }
1595 1631
1596 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1632 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1597 if (host_impl->active_tree()->source_frame_number() < 1) 1633 if (host_impl->active_tree()->source_frame_number() < 1)
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 // 999 should be released. 1674 // 999 should be released.
1639 EXPECT_EQ(1u, map.size()); 1675 EXPECT_EQ(1u, map.size());
1640 EXPECT_EQ(1u, map.count(555)); 1676 EXPECT_EQ(1u, map.count(555));
1641 1677
1642 EXPECT_EQ(1u, delegated_impl->Resources().size()); 1678 EXPECT_EQ(1u, delegated_impl->Resources().size());
1643 EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 1679 EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second));
1644 break; 1680 break;
1645 } 1681 }
1646 } 1682 }
1647 1683
1648 virtual void AfterTest() OVERRIDE {}
1649
1650 base::Closure receive_resource_on_thread_; 1684 base::Closure receive_resource_on_thread_;
1651 }; 1685 };
1652 1686
1653 SINGLE_AND_MULTI_THREAD_DELEGATING_RENDERER_TEST_F( 1687 SINGLE_AND_MULTI_THREAD_DELEGATING_RENDERER_TEST_F(
1654 LayerTreeHostDelegatedTestResourceSentToParent); 1688 LayerTreeHostDelegatedTestResourceSentToParent);
1655 1689
1656 class LayerTreeHostDelegatedTestCommitWithoutTake 1690 class LayerTreeHostDelegatedTestCommitWithoutTake
1657 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1691 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1658 public: 1692 public:
1659 virtual void BeginTest() OVERRIDE { 1693 virtual void BeginTest() OVERRIDE {
1660 // Prevent drawing with resources that are sent to the grandparent. 1694 // Prevent drawing with resources that are sent to the grandparent.
1661 layer_tree_host()->SetViewportSize(gfx::Size()); 1695 layer_tree_host()->SetViewportSize(gfx::Size());
1662 PostSetNeedsCommitToMainThread(); 1696 PostSetNeedsCommitToMainThread();
1663 } 1697 }
1664 1698
1665 virtual void DidCommit() OVERRIDE { 1699 virtual void DidCommit() OVERRIDE {
1666 scoped_ptr<DelegatedFrameData> frame; 1700 scoped_ptr<DelegatedFrameData> frame;
1667 ReturnedResourceArray resources; 1701 ReturnedResourceArray resources;
1668 1702
1669 int next_source_frame_number = layer_tree_host()->source_frame_number(); 1703 int next_source_frame_number = layer_tree_host()->source_frame_number();
1670 switch (next_source_frame_number) { 1704 switch (next_source_frame_number) {
1671 case 1: 1705 case 1:
1672 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1706 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1673 AddTextureQuad(frame.get(), 999); 1707 AddTextureQuad(frame.get(), 999);
1674 AddTransferableResource(frame.get(), 999); 1708 AddTransferableResource(frame.get(), 999);
1675 AddTextureQuad(frame.get(), 555); 1709 AddTextureQuad(frame.get(), 555);
1676 AddTransferableResource(frame.get(), 555); 1710 AddTransferableResource(frame.get(), 555);
1677 AddTextureQuad(frame.get(), 444); 1711 AddTextureQuad(frame.get(), 444);
1678 AddTransferableResource(frame.get(), 444); 1712 AddTransferableResource(frame.get(), 444);
1679 delegated_->SetFrameData(frame.Pass()); 1713 SetFrameData(frame.Pass());
1680 break; 1714 break;
1681 case 2: 1715 case 2:
1682 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1716 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1683 EXPECT_EQ(0u, resources.size()); 1717 EXPECT_EQ(0u, resources.size());
1684 EXPECT_FALSE(TestAndResetAvailable()); 1718 EXPECT_FALSE(TestAndResetAvailable());
1685 1719
1686 // Stop using 999 and 444 in this frame and commit. 1720 // Stop using 999 and 444 in this frame and commit.
1687 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1721 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1688 AddTextureQuad(frame.get(), 555); 1722 AddTextureQuad(frame.get(), 555);
1689 AddTransferableResource(frame.get(), 555); 1723 AddTransferableResource(frame.get(), 555);
1690 delegated_->SetFrameData(frame.Pass()); 1724 SetFrameData(frame.Pass());
1691 // 999 and 444 will be returned for frame 1, but not 555 since it's in 1725 // 999 and 444 will be returned for frame 1, but not 555 since it's in
1692 // the current frame. 1726 // the current frame.
1693 break; 1727 break;
1694 case 3: 1728 case 3:
1695 // Don't take resources here, but set a new frame that uses 999 again. 1729 // Don't take resources here, but set a new frame that uses 999 again.
1696 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1730 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1697 AddTextureQuad(frame.get(), 999); 1731 AddTextureQuad(frame.get(), 999);
1698 AddTransferableResource(frame.get(), 999); 1732 AddTransferableResource(frame.get(), 999);
1699 AddTextureQuad(frame.get(), 555); 1733 AddTextureQuad(frame.get(), 555);
1700 AddTransferableResource(frame.get(), 555); 1734 AddTransferableResource(frame.get(), 555);
1701 delegated_->SetFrameData(frame.Pass()); 1735 SetFrameData(frame.Pass());
1702 break; 1736 break;
1703 case 4: 1737 case 4:
1704 // 555 from frame 1 and 2 isn't returned since it's still in use. 999 1738 // 555 from frame 1 and 2 isn't returned since it's still in use. 999
1705 // from frame 1 is returned though. 1739 // from frame 1 is returned though.
1706 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1740 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1707 { 1741 {
1708 unsigned expected[] = {444, 999}; 1742 unsigned expected[] = {444, 999};
1709 EXPECT_RESOURCES(expected, resources); 1743 EXPECT_RESOURCES(expected, resources);
1710 EXPECT_TRUE(TestAndResetAvailable()); 1744 EXPECT_TRUE(TestAndResetAvailable());
1711 } 1745 }
1712 1746
1713 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1747 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1714 delegated_->SetFrameData(frame.Pass()); 1748 SetFrameData(frame.Pass());
1715 // 555 will be returned 3 times for frames 1 2 and 3, and 999 will be 1749 // 555 will be returned 3 times for frames 1 2 and 3, and 999 will be
1716 // returned once for frame 3. 1750 // returned once for frame 3.
1717 break; 1751 break;
1718 case 5: 1752 case 5:
1719 delegated_->TakeUnusedResourcesForChildCompositor(&resources); 1753 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1720 { 1754 {
1721 unsigned expected[] = {555, 555, 555, 999}; 1755 unsigned expected[] = {555, 555, 555, 999};
1722 EXPECT_RESOURCES(expected, resources); 1756 EXPECT_RESOURCES(expected, resources);
1723 EXPECT_TRUE(TestAndResetAvailable()); 1757 EXPECT_TRUE(TestAndResetAvailable());
1724 } 1758 }
1725 1759
1726 EndTest(); 1760 EndTest();
1727 break; 1761 break;
1728 } 1762 }
1729 } 1763 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 case 3: 1796 case 3:
1763 EXPECT_EQ(2u, map.size()); 1797 EXPECT_EQ(2u, map.size());
1764 EXPECT_EQ(1u, map.count(999)); 1798 EXPECT_EQ(1u, map.count(999));
1765 EXPECT_EQ(1u, map.count(555)); 1799 EXPECT_EQ(1u, map.count(555));
1766 1800
1767 EXPECT_EQ(2u, delegated_impl->Resources().size()); 1801 EXPECT_EQ(2u, delegated_impl->Resources().size());
1768 EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 1802 EXPECT_EQ(1u, delegated_impl->Resources().count(999));
1769 EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 1803 EXPECT_EQ(1u, delegated_impl->Resources().count(555));
1770 } 1804 }
1771 } 1805 }
1772
1773 virtual void AfterTest() OVERRIDE {}
1774 }; 1806 };
1775 1807
1776 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake); 1808 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake);
1777 1809
1778 class DelegatedFrameIsActivatedDuringCommit 1810 class DelegatedFrameIsActivatedDuringCommit
1779 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1811 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1780 protected: 1812 protected:
1781 DelegatedFrameIsActivatedDuringCommit() 1813 DelegatedFrameIsActivatedDuringCommit()
1782 : wait_thread_("WAIT"), 1814 : wait_thread_("WAIT"),
1783 wait_event_(false, false) { 1815 wait_event_(false, false) {
1784 wait_thread_.Start(); 1816 wait_thread_.Start();
1785 } 1817 }
1786 1818
1787 virtual void BeginTest() OVERRIDE { 1819 virtual void BeginTest() OVERRIDE {
1788 activate_count_ = 0; 1820 activate_count_ = 0;
1789 1821
1790 scoped_ptr<DelegatedFrameData> frame = 1822 scoped_ptr<DelegatedFrameData> frame =
1791 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1823 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1792 AddTextureQuad(frame.get(), 999); 1824 AddTextureQuad(frame.get(), 999);
1793 AddTransferableResource(frame.get(), 999); 1825 AddTransferableResource(frame.get(), 999);
1794 delegated_->SetFrameData(frame.Pass()); 1826 SetFrameData(frame.Pass());
1795 1827
1796 PostSetNeedsCommitToMainThread(); 1828 PostSetNeedsCommitToMainThread();
1797 } 1829 }
1798 1830
1799 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1831 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1800 // Slow down activation so the main thread DidCommit() will run if 1832 // Slow down activation so the main thread DidCommit() will run if
1801 // not blocked. 1833 // not blocked.
1802 wait_thread_.message_loop()->PostDelayedTask( 1834 wait_thread_.message_loop()->PostDelayedTask(
1803 FROM_HERE, 1835 FROM_HERE,
1804 base::Bind(&base::WaitableEvent::Signal, 1836 base::Bind(&base::WaitableEvent::Signal,
(...skipping 17 matching lines...) Expand all
1822 void DidActivate() { 1854 void DidActivate() {
1823 base::AutoLock lock(activate_lock_); 1855 base::AutoLock lock(activate_lock_);
1824 switch (activate_count_) { 1856 switch (activate_count_) {
1825 case 1: { 1857 case 1: {
1826 // The first frame has been activated. Set a new frame, and 1858 // The first frame has been activated. Set a new frame, and
1827 // expect the next commit to finish *after* it is activated. 1859 // expect the next commit to finish *after* it is activated.
1828 scoped_ptr<DelegatedFrameData> frame = 1860 scoped_ptr<DelegatedFrameData> frame =
1829 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1861 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1830 AddTextureQuad(frame.get(), 555); 1862 AddTextureQuad(frame.get(), 555);
1831 AddTransferableResource(frame.get(), 555); 1863 AddTransferableResource(frame.get(), 555);
1832 delegated_->SetFrameData(frame.Pass()); 1864 SetFrameData(frame.Pass());
1833 // So this commit number should complete after the second activate. 1865 // So this commit number should complete after the second activate.
1834 EXPECT_EQ(1, layer_tree_host()->source_frame_number()); 1866 EXPECT_EQ(1, layer_tree_host()->source_frame_number());
1835 break; 1867 break;
1836 } 1868 }
1837 case 2: 1869 case 2:
1838 // The second frame has been activated. Remove the layer from 1870 // The second frame has been activated. Remove the layer from
1839 // the tree to cause another commit/activation. The commit should 1871 // the tree to cause another commit/activation. The commit should
1840 // finish *after* the layer is removed from the active tree. 1872 // finish *after* the layer is removed from the active tree.
1841 delegated_->RemoveFromParent(); 1873 delegated_->RemoveFromParent();
1842 // So this commit number should complete after the third activate. 1874 // So this commit number should complete after the third activate.
(...skipping 10 matching lines...) Expand all
1853 case 2: { 1885 case 2: {
1854 // The activate for the 2nd frame should have happened before now. 1886 // The activate for the 2nd frame should have happened before now.
1855 base::AutoLock lock(activate_lock_); 1887 base::AutoLock lock(activate_lock_);
1856 EXPECT_EQ(2, activate_count_); 1888 EXPECT_EQ(2, activate_count_);
1857 break; 1889 break;
1858 } 1890 }
1859 case 3: { 1891 case 3: {
1860 // The activate to remove the layer should have happened before now. 1892 // The activate to remove the layer should have happened before now.
1861 base::AutoLock lock(activate_lock_); 1893 base::AutoLock lock(activate_lock_);
1862 EXPECT_EQ(3, activate_count_); 1894 EXPECT_EQ(3, activate_count_);
1895
1896 scoped_ptr<DelegatedFrameData> frame =
1897 CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1898 SetFrameData(frame.Pass());
1899
1900 ReturnedResourceArray resources;
1901 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1902 {
1903 unsigned expected[] = {999, 555};
1904 EXPECT_RESOURCES(expected, resources);
1905 EXPECT_TRUE(TestAndResetAvailable());
1906 }
1863 break; 1907 break;
1864 } 1908 }
1865 } 1909 }
1866 } 1910 }
1867 1911
1868
1869 virtual void AfterTest() OVERRIDE {}
1870
1871 base::Thread wait_thread_; 1912 base::Thread wait_thread_;
1872 base::WaitableEvent wait_event_; 1913 base::WaitableEvent wait_event_;
1873 base::Lock activate_lock_; 1914 base::Lock activate_lock_;
1874 int activate_count_; 1915 int activate_count_;
1875 }; 1916 };
1876 1917
1877 SINGLE_AND_MULTI_THREAD_TEST_F( 1918 SINGLE_AND_MULTI_THREAD_TEST_F(
1878 DelegatedFrameIsActivatedDuringCommit); 1919 DelegatedFrameIsActivatedDuringCommit);
1879 1920
1921 class LayerTreeHostDelegatedTestTwoImplLayers
1922 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1923 public:
1924 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1925
1926 virtual void DidCommitAndDrawFrame() OVERRIDE {
1927 scoped_ptr<DelegatedFrameData> frame;
1928 ReturnedResourceArray resources;
1929
1930 int next_source_frame_number = layer_tree_host()->source_frame_number();
1931 switch (next_source_frame_number) {
1932 case 1:
1933 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1934 AddTextureQuad(frame.get(), 999);
1935 AddTransferableResource(frame.get(), 999);
1936 AddTextureQuad(frame.get(), 555);
1937 AddTransferableResource(frame.get(), 555);
1938 SetFrameData(frame.Pass());
1939 break;
1940 case 2:
1941 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1942 EXPECT_EQ(0u, resources.size());
1943 EXPECT_FALSE(TestAndResetAvailable());
1944
1945 // Remove the delegated layer and replace it with a new one. Use the
1946 // same frame and resources for it.
1947 delegated_->RemoveFromParent();
1948 delegated_ = CreateDelegatedLayer(frame_provider_.get());
1949 break;
1950 case 3:
1951 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1952 EXPECT_EQ(0u, resources.size());
1953 EXPECT_FALSE(TestAndResetAvailable());
1954
1955 // Use a frame with no resources in it.
1956 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1957 SetFrameData(frame.Pass());
1958 break;
1959 case 4:
1960 // We gave one frame to the frame provider, so we should get one
1961 // ref back for each resource.
1962 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1963 {
1964 unsigned expected[] = {555, 999};
1965 EXPECT_RESOURCES(expected, resources);
1966 EXPECT_TRUE(TestAndResetAvailable());
1967 }
1968 EndTest();
1969 break;
1970 }
1971 }
1972
1973 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1974 bool result) OVERRIDE {
1975 ReturnUnusedResourcesFromParent(host_impl);
1976 }
1977 };
1978
1979 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoImplLayers);
1980
1981 class LayerTreeHostDelegatedTestTwoImplLayersTwoFrames
1982 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1983 public:
1984 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1985
1986 virtual void DidCommitAndDrawFrame() OVERRIDE {
1987 scoped_ptr<DelegatedFrameData> frame;
1988 ReturnedResourceArray resources;
1989
1990 int next_source_frame_number = layer_tree_host()->source_frame_number();
1991 switch (next_source_frame_number) {
1992 case 1:
1993 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1994 AddTextureQuad(frame.get(), 999);
1995 AddTransferableResource(frame.get(), 999);
1996 AddTextureQuad(frame.get(), 555);
1997 AddTransferableResource(frame.get(), 555);
1998 SetFrameData(frame.Pass());
1999 break;
2000 case 2:
2001 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2002 EXPECT_EQ(0u, resources.size());
2003 EXPECT_FALSE(TestAndResetAvailable());
2004
2005 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
2006 AddTextureQuad(frame.get(), 999);
2007 AddTransferableResource(frame.get(), 999);
2008 AddTextureQuad(frame.get(), 555);
2009 AddTransferableResource(frame.get(), 555);
2010
2011 // Remove the delegated layer and replace it with a new one. Make a new
2012 // frame but with the same resources for it.
2013 delegated_->RemoveFromParent();
2014 delegated_ = NULL;
2015
2016 frame_provider_->SetFrameData(frame.Pass());
2017 delegated_ = CreateDelegatedLayer(frame_provider_.get());
2018 break;
2019 case 3:
2020 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2021 EXPECT_EQ(0u, resources.size());
2022 EXPECT_FALSE(TestAndResetAvailable());
2023
2024 // Use a frame with no resources in it.
2025 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
2026 SetFrameData(frame.Pass());
2027 break;
2028 case 4:
2029 // We gave two frames to the frame provider, so we should get two
2030 // refs back for each resource.
2031 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2032 {
2033 unsigned expected[] = {555, 555, 999, 999};
2034 EXPECT_RESOURCES(expected, resources);
2035 EXPECT_TRUE(TestAndResetAvailable());
2036 }
2037 EndTest();
2038 break;
2039 }
2040 }
2041
2042 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
2043 bool result) OVERRIDE {
2044 ReturnUnusedResourcesFromParent(host_impl);
2045 }
2046 };
2047
2048 SINGLE_AND_MULTI_THREAD_TEST_F(
2049 LayerTreeHostDelegatedTestTwoImplLayersTwoFrames);
2050
2051 class LayerTreeHostDelegatedTestTwoLayers
2052 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
2053 public:
2054 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2055
2056 virtual void DidCommitAndDrawFrame() OVERRIDE {
2057 scoped_ptr<DelegatedFrameData> frame;
2058 ReturnedResourceArray resources;
2059
2060 int next_source_frame_number = layer_tree_host()->source_frame_number();
2061 switch (next_source_frame_number) {
2062 case 1:
2063 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
2064 AddTextureQuad(frame.get(), 999);
2065 AddTransferableResource(frame.get(), 999);
2066 AddTextureQuad(frame.get(), 555);
2067 AddTransferableResource(frame.get(), 555);
2068
2069 // Create a DelegatedRendererLayer using the frame.
2070 SetFrameData(frame.Pass());
2071 break;
2072 case 2:
2073 // Create a second DelegatedRendererLayer using the same frame provider.
2074 delegated_thief_ = CreateDelegatedLayer(frame_provider_.get());
2075 root_->AddChild(delegated_thief_);
2076
2077 // And drop our ref on the frame provider so only the layers keep it
2078 // alive.
2079 frame_provider_ = NULL;
2080 break;
2081 case 3:
2082 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2083 EXPECT_EQ(0u, resources.size());
2084 EXPECT_FALSE(TestAndResetAvailable());
2085
2086 // Remove one delegated layer from the tree. No resources should be
2087 // returned yet.
2088 delegated_->RemoveFromParent();
2089 break;
2090 case 4:
2091 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2092 EXPECT_EQ(0u, resources.size());
2093 EXPECT_FALSE(TestAndResetAvailable());
2094
2095 // Put the first layer back, and remove the other layer and destroy it.
2096 // No resources should be returned yet.
2097 root_->AddChild(delegated_);
2098 delegated_thief_->RemoveFromParent();
2099 delegated_thief_ = NULL;
2100 break;
2101 case 5:
2102 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2103 EXPECT_EQ(0u, resources.size());
2104 EXPECT_FALSE(TestAndResetAvailable());
2105
2106 // Remove the first layer from the tree again. The resources are still
2107 // held by the main thread layer.
2108 delegated_->RemoveFromParent();
2109 break;
2110 case 6:
2111 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2112 EXPECT_EQ(0u, resources.size());
2113 EXPECT_FALSE(TestAndResetAvailable());
2114
2115 // Destroy the layer and the resources should be returned immediately.
2116 delegated_ = NULL;
2117
2118 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2119 {
2120 unsigned expected[] = {555, 999};
2121 EXPECT_RESOURCES(expected, resources);
2122 EXPECT_TRUE(TestAndResetAvailable());
2123 }
2124 EndTest();
2125 break;
2126 }
2127 }
2128
2129 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
2130 bool result) OVERRIDE {
2131 ReturnUnusedResourcesFromParent(host_impl);
2132 }
2133
2134 scoped_refptr<DelegatedRendererLayer> delegated_thief_;
2135 };
2136
2137 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoLayers);
2138
2139 class LayerTreeHostDelegatedTestRemoveAndAddToTree
2140 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
2141 public:
2142 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2143
2144 virtual void DidCommitAndDrawFrame() OVERRIDE {
2145 scoped_ptr<DelegatedFrameData> frame;
2146 ReturnedResourceArray resources;
2147
2148 int next_source_frame_number = layer_tree_host()->source_frame_number();
2149 switch (next_source_frame_number) {
2150 case 1:
2151 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
2152 AddTextureQuad(frame.get(), 999);
2153 AddTransferableResource(frame.get(), 999);
2154 AddTextureQuad(frame.get(), 555);
2155 AddTransferableResource(frame.get(), 555);
2156
2157 // Create a DelegatedRendererLayer using the frame.
2158 SetFrameData(frame.Pass());
2159 break;
2160 case 2:
2161 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2162 EXPECT_EQ(0u, resources.size());
2163 EXPECT_FALSE(TestAndResetAvailable());
2164
2165 // Remove the layer from the tree. The resources should not be returned
2166 // since they are still on the main thread layer.
2167 delegated_->RemoveFromParent();
2168 break;
2169 case 3:
2170 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2171 EXPECT_EQ(0u, resources.size());
2172 EXPECT_FALSE(TestAndResetAvailable());
2173
2174 // Add the layer back to the tree.
2175 layer_tree_host()->root_layer()->AddChild(delegated_);
2176 break;
2177 case 4:
2178 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2179 EXPECT_EQ(0u, resources.size());
2180 EXPECT_FALSE(TestAndResetAvailable());
2181
2182 // Set a new frame. Resources should be returned.
2183 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
2184 AddTextureQuad(frame.get(), 888);
2185 AddTransferableResource(frame.get(), 888);
2186 AddTextureQuad(frame.get(), 777);
2187 AddTransferableResource(frame.get(), 777);
2188 SetFrameData(frame.Pass());
2189 break;
2190 case 5:
2191 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2192 {
2193 unsigned expected[] = {555, 999};
2194 EXPECT_RESOURCES(expected, resources);
2195 EXPECT_TRUE(TestAndResetAvailable());
2196 }
2197
2198 // Destroy the layer.
2199 delegated_->RemoveFromParent();
2200 delegated_ = NULL;
2201 break;
2202 case 6:
2203 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2204 EXPECT_EQ(0u, resources.size());
2205 EXPECT_FALSE(TestAndResetAvailable());
2206
2207 // Destroy the frame provider. Resources should be returned.
2208 frame_provider_ = NULL;
2209
2210 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2211 {
2212 unsigned expected[] = {777, 888};
2213 EXPECT_RESOURCES(expected, resources);
2214 EXPECT_TRUE(TestAndResetAvailable());
2215 }
2216 EndTest();
2217 break;
2218 }
2219 }
2220
2221 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
2222 bool result) OVERRIDE {
2223 ReturnUnusedResourcesFromParent(host_impl);
2224 }
2225
2226 scoped_refptr<DelegatedRendererLayer> delegated_thief_;
2227 };
2228
2229 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemoveAndAddToTree);
2230
2231 class LayerTreeHostDelegatedTestRemoveAndChangeResources
2232 : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
2233 public:
2234 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
2235
2236 virtual void DidCommitAndDrawFrame() OVERRIDE {
2237 scoped_ptr<DelegatedFrameData> frame;
2238 ReturnedResourceArray resources;
2239
2240 int next_source_frame_number = layer_tree_host()->source_frame_number();
2241 switch (next_source_frame_number) {
2242 case 1:
2243 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
2244 AddTextureQuad(frame.get(), 999);
2245 AddTransferableResource(frame.get(), 999);
2246 AddTextureQuad(frame.get(), 555);
2247 AddTransferableResource(frame.get(), 555);
2248
2249 // Create a DelegatedRendererLayer using the frame.
2250 SetFrameData(frame.Pass());
2251 break;
2252 case 2:
2253 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2254 EXPECT_EQ(0u, resources.size());
2255 EXPECT_FALSE(TestAndResetAvailable());
2256
2257 // Remove the layer from the tree. The resources should not be returned
2258 // since they are still on the main thread layer.
2259 delegated_->RemoveFromParent();
2260 break;
2261 case 3:
2262 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2263 EXPECT_EQ(0u, resources.size());
2264 EXPECT_FALSE(TestAndResetAvailable());
2265
2266 // Set a new frame. Resources should be returned immediately.
2267 frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
2268 AddTextureQuad(frame.get(), 888);
2269 AddTransferableResource(frame.get(), 888);
2270 AddTextureQuad(frame.get(), 777);
2271 AddTransferableResource(frame.get(), 777);
2272 SetFrameData(frame.Pass());
2273
2274 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2275 {
2276 unsigned expected[] = {555, 999};
2277 EXPECT_RESOURCES(expected, resources);
2278 EXPECT_TRUE(TestAndResetAvailable());
2279 resources.clear();
2280 }
2281
2282 // Destroy the frame provider.
2283 frame_provider_ = NULL;
2284
2285 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2286 EXPECT_EQ(0u, resources.size());
2287 EXPECT_FALSE(TestAndResetAvailable());
2288
2289 // Destroy the layer. Resources should be returned.
2290 delegated_ = NULL;
2291
2292 resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
2293 {
2294 unsigned expected[] = {777, 888};
2295 EXPECT_RESOURCES(expected, resources);
2296 EXPECT_TRUE(TestAndResetAvailable());
2297 }
2298 EndTest();
2299 break;
2300 }
2301 }
2302
2303 virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
2304 bool result) OVERRIDE {
2305 ReturnUnusedResourcesFromParent(host_impl);
2306 }
2307
2308 scoped_refptr<DelegatedRendererLayer> delegated_thief_;
2309 };
2310
2311 SINGLE_AND_MULTI_THREAD_TEST_F(
2312 LayerTreeHostDelegatedTestRemoveAndChangeResources);
2313
1880 } // namespace 2314 } // namespace
1881 } // namespace cc 2315 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_unittest_context.cc ('k') | content/browser/renderer_host/render_widget_host_view_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698