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

Unified 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: nits 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 side-by-side diff with in-line comments
Download patch
Index: cc/trees/layer_tree_host_unittest_delegated.cc
diff --git a/cc/trees/layer_tree_host_unittest_delegated.cc b/cc/trees/layer_tree_host_unittest_delegated.cc
index 79c615d2318f941a4281d077f7cf77161baeee6b..b6980ff1ef756385dce5254e45b231b88d9640a4 100644
--- a/cc/trees/layer_tree_host_unittest_delegated.cc
+++ b/cc/trees/layer_tree_host_unittest_delegated.cc
@@ -11,6 +11,8 @@
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread.h"
#include "base/time/time.h"
+#include "cc/layers/delegated_frame_provider.h"
+#include "cc/layers/delegated_frame_resource_collection.h"
#include "cc/layers/delegated_renderer_layer.h"
#include "cc/layers/delegated_renderer_layer_client.h"
#include "cc/layers/delegated_renderer_layer_impl.h"
@@ -188,12 +190,6 @@ class LayerTreeHostDelegatedTest : public LayerTreeTest {
frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>());
}
- scoped_ptr<DelegatedFrameData> CreateEmptyFrameData() {
- scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
- return frame.Pass();
- }
-
-
static ResourceProvider::ResourceId AppendResourceId(
std::vector<ResourceProvider::ResourceId>* resources_in_last_sent_frame,
ResourceProvider::ResourceId resource_id) {
@@ -208,13 +204,9 @@ class LayerTreeHostDelegatedTest : public LayerTreeTest {
return;
std::vector<ResourceProvider::ResourceId> resources_in_last_sent_frame;
- for (size_t i = 0; i < delegated_frame_data->render_pass_list.size(); ++i) {
- RenderPass* pass = delegated_frame_data->render_pass_list.at(i);
- for (size_t j = 0; j < pass->quad_list.size(); ++j) {
- DrawQuad* quad = pass->quad_list[j];
- quad->IterateResources(base::Bind(&AppendResourceId,
- &resources_in_last_sent_frame));
- }
+ for (size_t i = 0; i < delegated_frame_data->resource_list.size(); ++i) {
+ resources_in_last_sent_frame.push_back(
+ delegated_frame_data->resource_list[i].id);
}
std::vector<ResourceProvider::ResourceId> resources_to_return;
@@ -245,21 +237,19 @@ class LayerTreeHostDelegatedTest : public LayerTreeTest {
class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
: public LayerTreeHostDelegatedTest,
- public DelegatedRendererLayerClient {
+ public DelegatedRendererLayerClient,
+ public DelegatedFrameResourceCollectionClient {
public:
- LayerTreeHostDelegatedTestCaseSingleDelegatedLayer() : available_(false) {}
+ LayerTreeHostDelegatedTestCaseSingleDelegatedLayer()
+ : resource_collection_(
+ make_scoped_ptr(new DelegatedFrameResourceCollection(this))),
+ available_(false) {}
virtual void SetupTree() OVERRIDE {
root_ = Layer::Create();
root_->SetAnchorPoint(gfx::PointF());
root_->SetBounds(gfx::Size(10, 10));
- delegated_ = FakeDelegatedRendererLayer::Create(this);
- delegated_->SetAnchorPoint(gfx::PointF());
- delegated_->SetBounds(gfx::Size(10, 10));
- delegated_->SetIsDrawable(true);
-
- root_->AddChild(delegated_);
layer_tree_host()->SetRootLayer(root_);
LayerTreeHostDelegatedTest::SetupTree();
}
@@ -268,10 +258,42 @@ class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
PostSetNeedsCommitToMainThread();
}
+ void SetFrameData(scoped_ptr<DelegatedFrameData> frame_data) {
+ RenderPass* root_pass = frame_data->render_pass_list.back();
+ gfx::Size frame_size = root_pass->output_rect.size();
+
+ if (frame_provider_ && frame_size == frame_provider_->frame_size()) {
+ frame_provider_->SetFrameData(frame_data.Pass());
+ return;
+ }
+
+ if (delegated_.get()) {
+ delegated_->RemoveFromParent();
+ delegated_ = NULL;
+ frame_provider_.reset();
+ }
+
+ frame_provider_ = make_scoped_ptr(new DelegatedFrameProvider(
+ resource_collection_.get(), frame_data.Pass()));
+
+ CreateDelegatedLayer(frame_provider_.get());
+ }
+
+ void CreateDelegatedLayer(DelegatedFrameProvider* frame_provider) {
+ delegated_ = FakeDelegatedRendererLayer::Create(this, frame_provider);
+ delegated_->SetAnchorPoint(gfx::PointF());
+ delegated_->SetBounds(gfx::Size(10, 10));
+ delegated_->SetIsDrawable(true);
+
+ root_->AddChild(delegated_);
+ }
+
virtual void AfterTest() OVERRIDE {}
// DelegatedRendererLayerClient implementation.
virtual void DidCommitFrameData() OVERRIDE {}
+
+ // DelegatedFrameProviderClient implementation.
virtual void UnusedResourcesAreAvailable() OVERRIDE { available_ = true; }
bool TestAndResetAvailable() {
@@ -281,6 +303,8 @@ class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
}
protected:
+ scoped_ptr<DelegatedFrameResourceCollection> resource_collection_;
+ scoped_ptr<DelegatedFrameProvider> frame_provider_;
scoped_refptr<Layer> root_;
scoped_refptr<DelegatedRendererLayer> delegated_;
bool available_;
@@ -302,8 +326,7 @@ class LayerTreeHostDelegatedTestClientDidCommitCallback
}
virtual void BeginTest() OVERRIDE {
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1),
- gfx::Rect(0, 0, 1, 1)));
+ SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
PostSetNeedsCommitToMainThread();
}
@@ -329,11 +352,13 @@ class LayerTreeHostDelegatedTestCreateChildId
virtual void DidCommit() OVERRIDE {
if (TestEnded())
return;
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1),
- gfx::Rect(0, 0, 1, 1)));
+ SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
}
virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
+ if (host_impl->active_tree()->source_frame_number() < 1)
+ return;
+
LayerImpl* root_impl = host_impl->active_tree()->root_layer();
FakeDelegatedRendererLayerImpl* delegated_impl =
static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
@@ -391,7 +416,7 @@ class LayerTreeHostDelegatedTestOffscreenContext_NoFilters
scoped_ptr<DelegatedFrameData> frame =
CreateFrameData(gfx::Rect(0, 0, 1, 1),
gfx::Rect(0, 0, 1, 1));
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
PostSetNeedsCommitToMainThread();
}
@@ -423,7 +448,7 @@ class LayerTreeHostDelegatedTestOffscreenContext_Filters
gfx::Rect(0, 0, 1, 1),
filters,
FilterOperations());
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
PostSetNeedsCommitToMainThread();
}
@@ -456,7 +481,7 @@ class LayerTreeHostDelegatedTestOffscreenContext_BackgroundFilters
gfx::Rect(0, 0, 1, 1),
FilterOperations(),
filters);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
PostSetNeedsCommitToMainThread();
}
@@ -477,21 +502,24 @@ class LayerTreeHostDelegatedTestOffscreenContext_Filters_AddedToTree
: public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
protected:
virtual void BeginTest() OVERRIDE {
- scoped_ptr<DelegatedFrameData> frame =
- CreateFrameData(gfx::Rect(0, 0, 1, 1),
- gfx::Rect(0, 0, 1, 1));
+ scoped_ptr<DelegatedFrameData> frame_no_filters =
+ CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
+
+ scoped_ptr<DelegatedFrameData> frame_with_filters =
+ CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
FilterOperations filters;
filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
- AddRenderPass(frame.get(),
+ AddRenderPass(frame_with_filters.get(),
RenderPass::Id(2, 1),
gfx::Rect(0, 0, 1, 1),
gfx::Rect(0, 0, 1, 1),
filters,
FilterOperations());
+ SetFrameData(frame_no_filters.Pass());
delegated_->RemoveFromParent();
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame_with_filters.Pass());
layer_tree_host()->root_layer()->AddChild(delegated_);
PostSetNeedsCommitToMainThread();
@@ -522,100 +550,96 @@ class LayerTreeHostDelegatedTestLayerUsesFrameDamage
case 1:
// The first time the layer gets a frame the whole layer should be
// damaged.
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1),
- gfx::Rect(0, 0, 1, 1)));
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
break;
case 2:
+ // A different frame size will damage the whole layer.
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(0, 0, 0, 0)));
+ break;
+ case 3:
// Should create a total amount of gfx::Rect(2, 2, 10, 6) damage.
// The frame size is 20x20 while the layer is 10x10, so this should
// produce a gfx::Rect(1, 1, 5, 3) damage rect.
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20),
- gfx::Rect(2, 2, 5, 5)));
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20),
- gfx::Rect(7, 2, 5, 6)));
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(2, 2, 5, 5)));
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(7, 2, 5, 6)));
break;
- case 3:
+ case 4:
// Should create zero damage.
layer_tree_host()->SetNeedsCommit();
break;
- case 4:
+ case 5:
// Should damage the full viewport.
delegated_->SetBounds(gfx::Size(2, 2));
break;
- case 5:
+ case 6:
// Should create zero damage.
layer_tree_host()->SetNeedsCommit();
break;
- case 6:
- // Should damage the full layer.
+ case 7:
+ // Should damage the full layer, tho the frame size is not changing.
delegated_->SetBounds(gfx::Size(6, 6));
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5),
- gfx::Rect(1, 1, 2, 2)));
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(1, 1, 2, 2)));
break;
- case 7:
+ case 8:
// Should create zero damage.
layer_tree_host()->SetNeedsCommit();
break;
- case 8:
+ case 9:
// Should damage the full layer.
delegated_->SetDisplaySize(gfx::Size(10, 10));
break;
- case 9:
+ case 10:
// Should create zero damage.
layer_tree_host()->SetNeedsCommit();
break;
- case 10:
- // Setting an empty frame should damage the whole layer the
- // first time.
- delegated_->SetFrameData(CreateEmptyFrameData());
- break;
case 11:
- // Setting an empty frame shouldn't damage anything after the
- // first time.
- delegated_->SetFrameData(CreateEmptyFrameData());
+ // Changing the frame size damages the full layer.
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(4, 4, 1, 1)));
break;
case 12:
- // Having valid content to display agains should damage the whole layer.
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 10, 10),
- gfx::Rect(5, 5, 1, 1)));
- break;
- case 13:
// An invalid frame isn't used, so it should not cause damage.
- delegated_->SetFrameData(CreateInvalidFrameData(gfx::Rect(0, 0, 10, 10),
- gfx::Rect(5, 5, 1, 1)));
+ SetFrameData(CreateInvalidFrameData(gfx::Rect(0, 0, 5, 5),
+ gfx::Rect(4, 4, 1, 1)));
break;
- case 14:
+ case 13:
// Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is
// 5x5 and the display size is now set to 10x10, so this should result
// in a gfx::Rect(2, 2, 4, 4) damage rect.
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5),
- gfx::Rect(1, 1, 2, 2)));
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
break;
- case 15:
+ case 14:
// Should create zero damage.
layer_tree_host()->SetNeedsCommit();
break;
- case 16:
+ case 15:
// Moving the layer out of the tree and back in will damage the whole
// impl layer.
delegated_->RemoveFromParent();
layer_tree_host()->root_layer()->AddChild(delegated_);
break;
- case 17:
+ case 16:
// Make a larger frame with lots of damage. Then a frame smaller than
// the first frame's damage. The entire layer should be damaged, but
// nothing more.
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 10, 10),
- gfx::Rect(0, 0, 10, 10)));
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5),
- gfx::Rect(1, 1, 2, 2)));
- break;
- case 18:
- // Make a frame with lots of damage. Then replace it with an empty
- // frame. The entire layer should be damaged, but nothing more.
- delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 10, 10),
- gfx::Rect(0, 0, 10, 10)));
- delegated_->SetFrameData(CreateEmptyFrameData());
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
+ break;
+ case 17:
+ // Make a frame with lots of damage. Then replace it with a frame with
+ // no damage. The entire layer should be damaged, but nothing more.
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
+ SetFrameData(
+ CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 0, 0)));
break;
}
first_draw_for_source_frame_ = true;
@@ -648,71 +672,67 @@ class LayerTreeHostDelegatedTestLayerUsesFrameDamage
damage_rect.ToString());
break;
case 2:
- EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
damage_rect.ToString());
break;
case 3:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(),
damage_rect.ToString());
break;
case 4:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 5:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
damage_rect.ToString());
break;
case 6:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 7:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
damage_rect.ToString());
break;
case 8:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 9:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
damage_rect.ToString());
break;
case 10:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 11:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
damage_rect.ToString());
break;
case 12:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 13:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(),
damage_rect.ToString());
break;
case 14:
- EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 15:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
damage_rect.ToString());
break;
case 16:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
damage_rect.ToString());
break;
case 17:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
- damage_rect.ToString());
- break;
- case 18:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
damage_rect.ToString());
EndTest();
break;
@@ -738,7 +758,7 @@ class LayerTreeHostDelegatedTestMergeResources
CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame1.get(), 999);
AddTransferableResource(frame1.get(), 999);
- delegated_->SetFrameData(frame1.Pass());
+ SetFrameData(frame1.Pass());
// The second frame uses resource 999 still, but also adds 555.
scoped_ptr<DelegatedFrameData> frame2 =
@@ -747,12 +767,13 @@ class LayerTreeHostDelegatedTestMergeResources
AddTransferableResource(frame2.get(), 999);
AddTextureQuad(frame2.get(), 555);
AddTransferableResource(frame2.get(), 555);
- delegated_->SetFrameData(frame2.Pass());
+ SetFrameData(frame2.Pass());
// The resource 999 from frame1 is returned since it is still on the main
// thread.
ReturnedResourceArray returned_resources;
- delegated_->TakeUnusedResourcesForChildCompositor(&returned_resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(
+ &returned_resources);
{
unsigned expected[] = {999};
EXPECT_RESOURCES(expected, returned_resources);
@@ -799,7 +820,7 @@ class LayerTreeHostDelegatedTestRemapResourcesInQuads
AddTransferableResource(frame.get(), 999);
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
PostSetNeedsCommitToMainThread();
}
@@ -859,11 +880,11 @@ class LayerTreeHostDelegatedTestReturnUnusedResources
AddTransferableResource(frame.get(), 999);
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 2:
// All of the resources are in use.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -873,11 +894,11 @@ class LayerTreeHostDelegatedTestReturnUnusedResources
AddTransferableResource(frame.get(), 999);
AddTextureQuad(frame.get(), 444);
AddTransferableResource(frame.get(), 444);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 3:
// 555 is no longer in use.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {555};
EXPECT_RESOURCES(expected, resources);
@@ -886,7 +907,7 @@ class LayerTreeHostDelegatedTestReturnUnusedResources
// Stop using any resources.
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 4:
// Postpone collecting resources for a frame. They should still be there
@@ -896,7 +917,7 @@ class LayerTreeHostDelegatedTestReturnUnusedResources
case 5:
// 444 and 999 are no longer in use. We sent two refs to 999, so we
// should get two back.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {444, 999, 999};
EXPECT_RESOURCES(expected, resources);
@@ -908,7 +929,8 @@ class LayerTreeHostDelegatedTestReturnUnusedResources
// Resources are never immediately released.
ReturnedResourceArray empty_resources;
- delegated_->TakeUnusedResourcesForChildCompositor(&empty_resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(
+ &empty_resources);
EXPECT_EQ(0u, empty_resources.size());
EXPECT_FALSE(TestAndResetAvailable());
}
@@ -946,11 +968,11 @@ class LayerTreeHostDelegatedTestReusedResources
AddTransferableResource(frame.get(), 555);
AddTextureQuad(frame.get(), 444);
AddTransferableResource(frame.get(), 444);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 2:
// All of the resources are in use.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -958,10 +980,10 @@ class LayerTreeHostDelegatedTestReusedResources
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame.get(), 999);
AddTransferableResource(frame.get(), 999);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
// Resource are not immediately released.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -971,12 +993,12 @@ class LayerTreeHostDelegatedTestReusedResources
AddTransferableResource(frame.get(), 555);
AddTextureQuad(frame.get(), 444);
AddTransferableResource(frame.get(), 444);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 3:
// The 999 resource is the only unused one. Two references were sent, so
// two should be returned.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {999, 999};
EXPECT_RESOURCES(expected, resources);
@@ -1019,11 +1041,11 @@ class LayerTreeHostDelegatedTestFrameBeforeAck
AddTransferableResource(frame.get(), 555);
AddTextureQuad(frame.get(), 444);
AddTransferableResource(frame.get(), 444);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 2:
// All of the resources are in use.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -1031,17 +1053,17 @@ class LayerTreeHostDelegatedTestFrameBeforeAck
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame.get(), 999);
AddTransferableResource(frame.get(), 999);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
// Resource are not immediately released.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
// The parent compositor (this one) does a commit.
break;
case 3:
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {444, 555};
EXPECT_RESOURCES(expected, resources);
@@ -1054,7 +1076,7 @@ class LayerTreeHostDelegatedTestFrameBeforeAck
AddTextureQuad(frame.get(), 999);
AddTextureQuad(frame.get(), 555);
AddTextureQuad(frame.get(), 444);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
}
}
@@ -1121,11 +1143,11 @@ class LayerTreeHostDelegatedTestFrameBeforeTakeResources
AddTransferableResource(frame.get(), 555);
AddTextureQuad(frame.get(), 444);
AddTransferableResource(frame.get(), 444);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 2:
// All of the resources are in use.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -1133,10 +1155,10 @@ class LayerTreeHostDelegatedTestFrameBeforeTakeResources
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame.get(), 999);
AddTransferableResource(frame.get(), 999);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
// Resource are not immediately released.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -1153,11 +1175,11 @@ class LayerTreeHostDelegatedTestFrameBeforeTakeResources
AddTransferableResource(frame.get(), 555);
AddTextureQuad(frame.get(), 444);
AddTransferableResource(frame.get(), 444);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
// The resources are used by the new frame but are returned anyway since
// we passed them again.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {444, 555};
EXPECT_RESOURCES(expected, resources);
@@ -1165,7 +1187,7 @@ class LayerTreeHostDelegatedTestFrameBeforeTakeResources
}
break;
case 4:
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
EndTest();
@@ -1241,11 +1263,11 @@ class LayerTreeHostDelegatedTestBadFrame
AddTransferableResource(frame.get(), 999);
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 2:
// All of the resources are in use.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -1259,13 +1281,13 @@ class LayerTreeHostDelegatedTestBadFrame
AddTextureQuad(frame.get(), 444);
AddTransferableResource(frame.get(), 444);
AddTextureQuad(frame.get(), 775);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
// The parent compositor (this one) does a commit.
break;
case 3:
// The bad frame's resource is given back to the child compositor.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {444};
EXPECT_RESOURCES(expected, resources);
@@ -1275,11 +1297,11 @@ class LayerTreeHostDelegatedTestBadFrame
// Now send a good frame with 999 again.
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame.get(), 999);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 4:
// The unused 555 from the last good frame is now released.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {555};
EXPECT_RESOURCES(expected, resources);
@@ -1392,11 +1414,11 @@ class LayerTreeHostDelegatedTestUnnamedResource
AddTransferableResource(frame.get(), 999);
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 2:
// The unused resource should be returned.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {999};
EXPECT_RESOURCES(expected, resources);
@@ -1453,18 +1475,18 @@ class LayerTreeHostDelegatedTestDontLeakResource
AddTransferableResource(frame.get(), 999);
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
// But then we immediately stop using 999.
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 2:
// The unused resources should be returned. 555 is still used, but it's
// returned once to account for the first frame.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {555, 999};
EXPECT_RESOURCES(expected, resources);
@@ -1472,12 +1494,12 @@ class LayerTreeHostDelegatedTestDontLeakResource
}
// Send a frame with no resources in it.
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 3:
// The now unused resource 555 should be returned.
resources.clear();
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {555};
EXPECT_RESOURCES(expected, resources);
@@ -1534,10 +1556,10 @@ class LayerTreeHostDelegatedTestResourceSentToParent
AddTransferableResource(frame.get(), 999);
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 2:
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -1546,11 +1568,11 @@ class LayerTreeHostDelegatedTestResourceSentToParent
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 3:
// Since 999 is in the grandparent it is not returned.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -1583,7 +1605,7 @@ class LayerTreeHostDelegatedTestResourceSentToParent
ReturnedResourceArray resources;
// 999 was returned from the grandparent and could be released.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {999};
EXPECT_RESOURCES(expected, resources);
@@ -1675,10 +1697,10 @@ class LayerTreeHostDelegatedTestCommitWithoutTake
AddTransferableResource(frame.get(), 555);
AddTextureQuad(frame.get(), 444);
AddTransferableResource(frame.get(), 444);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 2:
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
EXPECT_EQ(0u, resources.size());
EXPECT_FALSE(TestAndResetAvailable());
@@ -1686,7 +1708,7 @@ class LayerTreeHostDelegatedTestCommitWithoutTake
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
// 999 and 444 will be returned for frame 1, but not 555 since it's in
// the current frame.
break;
@@ -1697,12 +1719,12 @@ class LayerTreeHostDelegatedTestCommitWithoutTake
AddTransferableResource(frame.get(), 999);
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
break;
case 4:
// 555 from frame 1 and 2 isn't returned since it's still in use. 999
// from frame 1 is returned though.
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {444, 999};
EXPECT_RESOURCES(expected, resources);
@@ -1710,12 +1732,12 @@ class LayerTreeHostDelegatedTestCommitWithoutTake
}
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
// 555 will be returned 3 times for frames 1 2 and 3, and 999 will be
// returned once for frame 3.
break;
case 5:
- delegated_->TakeUnusedResourcesForChildCompositor(&resources);
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
{
unsigned expected[] = {555, 555, 555, 999};
EXPECT_RESOURCES(expected, resources);
@@ -1790,7 +1812,7 @@ class DelegatedFrameIsActivatedDuringCommit
CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame.get(), 999);
AddTransferableResource(frame.get(), 999);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
PostSetNeedsCommitToMainThread();
}
@@ -1828,7 +1850,7 @@ class DelegatedFrameIsActivatedDuringCommit
CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
AddTextureQuad(frame.get(), 555);
AddTransferableResource(frame.get(), 555);
- delegated_->SetFrameData(frame.Pass());
+ SetFrameData(frame.Pass());
// So this commit number should complete after the second activate.
EXPECT_EQ(1, layer_tree_host()->source_frame_number());
break;
@@ -1859,6 +1881,14 @@ class DelegatedFrameIsActivatedDuringCommit
// The activate to remove the layer should have happened before now.
base::AutoLock lock(activate_lock_);
EXPECT_EQ(3, activate_count_);
+
+ ReturnedResourceArray resources;
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
+ {
+ unsigned expected[] = {999, 555};
+ EXPECT_RESOURCES(expected, resources);
+ EXPECT_TRUE(TestAndResetAvailable());
+ }
break;
}
}
@@ -1876,5 +1906,139 @@ class DelegatedFrameIsActivatedDuringCommit
SINGLE_AND_MULTI_THREAD_TEST_F(
DelegatedFrameIsActivatedDuringCommit);
+class LayerTreeHostDelegatedTestTwoImplLayers
+ : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
+ public:
+ virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
+
+ virtual void DidCommitAndDrawFrame() OVERRIDE {
+ scoped_ptr<DelegatedFrameData> frame;
+ ReturnedResourceArray resources;
+
+ int next_source_frame_number = layer_tree_host()->source_frame_number();
+ switch (next_source_frame_number) {
+ case 1:
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
+ AddTextureQuad(frame.get(), 999);
+ AddTransferableResource(frame.get(), 999);
+ AddTextureQuad(frame.get(), 555);
+ AddTransferableResource(frame.get(), 555);
+ SetFrameData(frame.Pass());
+ break;
+ case 2:
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
+ EXPECT_EQ(0u, resources.size());
+ EXPECT_FALSE(TestAndResetAvailable());
+
+ // Remove the delegated layer and replace it with a new one. Use the
+ // same frame and resources for it.
+ delegated_->RemoveFromParent();
+ delegated_ = NULL;
+ CreateDelegatedLayer(frame_provider_.get());
+ break;
+ case 3:
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
+ EXPECT_EQ(0u, resources.size());
+ EXPECT_FALSE(TestAndResetAvailable());
+
+ // Use a frame with no resources in it.
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
+ SetFrameData(frame.Pass());
+ break;
+ case 4:
+ // We gave one frame to the frame provider, so we should get one
+ // ref back for each resource.
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
+ {
+ unsigned expected[] = {555, 999};
+ EXPECT_RESOURCES(expected, resources);
+ EXPECT_TRUE(TestAndResetAvailable());
+ }
+ EndTest();
+ break;
+ }
+ }
+
+ virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
+ bool result) OVERRIDE {
+ ReturnUnusedResourcesFromParent(host_impl);
+ }
+
+ virtual void AfterTest() OVERRIDE {}
+};
+
+SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoImplLayers);
+
+class LayerTreeHostDelegatedTestTwoImplLayersTwoFrames
+ : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
+ public:
+ virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
+
+ virtual void DidCommitAndDrawFrame() OVERRIDE {
+ scoped_ptr<DelegatedFrameData> frame;
+ ReturnedResourceArray resources;
+
+ int next_source_frame_number = layer_tree_host()->source_frame_number();
+ switch (next_source_frame_number) {
+ case 1:
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
+ AddTextureQuad(frame.get(), 999);
+ AddTransferableResource(frame.get(), 999);
+ AddTextureQuad(frame.get(), 555);
+ AddTransferableResource(frame.get(), 555);
+ SetFrameData(frame.Pass());
+ break;
+ case 2:
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
+ EXPECT_EQ(0u, resources.size());
+ EXPECT_FALSE(TestAndResetAvailable());
+
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
+ AddTextureQuad(frame.get(), 999);
+ AddTransferableResource(frame.get(), 999);
+ AddTextureQuad(frame.get(), 555);
+ AddTransferableResource(frame.get(), 555);
+
+ // Remove the delegated layer and replace it with a new one. Make a new
+ // frame but with the same resources for it.
+ delegated_->RemoveFromParent();
+ delegated_ = NULL;
+ frame_provider_->SetFrameData(frame.Pass());
+ CreateDelegatedLayer(frame_provider_.get());
+ break;
+ case 3:
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
+ EXPECT_EQ(0u, resources.size());
+ EXPECT_FALSE(TestAndResetAvailable());
+
+ // Use a frame with no resources in it.
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
+ SetFrameData(frame.Pass());
+ break;
+ case 4:
+ // We gave two frames to the frame provider, so we should get two
+ // refs back for each resource.
+ resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
+ {
+ unsigned expected[] = {555, 555, 999, 999};
+ EXPECT_RESOURCES(expected, resources);
+ EXPECT_TRUE(TestAndResetAvailable());
+ }
+ EndTest();
+ break;
+ }
+ }
+
+ virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
+ bool result) OVERRIDE {
+ ReturnUnusedResourcesFromParent(host_impl);
+ }
+
+ virtual void AfterTest() OVERRIDE {}
+};
+
+SINGLE_AND_MULTI_THREAD_TEST_F(
+ LayerTreeHostDelegatedTestTwoImplLayersTwoFrames);
piman 2013/10/04 23:42:25 Could we add one test that tries to put a layer in
danakj 2013/10/07 21:57:39 Done. The main thread needs to hold a reference, s
+
} // namespace
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698