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 d48931328afb8f4af02a324966b609af66d2031f..4693707384f834012514f97a80201edefafa07d9 100644 |
--- a/cc/trees/layer_tree_host_unittest_delegated.cc |
+++ b/cc/trees/layer_tree_host_unittest_delegated.cc |
@@ -4,6 +4,8 @@ |
#include "cc/trees/layer_tree_host.h" |
+#include <algorithm> |
+ |
#include "base/bind.h" |
#include "cc/layers/delegated_renderer_layer.h" |
#include "cc/layers/delegated_renderer_layer_client.h" |
@@ -23,6 +25,34 @@ |
namespace cc { |
namespace { |
+bool TransferableResourceLower(const TransferableResource& a, |
+ const TransferableResource& b) { |
+ return a.id < b.id; |
+} |
+ |
+// Tests if the list of resources matches an expectation, modulo the order. |
+bool ResourcesMatch(TransferableResourceArray actual, |
+ unsigned* expected, |
+ size_t expected_count) { |
+ EXPECT_EQ(expected_count, actual.size()); |
+ if (expected_count != actual.size()) |
+ return false; |
+ |
+ std::sort(actual.begin(), actual.end(), TransferableResourceLower); |
+ std::sort(expected, expected + expected_count); |
+ bool result = true; |
+ for (size_t i = 0; i < expected_count; ++i) { |
+ EXPECT_EQ(actual[i].id, expected[i]); |
+ if (actual[i].id != expected[i]) |
+ result = false; |
+ } |
+ |
+ return result; |
+} |
+ |
+#define EXPECT_RESOURCES(expected, actual) \ |
+ EXPECT_TRUE(ResourcesMatch(actual, expected, arraysize(expected))); |
+ |
// These tests deal with delegated renderer layers. |
class LayerTreeHostDelegatedTest : public LayerTreeTest { |
protected: |
@@ -492,10 +522,18 @@ class LayerTreeHostDelegatedTestMergeResources |
scoped_ptr<DelegatedFrameData> frame2 = |
CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
AddTextureQuad(frame2.get(), 999); |
+ AddTransferableResource(frame2.get(), 999); |
AddTextureQuad(frame2.get(), 555); |
AddTransferableResource(frame2.get(), 555); |
delegated_->SetFrameData(frame2.Pass()); |
+ TransferableResourceArray returned_resources; |
danakj
2013/08/16 16:49:44
// The resource 999 from frame1 is returned since
piman
2013/08/16 20:43:19
Done.
|
+ delegated_->TakeUnusedResourcesForChildCompositor(&returned_resources); |
+ { |
+ unsigned expected[] = {999}; |
+ EXPECT_RESOURCES(expected, returned_resources); |
+ } |
+ |
PostSetNeedsCommitToMainThread(); |
} |
@@ -623,8 +661,10 @@ class LayerTreeHostDelegatedTestReturnUnusedResources |
case 5: |
// 555 is no longer in use. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(1u, resources.size()); |
- EXPECT_EQ(555u, resources[0].id); |
+ { |
+ unsigned expected[] = {555}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
// Stop using any resources. |
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
@@ -638,13 +678,9 @@ class LayerTreeHostDelegatedTestReturnUnusedResources |
case 7: |
// 444 and 999 are no longer in use. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(2u, resources.size()); |
- if (resources[0].id == 999) { |
- EXPECT_EQ(999u, resources[0].id); |
- EXPECT_EQ(444u, resources[1].id); |
- } else { |
- EXPECT_EQ(444u, resources[0].id); |
- EXPECT_EQ(999u, resources[1].id); |
+ { |
+ unsigned expected[] = {444, 999}; |
+ EXPECT_RESOURCES(expected, resources); |
} |
EndTest(); |
break; |
@@ -724,8 +760,10 @@ class LayerTreeHostDelegatedTestReusedResources |
case 5: |
// The 999 resource is the only unused one. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(1u, resources.size()); |
- EXPECT_EQ(999u, resources[0].id); |
+ { |
+ unsigned expected[] = {999}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
EndTest(); |
break; |
} |
@@ -793,13 +831,9 @@ class LayerTreeHostDelegatedTestFrameBeforeAck |
return; |
case 5: |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(2u, resources.size()); |
- if (resources[0].id == 555) { |
- EXPECT_EQ(555u, resources[0].id); |
- EXPECT_EQ(444u, resources[1].id); |
- } else { |
- EXPECT_EQ(444u, resources[0].id); |
- EXPECT_EQ(555u, resources[1].id); |
+ { |
+ unsigned expected[] = {444, 555}; |
+ EXPECT_RESOURCES(expected, resources); |
} |
// The child compositor sends a frame before receiving an for the |
@@ -890,6 +924,7 @@ class LayerTreeHostDelegatedTestFrameBeforeTakeResources |
// Keep using 999 but stop using 555 and 444. |
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()); |
// Resource are not immediately released. |
@@ -909,13 +944,20 @@ class LayerTreeHostDelegatedTestFrameBeforeTakeResources |
// and 444, which were just released during commit. |
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); |
AddTextureQuad(frame.get(), 444); |
+ AddTransferableResource(frame.get(), 444); |
delegated_->SetFrameData(frame.Pass()); |
- // The resources are used by the new frame so are not returned. |
+ // The resources are used by the new frame but are returned anyway since |
+ // we passed them again. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(0u, resources.size()); |
+ { |
+ unsigned expected[] = {444, 555}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
break; |
case 6: |
// Retrieve unused resources to the main thread. |
@@ -1032,8 +1074,10 @@ class LayerTreeHostDelegatedTestBadFrame |
case 5: |
// The bad frame's resource is given back to the child compositor. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(1u, resources.size()); |
- EXPECT_EQ(444u, resources[0].id); |
+ { |
+ unsigned expected[] = {444}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
// Now send a good frame with 999 again. |
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
@@ -1048,8 +1092,10 @@ class LayerTreeHostDelegatedTestBadFrame |
case 7: |
// The unused 555 from the last good frame is now released. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(1u, resources.size()); |
- EXPECT_EQ(555u, resources[0].id); |
+ { |
+ unsigned expected[] = {555}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
EndTest(); |
break; |
@@ -1169,8 +1215,10 @@ class LayerTreeHostDelegatedTestUnnamedResource |
case 2: |
// The unused resource should be returned. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(1u, resources.size()); |
- EXPECT_EQ(999u, resources[0].id); |
+ { |
+ unsigned expected[] = {999}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
EndTest(); |
break; |
@@ -1227,14 +1275,34 @@ class LayerTreeHostDelegatedTestDontLeakResource |
// 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()); |
break; |
case 2: |
- // The unused resource should be returned. |
+ // The unused resources should be returned. 555 is still used, but it's |
+ // returned once to account for the first frame. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(1u, resources.size()); |
- EXPECT_EQ(999u, resources[0].id); |
- |
+ { |
+ unsigned expected[] = {555, 999}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
+ // 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()); |
+ break; |
+ case 3: |
+ // The impl side will get back the resource at some point. |
+ // TODO(piman): The test should work without this. |
+ layer_tree_host()->SetNeedsCommit(); |
+ break; |
+ case 4: |
+ // The now unused resource 555 should be returned. |
+ resources.clear(); |
+ delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
+ { |
+ unsigned expected[] = {555}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
EndTest(); |
break; |
} |
@@ -1260,6 +1328,11 @@ class LayerTreeHostDelegatedTestDontLeakResource |
EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
} |
+ virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, |
+ bool result) OVERRIDE { |
+ ReturnUnusedResourcesFromParent(host_impl); |
+ } |
+ |
virtual void AfterTest() OVERRIDE {} |
}; |
@@ -1305,8 +1378,10 @@ class LayerTreeHostDelegatedTestResourceSentToParent |
case 4: |
// 999 was returned from the grandparent and could be released. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(1u, resources.size()); |
- EXPECT_EQ(999u, resources[0].id); |
+ { |
+ unsigned expected[] = {999}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
EndTest(); |
break; |
@@ -1404,20 +1479,40 @@ class LayerTreeHostDelegatedTestCommitWithoutTake |
// Stop using 999 and 444 in this frame and commit. |
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()); |
+ // 999 and 444 will be returned for frame 1, but not 555 since it's in |
+ // the current frame. |
break; |
case 3: |
// Don't take resources here, but set a new frame that uses 999 again. |
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); |
delegated_->SetFrameData(frame.Pass()); |
break; |
case 4: |
- // 999 and 555 are in use, but 444 should be returned now. |
+ // 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); |
+ { |
+ unsigned expected[] = {444, 999}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
+ |
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ delegated_->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); |
- EXPECT_EQ(1u, resources.size()); |
- EXPECT_EQ(444u, resources[0].id); |
+ { |
+ unsigned expected[] = {555, 555, 555, 999}; |
+ EXPECT_RESOURCES(expected, resources); |
+ } |
EndTest(); |
break; |