WebKit Roll 139512:139548
[chromium-blink-merge.git] / cc / resource_pool.cc
blobd82f62f3abd0b58a7358b17f34c5971338810145
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"
9 namespace cc {
11 ResourcePool::Resource::Resource(cc::ResourceProvider* resource_provider,
12 const gfx::Size& size,
13 GLenum format)
14 : cc::Resource(resource_provider->createResource(
15 size,
16 format,
17 ResourceProvider::TextureUsageAny),
18 size,
19 format),
20 resource_provider_(resource_provider) {
21 DCHECK(id());
24 ResourcePool::Resource::~Resource() {
25 DCHECK(id());
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)
47 continue;
48 if (resource->format() != format)
49 continue;
51 resources_.erase(it);
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();
66 return;
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_)
77 break;
78 Resource* resource = resources_.front();
79 resources_.pop_front();
80 memory_usage_bytes_ -= resource->bytes();
81 delete resource;
85 } // namespace cc