1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/resource_pool.h"
7 #include "cc/resource_provider.h"
11 ResourcePool::Resource::Resource(cc::ResourceProvider
* resource_provider
,
12 const gfx::Size
& size
,
14 : cc::Resource(resource_provider
->createResource(
17 ResourceProvider::TextureUsageAny
),
20 resource_provider_(resource_provider
) {
24 ResourcePool::Resource::~Resource() {
26 DCHECK(resource_provider_
);
27 resource_provider_
->deleteResource(id());
30 ResourcePool::ResourcePool(ResourceProvider
* resource_provider
)
31 : resource_provider_(resource_provider
),
32 max_memory_usage_bytes_(0),
33 memory_usage_bytes_(0) {
36 ResourcePool::~ResourcePool() {
37 SetMaxMemoryUsageBytes(0);
40 scoped_ptr
<ResourcePool::Resource
> ResourcePool::AcquireResource(
41 const gfx::Size
& size
, GLenum format
) {
42 for (ResourceList::iterator it
= resources_
.begin();
43 it
!= resources_
.end(); ++it
) {
44 Resource
* resource
= *it
;
46 if (resource
->size() != size
)
48 if (resource
->format() != format
)
52 return make_scoped_ptr(resource
);
55 // Create new resource.
56 Resource
* resource
= new Resource(
57 resource_provider_
, size
, format
);
58 memory_usage_bytes_
+= resource
->bytes();
59 return make_scoped_ptr(resource
);
62 void ResourcePool::ReleaseResource(
63 scoped_ptr
<ResourcePool::Resource
> resource
) {
64 if (memory_usage_bytes_
> max_memory_usage_bytes_
) {
65 memory_usage_bytes_
-= resource
->bytes();
69 resources_
.push_back(resource
.release());
72 void ResourcePool::SetMaxMemoryUsageBytes(size_t max_memory_usage_bytes
) {
73 max_memory_usage_bytes_
= max_memory_usage_bytes
;
75 while (!resources_
.empty()) {
76 if (memory_usage_bytes_
<= max_memory_usage_bytes_
)
78 Resource
* resource
= resources_
.front();
79 resources_
.pop_front();
80 memory_usage_bytes_
-= resource
->bytes();