OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/resources/resource_pool.h" | 5 #include "cc/resources/resource_pool.h" |
6 | 6 |
7 #include "cc/resources/resource_provider.h" | 7 #include "cc/resources/resource_provider.h" |
8 | 8 |
9 namespace cc { | 9 namespace cc { |
10 | 10 |
11 ResourcePool::Resource::Resource(cc::ResourceProvider* resource_provider, | 11 ResourcePool::Resource::Resource(cc::ResourceProvider* resource_provider, |
12 gfx::Size size, | 12 gfx::Size size, |
| 13 GLenum target, |
13 ResourceFormat format) | 14 ResourceFormat format) |
14 : cc::Resource(resource_provider->CreateManagedResource( | 15 : cc::Resource(resource_provider->CreateManagedResource( |
15 size, | 16 size, |
| 17 target, |
16 GL_CLAMP_TO_EDGE, | 18 GL_CLAMP_TO_EDGE, |
17 ResourceProvider::TextureUsageAny, | 19 ResourceProvider::TextureUsageAny, |
18 format), | 20 format), |
19 size, | 21 size, |
20 format), | 22 format), |
21 resource_provider_(resource_provider) { | 23 resource_provider_(resource_provider) { |
22 DCHECK(id()); | 24 DCHECK(id()); |
23 } | 25 } |
24 | 26 |
25 ResourcePool::Resource::~Resource() { | 27 ResourcePool::Resource::~Resource() { |
26 DCHECK(id()); | 28 DCHECK(id()); |
27 DCHECK(resource_provider_); | 29 DCHECK(resource_provider_); |
28 resource_provider_->DeleteResource(id()); | 30 resource_provider_->DeleteResource(id()); |
29 } | 31 } |
30 | 32 |
31 ResourcePool::ResourcePool(ResourceProvider* resource_provider) | 33 ResourcePool::ResourcePool(ResourceProvider* resource_provider, |
| 34 GLenum target, |
| 35 ResourceFormat format) |
32 : resource_provider_(resource_provider), | 36 : resource_provider_(resource_provider), |
| 37 target_(target), |
| 38 format_(format), |
33 max_memory_usage_bytes_(0), | 39 max_memory_usage_bytes_(0), |
34 max_unused_memory_usage_bytes_(0), | 40 max_unused_memory_usage_bytes_(0), |
35 max_resource_count_(0), | 41 max_resource_count_(0), |
36 memory_usage_bytes_(0), | 42 memory_usage_bytes_(0), |
37 unused_memory_usage_bytes_(0), | 43 unused_memory_usage_bytes_(0), |
38 resource_count_(0) { | 44 resource_count_(0) { |
39 } | 45 } |
40 | 46 |
41 ResourcePool::~ResourcePool() { | 47 ResourcePool::~ResourcePool() { |
42 while (!busy_resources_.empty()) { | 48 while (!busy_resources_.empty()) { |
43 DidFinishUsingResource(busy_resources_.front()); | 49 DidFinishUsingResource(busy_resources_.front()); |
44 busy_resources_.pop_front(); | 50 busy_resources_.pop_front(); |
45 } | 51 } |
46 | 52 |
47 SetResourceUsageLimits(0, 0, 0); | 53 SetResourceUsageLimits(0, 0, 0); |
48 DCHECK_EQ(0u, unused_resources_.size()); | 54 DCHECK_EQ(0u, unused_resources_.size()); |
49 DCHECK_EQ(0u, memory_usage_bytes_); | 55 DCHECK_EQ(0u, memory_usage_bytes_); |
50 DCHECK_EQ(0u, unused_memory_usage_bytes_); | 56 DCHECK_EQ(0u, unused_memory_usage_bytes_); |
51 DCHECK_EQ(0u, resource_count_); | 57 DCHECK_EQ(0u, resource_count_); |
52 } | 58 } |
53 | 59 |
54 scoped_ptr<ResourcePool::Resource> ResourcePool::AcquireResource( | 60 scoped_ptr<ResourcePool::Resource> ResourcePool::AcquireResource( |
55 gfx::Size size, ResourceFormat format) { | 61 gfx::Size size) { |
56 for (ResourceList::iterator it = unused_resources_.begin(); | 62 for (ResourceList::iterator it = unused_resources_.begin(); |
57 it != unused_resources_.end(); ++it) { | 63 it != unused_resources_.end(); ++it) { |
58 Resource* resource = *it; | 64 Resource* resource = *it; |
59 DCHECK(resource_provider_->CanLockForWrite(resource->id())); | 65 DCHECK(resource_provider_->CanLockForWrite(resource->id())); |
60 | 66 |
61 if (resource->size() != size) | 67 if (resource->size() != size) |
62 continue; | 68 continue; |
63 if (resource->format() != format) | |
64 continue; | |
65 | 69 |
66 unused_resources_.erase(it); | 70 unused_resources_.erase(it); |
67 unused_memory_usage_bytes_ -= resource->bytes(); | 71 unused_memory_usage_bytes_ -= resource->bytes(); |
68 return make_scoped_ptr(resource); | 72 return make_scoped_ptr(resource); |
69 } | 73 } |
70 | 74 |
71 // Create new resource. | 75 // Create new resource. |
72 Resource* resource = new Resource(resource_provider_, size, format); | 76 Resource* resource = new Resource( |
| 77 resource_provider_, size, target_, format_); |
73 | 78 |
74 // Extend all read locks on all resources until the resource is | 79 // Extend all read locks on all resources until the resource is |
75 // finished being used, such that we know when resources are | 80 // finished being used, such that we know when resources are |
76 // truly safe to recycle. | 81 // truly safe to recycle. |
77 resource_provider_->EnableReadLockFences(resource->id(), true); | 82 resource_provider_->EnableReadLockFences(resource->id(), true); |
78 | 83 |
79 memory_usage_bytes_ += resource->bytes(); | 84 memory_usage_bytes_ += resource->bytes(); |
80 ++resource_count_; | 85 ++resource_count_; |
81 return make_scoped_ptr(resource); | 86 return make_scoped_ptr(resource); |
82 } | 87 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 } | 147 } |
143 } | 148 } |
144 } | 149 } |
145 | 150 |
146 void ResourcePool::DidFinishUsingResource(ResourcePool::Resource* resource) { | 151 void ResourcePool::DidFinishUsingResource(ResourcePool::Resource* resource) { |
147 unused_memory_usage_bytes_ += resource->bytes(); | 152 unused_memory_usage_bytes_ += resource->bytes(); |
148 unused_resources_.push_back(resource); | 153 unused_resources_.push_back(resource); |
149 } | 154 } |
150 | 155 |
151 } // namespace cc | 156 } // namespace cc |
OLD | NEW |