12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_RESOURCES_RESOURCE_POOL_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_RESOURCES_RESOURCE_POOL_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/renderer.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "cc/resources/resource_format.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class ScopedResource; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT ResourcePool { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static scoped_ptr<ResourcePool> Create(ResourceProvider* resource_provider, 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLenum target, 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceFormat format) { 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return make_scoped_ptr(new ResourcePool(resource_provider, target, format)); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ResourcePool(); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ScopedResource> AcquireResource(const gfx::Size& size); 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ReleaseResource(scoped_ptr<ScopedResource>); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void SetResourceUsageLimits(size_t max_memory_usage_bytes, 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t max_unused_memory_usage_bytes, 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t max_resource_count); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void ReduceResourceUsage(); 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void CheckBusyResources(); 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t total_memory_usage_bytes() const { return memory_usage_bytes_; } 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) size_t acquired_memory_usage_bytes() const { 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return memory_usage_bytes_ - unused_memory_usage_bytes_; 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch size_t total_resource_count() const { return resource_count_; } 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t acquired_resource_count() const { 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return resource_count_ - unused_resources_.size(); 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ResourceFormat resource_format() const { return format_; } 49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourcePool(ResourceProvider* resource_provider, 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLenum target, 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceFormat format); 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool ResourceUsageTooHigh(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void DidFinishUsingResource(ScopedResource* resource); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider* resource_provider_; 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GLenum target_; 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ResourceFormat format_; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t max_memory_usage_bytes_; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t max_unused_memory_usage_bytes_; 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t max_resource_count_; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t memory_usage_bytes_; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t unused_memory_usage_bytes_; 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t resource_count_; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typedef std::list<ScopedResource*> ResourceList; 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResourceList unused_resources_; 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceList busy_resources_; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ResourcePool); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_RESOURCES_RESOURCE_POOL_H_ 80