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