summaryrefslogtreecommitdiffstats
path: root/cc/resources/resource_pool.cc
diff options
context:
space:
mode:
authorjadahl@opera.com <jadahl@opera.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-06 21:30:18 +0000
committerjadahl@opera.com <jadahl@opera.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-06 21:30:18 +0000
commitb51c9ded73bbbe7f18d2490aab0318d5f75de4cd (patch)
tree39b19a675e7a06129a9e19ba9815cf047fa81374 /cc/resources/resource_pool.cc
parentc2fc0ab73b2892bb1ec2cd47c05faa76c872b826 (diff)
downloadchromium_src-b51c9ded73bbbe7f18d2490aab0318d5f75de4cd.zip
chromium_src-b51c9ded73bbbe7f18d2490aab0318d5f75de4cd.tar.gz
chromium_src-b51c9ded73bbbe7f18d2490aab0318d5f75de4cd.tar.bz2
cc: Keep track of busy resources in ResourcePool
Instead of assuming every released resource could be potentially reusable, manage a list of busy resources and a list of immediately reusable resources. A busy resource is one which can not be locked for write. Recheck busy resources before the tile manager is to schedule new tasks, in AssignGpuMemoryToTiles(). If this operation becomes too expensive, the CheckBusyResources() function should only be called if some resource(s) are returned from the parent compositor or when ResourcePool releases some resource. BUG= Review URL: https://codereview.chromium.org/43753002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@233374 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/resources/resource_pool.cc')
-rw-r--r--cc/resources/resource_pool.cc28
1 files changed, 18 insertions, 10 deletions
diff --git a/cc/resources/resource_pool.cc b/cc/resources/resource_pool.cc
index cef86de..6e367af 100644
--- a/cc/resources/resource_pool.cc
+++ b/cc/resources/resource_pool.cc
@@ -47,9 +47,8 @@ scoped_ptr<ResourcePool::Resource> ResourcePool::AcquireResource(
for (ResourceList::iterator it = unused_resources_.begin();
it != unused_resources_.end(); ++it) {
Resource* resource = *it;
+ DCHECK(resource_provider_->CanLockForWrite(resource->id()));
- if (!resource_provider_->CanLockForWrite(resource->id()))
- continue;
if (resource->size() != size)
continue;
if (resource->format() != format)
@@ -75,14 +74,7 @@ scoped_ptr<ResourcePool::Resource> ResourcePool::AcquireResource(
void ResourcePool::ReleaseResource(
scoped_ptr<ResourcePool::Resource> resource) {
- if (ResourceUsageTooHigh()) {
- memory_usage_bytes_ -= resource->bytes();
- --resource_count_;
- return;
- }
-
- unused_memory_usage_bytes_ += resource->bytes();
- unused_resources_.push_back(resource.release());
+ busy_resources_.push_back(resource.release());
}
void ResourcePool::SetResourceUsageLimits(
@@ -127,4 +119,20 @@ bool ResourcePool::ResourceUsageTooHigh() {
return false;
}
+void ResourcePool::CheckBusyResources() {
+ ResourceList::iterator it = busy_resources_.begin();
+
+ while (it != busy_resources_.end()) {
+ Resource* resource = *it;
+
+ if (resource_provider_->CanLockForWrite(resource->id())) {
+ unused_memory_usage_bytes_ += resource->bytes();
+ unused_resources_.push_back(resource);
+ it = busy_resources_.erase(it);
+ } else {
+ ++it;
+ }
+ }
+}
+
} // namespace cc