Index: cc/resources/resource_pool_unittest.cc |
diff --git a/cc/resources/resource_pool_unittest.cc b/cc/resources/resource_pool_unittest.cc |
index aa8e853e0c4f9caa95eda9cd1c30e7fc374f6002..3c516e554369facfd81fb9f2d04e5a5d8d9cb6c0 100644 |
--- a/cc/resources/resource_pool_unittest.cc |
+++ b/cc/resources/resource_pool_unittest.cc |
@@ -29,10 +29,16 @@ class ResourcePoolTest : public testing::Test { |
resource_pool_ = |
ResourcePool::Create(resource_provider_.get(), task_runner_.get(), |
ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- ResourcePool::kDefaultExpirationDelay); |
+ ResourcePool::kDefaultExpirationDelay, false); |
} |
protected: |
+ void CheckAndReturnResource(Resource* resource) { |
+ EXPECT_NE(nullptr, resource); |
+ resource_pool_->ReleaseResource(resource); |
+ resource_pool_->CheckBusyResources(); |
+ } |
+ |
scoped_refptr<TestContextProvider> context_provider_; |
std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; |
std::unique_ptr<ResourceProvider> resource_provider_; |
@@ -105,32 +111,28 @@ TEST_F(ResourcePoolTest, SimpleResourceReuse) { |
gfx::ColorSpace color_space1; |
gfx::ColorSpace color_space2 = gfx::ColorSpace::CreateSRGB(); |
- Resource* resource = |
- resource_pool_->AcquireResource(size, format, color_space1); |
- resource_pool_->ReleaseResource(resource); |
- resource_pool_->CheckBusyResources(); |
+ CheckAndReturnResource( |
+ resource_pool_->AcquireResource(size, format, color_space1)); |
EXPECT_EQ(1u, resource_provider_->num_resources()); |
// Same size/format should re-use resource. |
- resource = resource_pool_->AcquireResource(size, format, color_space1); |
+ Resource* resource = |
+ resource_pool_->AcquireResource(size, format, color_space1); |
EXPECT_EQ(1u, resource_provider_->num_resources()); |
- resource_pool_->ReleaseResource(resource); |
- resource_pool_->CheckBusyResources(); |
+ CheckAndReturnResource(resource); |
EXPECT_EQ(1u, resource_provider_->num_resources()); |
// Different size/format should allocate new resource. |
resource = resource_pool_->AcquireResource(gfx::Size(50, 50), LUMINANCE_8, |
color_space1); |
EXPECT_EQ(2u, resource_provider_->num_resources()); |
- resource_pool_->ReleaseResource(resource); |
- resource_pool_->CheckBusyResources(); |
+ CheckAndReturnResource(resource); |
EXPECT_EQ(2u, resource_provider_->num_resources()); |
// Different color space should allocate new resource. |
resource = resource_pool_->AcquireResource(size, format, color_space2); |
EXPECT_EQ(3u, resource_provider_->num_resources()); |
- resource_pool_->ReleaseResource(resource); |
- resource_pool_->CheckBusyResources(); |
+ CheckAndReturnResource(resource); |
EXPECT_EQ(3u, resource_provider_->num_resources()); |
} |
@@ -160,7 +162,7 @@ TEST_F(ResourcePoolTest, BusyResourcesEventuallyFreed) { |
resource_pool_ = |
ResourcePool::Create(resource_provider_.get(), task_runner_.get(), |
ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- base::TimeDelta::FromMilliseconds(10)); |
+ base::TimeDelta::FromMilliseconds(10), false); |
// Limits high enough to not be hit by this test. |
size_t bytes_limit = 10 * 1024 * 1024; |
@@ -201,7 +203,7 @@ TEST_F(ResourcePoolTest, UnusedResourcesEventuallyFreed) { |
resource_pool_ = |
ResourcePool::Create(resource_provider_.get(), task_runner_.get(), |
ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- base::TimeDelta::FromMilliseconds(100)); |
+ base::TimeDelta::FromMilliseconds(100), false); |
// Limits high enough to not be hit by this test. |
size_t bytes_limit = 10 * 1024 * 1024; |
@@ -317,25 +319,47 @@ TEST_F(ResourcePoolTest, ReuseResource) { |
ResourceFormat format = RGBA_8888; |
gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); |
- // Create unused resources with sizes close to 100, 100. |
- resource_pool_->ReleaseResource( |
- resource_pool_->CreateResource(gfx::Size(99, 100), format, color_space)); |
- resource_pool_->ReleaseResource( |
- resource_pool_->CreateResource(gfx::Size(99, 99), format, color_space)); |
- resource_pool_->ReleaseResource( |
- resource_pool_->CreateResource(gfx::Size(100, 99), format, color_space)); |
- resource_pool_->ReleaseResource( |
- resource_pool_->CreateResource(gfx::Size(101, 101), format, color_space)); |
- resource_pool_->CheckBusyResources(); |
- |
- gfx::Size size(100, 100); |
- Resource* resource = resource_pool_->ReuseResource(size, format, color_space); |
- EXPECT_EQ(nullptr, resource); |
- size = gfx::Size(100, 99); |
- resource = resource_pool_->ReuseResource(size, format, color_space); |
- EXPECT_NE(nullptr, resource); |
- ASSERT_EQ(nullptr, resource_pool_->ReuseResource(size, format, color_space)); |
- resource_pool_->ReleaseResource(resource); |
+ // Create unused resource with size 100x100. |
+ CheckAndReturnResource( |
+ resource_pool_->CreateResource(gfx::Size(100, 100), format, color_space)); |
+ |
+ // Try some cases that are too large, none should succeed. |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(101, 100), format, |
+ color_space)); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 101), format, |
+ color_space)); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(90, 120), format, |
+ color_space)); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(120, 120), format, |
+ color_space)); |
+ |
+ // Try some cases that are more than 2x smaller than 100x100 in area and |
+ // won't be re-used. |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(49, 100), format, |
+ color_space)); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 49), format, |
+ color_space)); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(50, 50), format, |
+ color_space)); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(70, 70), format, |
+ color_space)); |
+ |
+ // Try some cases that are smaller than 100x100, but within 2x area. Reuse |
+ // should succeed. |
+ CheckAndReturnResource( |
+ resource_pool_->ReuseResource(gfx::Size(50, 100), format, color_space)); |
+ CheckAndReturnResource( |
+ resource_pool_->ReuseResource(gfx::Size(100, 50), format, color_space)); |
+ CheckAndReturnResource( |
+ resource_pool_->ReuseResource(gfx::Size(71, 71), format, color_space)); |
+ |
+ // 100x100 is an exact match and should succeed. A subsequent request for |
+ // the same size should fail (the resource is already in use). |
+ Resource* resource = |
+ resource_pool_->ReuseResource(gfx::Size(100, 100), format, color_space); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 100), format, |
+ color_space)); |
+ CheckAndReturnResource(resource); |
} |
TEST_F(ResourcePoolTest, MemoryStateSuspended) { |
@@ -380,7 +404,7 @@ TEST_F(ResourcePoolTest, TextureHintRespected) { |
resource_pool_ = |
ResourcePool::Create(resource_provider_.get(), task_runner_.get(), |
ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
- base::TimeDelta::FromMilliseconds(100)); |
+ base::TimeDelta::FromMilliseconds(100), false); |
Resource* resource = |
resource_pool_->AcquireResource(size, format, color_space); |
EXPECT_TRUE(resource_provider_->IsImmutable(resource->id())); |
@@ -389,10 +413,41 @@ TEST_F(ResourcePoolTest, TextureHintRespected) { |
resource_pool_ = |
ResourcePool::Create(resource_provider_.get(), task_runner_.get(), |
ResourceProvider::TEXTURE_HINT_DEFAULT, |
- base::TimeDelta::FromMilliseconds(100)); |
+ base::TimeDelta::FromMilliseconds(100), false); |
resource = resource_pool_->AcquireResource(size, format, color_space); |
EXPECT_FALSE(resource_provider_->IsImmutable(resource->id())); |
resource_pool_->ReleaseResource(resource); |
} |
+TEST_F(ResourcePoolTest, ExactRequestsRespected) { |
+ ResourceFormat format = RGBA_8888; |
+ gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); |
+ |
+ resource_pool_ = |
+ ResourcePool::Create(resource_provider_.get(), task_runner_.get(), |
+ ResourceProvider::TEXTURE_HINT_DEFAULT, |
+ base::TimeDelta::FromMilliseconds(100), true); |
+ |
+ // Create unused resource with size 100x100. |
+ CheckAndReturnResource( |
+ resource_pool_->CreateResource(gfx::Size(100, 100), format, color_space)); |
+ |
+ // Try some cases that are smaller than 100x100, but within 2x area which |
+ // would typically allow reuse. Reuse should fail due to the . |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(50, 100), format, |
+ color_space)); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 50), format, |
+ color_space)); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(71, 71), format, |
+ color_space)); |
+ |
+ // 100x100 is an exact match and should succeed. A subsequent request for |
+ // the same size should fail (the resource is already in use). |
+ Resource* resource = |
+ resource_pool_->ReuseResource(gfx::Size(100, 100), format, color_space); |
+ EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 100), format, |
+ color_space)); |
+ CheckAndReturnResource(resource); |
+} |
+ |
} // namespace cc |