| Index: cc/resources/resource_pool_unittest.cc
|
| diff --git a/cc/resources/resource_pool_unittest.cc b/cc/resources/resource_pool_unittest.cc
|
| index f55c9b379be766af1fb253eae21a0761b3cccac3..bde9d748b7e9f72218312ed9aa494b668bd4192e 100644
|
| --- a/cc/resources/resource_pool_unittest.cc
|
| +++ b/cc/resources/resource_pool_unittest.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "cc/resources/resource_pool.h"
|
|
|
| +#include "base/run_loop.h"
|
| +#include "base/thread_task_runner_handle.h"
|
| #include "cc/resources/resource_util.h"
|
| #include "cc/resources/scoped_resource.h"
|
| #include "cc/test/fake_output_surface.h"
|
| @@ -23,8 +25,9 @@ class ResourcePoolTest : public testing::Test {
|
| shared_bitmap_manager_.reset(new TestSharedBitmapManager());
|
| resource_provider_ = FakeResourceProvider::Create(
|
| output_surface_.get(), shared_bitmap_manager_.get());
|
| - resource_pool_ =
|
| - ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D);
|
| + task_runner_ = base::ThreadTaskRunnerHandle::Get();
|
| + resource_pool_ = ResourcePool::Create(resource_provider_.get(),
|
| + task_runner_.get(), GL_TEXTURE_2D);
|
| }
|
|
|
| protected:
|
| @@ -32,6 +35,7 @@ class ResourcePoolTest : public testing::Test {
|
| scoped_ptr<FakeOutputSurface> output_surface_;
|
| scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
|
| scoped_ptr<ResourceProvider> resource_provider_;
|
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
| scoped_ptr<ResourcePool> resource_pool_;
|
| };
|
|
|
| @@ -50,7 +54,7 @@ TEST_F(ResourcePoolTest, AccountingSingleResource) {
|
| // Limits high enough to not be hit by this test.
|
| size_t bytes_limit = 10 * 1024 * 1024;
|
| size_t count_limit = 100;
|
| - resource_pool_->SetResourceUsageLimits(bytes_limit, bytes_limit, count_limit);
|
| + resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
|
|
|
| gfx::Size size(100, 100);
|
| ResourceFormat format = RGBA_8888;
|
| @@ -58,38 +62,38 @@ TEST_F(ResourcePoolTest, AccountingSingleResource) {
|
| ResourceUtil::UncheckedSizeInBytes<size_t>(size, format);
|
| Resource* resource = resource_pool_->AcquireResource(size, format);
|
|
|
| - EXPECT_EQ(resource_bytes, resource_pool_->total_memory_usage_bytes());
|
| - EXPECT_EQ(resource_bytes, resource_pool_->acquired_memory_usage_bytes());
|
| - EXPECT_EQ(1u, resource_pool_->total_resource_count());
|
| - EXPECT_EQ(1u, resource_pool_->acquired_resource_count());
|
| - EXPECT_EQ(0u, resource_pool_->busy_resource_count());
|
| + EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(resource_bytes, resource_pool_->memory_usage_bytes());
|
| + EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
|
| + EXPECT_EQ(1u, resource_pool_->resource_count());
|
| + EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
|
|
|
| resource_pool_->ReleaseResource(resource, 0u);
|
| - EXPECT_EQ(resource_bytes, resource_pool_->total_memory_usage_bytes());
|
| - EXPECT_EQ(1u, resource_pool_->total_resource_count());
|
| - EXPECT_EQ(1u, resource_pool_->busy_resource_count());
|
| + EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
|
| + EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());
|
|
|
| resource_pool_->CheckBusyResources();
|
| - EXPECT_EQ(resource_bytes, resource_pool_->total_memory_usage_bytes());
|
| - EXPECT_EQ(0u, resource_pool_->acquired_memory_usage_bytes());
|
| - EXPECT_EQ(1u, resource_pool_->total_resource_count());
|
| - EXPECT_EQ(0u, resource_pool_->acquired_resource_count());
|
| - EXPECT_EQ(0u, resource_pool_->busy_resource_count());
|
| + EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(0u, resource_pool_->memory_usage_bytes());
|
| + EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
|
| + EXPECT_EQ(0u, resource_pool_->resource_count());
|
| + EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
|
|
|
| - resource_pool_->SetResourceUsageLimits(0u, 0u, 0u);
|
| + resource_pool_->SetResourceUsageLimits(0u, 0u);
|
| resource_pool_->ReduceResourceUsage();
|
| - EXPECT_EQ(0u, resource_pool_->total_memory_usage_bytes());
|
| - EXPECT_EQ(0u, resource_pool_->acquired_memory_usage_bytes());
|
| - EXPECT_EQ(0u, resource_pool_->total_resource_count());
|
| - EXPECT_EQ(0u, resource_pool_->acquired_resource_count());
|
| - EXPECT_EQ(0u, resource_pool_->busy_resource_count());
|
| + EXPECT_EQ(0u, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(0u, resource_pool_->memory_usage_bytes());
|
| + EXPECT_EQ(0u, resource_pool_->GetTotalResourceCountForTesting());
|
| + EXPECT_EQ(0u, resource_pool_->resource_count());
|
| + EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
|
| }
|
|
|
| TEST_F(ResourcePoolTest, SimpleResourceReuse) {
|
| // Limits high enough to not be hit by this test.
|
| size_t bytes_limit = 10 * 1024 * 1024;
|
| size_t count_limit = 100;
|
| - resource_pool_->SetResourceUsageLimits(bytes_limit, bytes_limit, count_limit);
|
| + resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
|
|
|
| gfx::Size size(100, 100);
|
| ResourceFormat format = RGBA_8888;
|
| @@ -118,7 +122,7 @@ TEST_F(ResourcePoolTest, LostResource) {
|
| // Limits high enough to not be hit by this test.
|
| size_t bytes_limit = 10 * 1024 * 1024;
|
| size_t count_limit = 100;
|
| - resource_pool_->SetResourceUsageLimits(bytes_limit, bytes_limit, count_limit);
|
| + resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
|
|
|
| gfx::Size size(100, 100);
|
| ResourceFormat format = RGBA_8888;
|
| @@ -132,5 +136,87 @@ TEST_F(ResourcePoolTest, LostResource) {
|
| EXPECT_EQ(0u, resource_provider_->num_resources());
|
| }
|
|
|
| +TEST_F(ResourcePoolTest, BusyResourcesEventuallyFreed) {
|
| + // Limits high enough to not be hit by this test.
|
| + size_t bytes_limit = 10 * 1024 * 1024;
|
| + size_t count_limit = 100;
|
| + resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
|
| +
|
| + // Set a quick resource expiration delay so that this test doesn't take long
|
| + // to run.
|
| + resource_pool_->SetResourceExpirationDelayForTesting(
|
| + base::TimeDelta::FromMilliseconds(10));
|
| +
|
| + gfx::Size size(100, 100);
|
| + ResourceFormat format = RGBA_8888;
|
| +
|
| + Resource* resource = resource_pool_->AcquireResource(size, format);
|
| + EXPECT_EQ(1u, resource_provider_->num_resources());
|
| + EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(1u, resource_pool_->resource_count());
|
| +
|
| + resource_pool_->ReleaseResource(resource, 0u);
|
| + EXPECT_EQ(1u, resource_provider_->num_resources());
|
| + EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(0u, resource_pool_->memory_usage_bytes());
|
| + EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());
|
| +
|
| + // Wait for our resource pool to evict resources. We expect resources to be
|
| + // released within 10 ms, give the thread up to 200.
|
| + base::RunLoop run_loop;
|
| + task_runner_->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(),
|
| + base::TimeDelta::FromMillisecondsD(200));
|
| + run_loop.Run();
|
| +
|
| + EXPECT_EQ(0u, resource_provider_->num_resources());
|
| + EXPECT_EQ(0u, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(0u, resource_pool_->memory_usage_bytes());
|
| +}
|
| +
|
| +TEST_F(ResourcePoolTest, UnusedResourcesEventuallyFreed) {
|
| + // Limits high enough to not be hit by this test.
|
| + size_t bytes_limit = 10 * 1024 * 1024;
|
| + size_t count_limit = 100;
|
| + resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
|
| +
|
| + // Set a quick resource expiration delay so that this test doesn't take long
|
| + // to run.
|
| + resource_pool_->SetResourceExpirationDelayForTesting(
|
| + base::TimeDelta::FromMilliseconds(100));
|
| +
|
| + gfx::Size size(100, 100);
|
| + ResourceFormat format = RGBA_8888;
|
| +
|
| + Resource* resource = resource_pool_->AcquireResource(size, format);
|
| + EXPECT_EQ(1u, resource_provider_->num_resources());
|
| + EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
|
| + EXPECT_EQ(1u, resource_pool_->resource_count());
|
| +
|
| + resource_pool_->ReleaseResource(resource, 0u);
|
| + EXPECT_EQ(1u, resource_provider_->num_resources());
|
| + EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
|
| + EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting());
|
| +
|
| + // Transfer the resource from the busy pool to the unused pool.
|
| + resource_pool_->CheckBusyResources();
|
| + EXPECT_EQ(1u, resource_provider_->num_resources());
|
| + EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting());
|
| + EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting());
|
| + EXPECT_EQ(0u, resource_pool_->resource_count());
|
| + EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting());
|
| +
|
| + // Wait for our resource pool to evict resources. We expect resources to be
|
| + // released within 100 ms, give the thread up to 200.
|
| + base::RunLoop run_loop;
|
| + task_runner_->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(),
|
| + base::TimeDelta::FromMillisecondsD(200));
|
| + run_loop.Run();
|
| +
|
| + EXPECT_EQ(0u, resource_provider_->num_resources());
|
| + EXPECT_EQ(0u, resource_pool_->GetTotalMemoryUsageForTesting());
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|