| Index: cc/prioritized_texture_manager.h
|
| diff --git a/cc/prioritized_texture_manager.h b/cc/prioritized_texture_manager.h
|
| index 638cbb270ce9b24689d5095baf174ade4f4d1a13..1b3b1edbdfbf5836775a3ba8c8135796e16b4e44 100644
|
| --- a/cc/prioritized_texture_manager.h
|
| +++ b/cc/prioritized_texture_manager.h
|
| @@ -1,3 +1,159 @@
|
| // Copyright 2012 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| +
|
| +#ifndef CCPrioritizedTextureManager_h
|
| +#define CCPrioritizedTextureManager_h
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/hash_tables.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "CCPrioritizedTexture.h"
|
| +#include "CCPriorityCalculator.h"
|
| +#include "CCTexture.h"
|
| +#include "GraphicsContext3D.h"
|
| +#include "IntRect.h"
|
| +#include "IntSize.h"
|
| +#include <wtf/ListHashSet.h>
|
| +#include <wtf/Vector.h>
|
| +
|
| +#if defined(COMPILER_GCC)
|
| +namespace BASE_HASH_NAMESPACE {
|
| +template<>
|
| +struct hash<cc::CCPrioritizedTexture*> {
|
| + size_t operator()(cc::CCPrioritizedTexture* ptr) const {
|
| + return hash<size_t>()(reinterpret_cast<size_t>(ptr));
|
| + }
|
| +};
|
| +} // namespace BASE_HASH_NAMESPACE
|
| +#endif // COMPILER
|
| +
|
| +namespace cc {
|
| +
|
| +class CCPriorityCalculator;
|
| +
|
| +class CCPrioritizedTextureManager {
|
| +public:
|
| + static scoped_ptr<CCPrioritizedTextureManager> create(size_t maxMemoryLimitBytes, int maxTextureSize, int pool)
|
| + {
|
| + return make_scoped_ptr(new CCPrioritizedTextureManager(maxMemoryLimitBytes, maxTextureSize, pool));
|
| + }
|
| + scoped_ptr<CCPrioritizedTexture> createTexture(IntSize size, GC3Denum format)
|
| + {
|
| + return make_scoped_ptr(new CCPrioritizedTexture(this, size, format));
|
| + }
|
| + ~CCPrioritizedTextureManager();
|
| +
|
| + typedef Vector<CCPrioritizedTexture::Backing*> BackingVector;
|
| +
|
| + // FIXME (http://crbug.com/137094): This 64MB default is a straggler from the
|
| + // old texture manager and is just to give us a default memory allocation before
|
| + // we get a callback from the GPU memory manager. We should probaby either:
|
| + // - wait for the callback before rendering anything instead
|
| + // - push this into the GPU memory manager somehow.
|
| + static size_t defaultMemoryAllocationLimit() { return 64 * 1024 * 1024; }
|
| +
|
| + // memoryUseBytes() describes the number of bytes used by existing allocated textures.
|
| + // memoryAboveCutoffBytes() describes the number of bytes that would be used if all
|
| + // textures that are above the cutoff were allocated.
|
| + // memoryUseBytes() <= memoryAboveCutoffBytes() should always be true.
|
| + size_t memoryUseBytes() const { return m_memoryUseBytes; }
|
| + size_t memoryAboveCutoffBytes() const { return m_memoryAboveCutoffBytes; }
|
| + size_t memoryForSelfManagedTextures() const { return m_maxMemoryLimitBytes - m_memoryAvailableBytes; }
|
| +
|
| + void setMaxMemoryLimitBytes(size_t bytes) { m_maxMemoryLimitBytes = bytes; }
|
| + size_t maxMemoryLimitBytes() const { return m_maxMemoryLimitBytes; }
|
| +
|
| + void prioritizeTextures();
|
| + void clearPriorities();
|
| +
|
| + void reduceMemoryOnImplThread(size_t limitBytes, CCResourceProvider*);
|
| + bool evictedBackingsExist() const { return !m_evictedBackings.isEmpty(); }
|
| + void getEvictedBackings(BackingVector& evictedBackings);
|
| + void unlinkEvictedBackings(const BackingVector& evictedBackings);
|
| + // Deletes all evicted backings, unlinking them from their owning textures if needed.
|
| + // Returns true if this function unlinked any backings from their owning texture while
|
| + // destroying them.
|
| + bool deleteEvictedBackings();
|
| +
|
| + bool requestLate(CCPrioritizedTexture*);
|
| +
|
| + void reduceMemory(CCResourceProvider*);
|
| + void clearAllMemory(CCResourceProvider*);
|
| +
|
| + void acquireBackingTextureIfNeeded(CCPrioritizedTexture*, CCResourceProvider*);
|
| +
|
| + void registerTexture(CCPrioritizedTexture*);
|
| + void unregisterTexture(CCPrioritizedTexture*);
|
| + void returnBackingTexture(CCPrioritizedTexture*);
|
| +
|
| +private:
|
| + friend class CCPrioritizedTextureTest;
|
| +
|
| + enum EvictionPriorityPolicy {
|
| + RespectManagerPriorityCutoff,
|
| + DoNotRespectManagerPriorityCutoff,
|
| + };
|
| +
|
| + // Compare textures. Highest priority first.
|
| + static inline bool compareTextures(CCPrioritizedTexture* a, CCPrioritizedTexture* b)
|
| + {
|
| + if (a->requestPriority() == b->requestPriority())
|
| + return a < b;
|
| + return CCPriorityCalculator::priorityIsHigher(a->requestPriority(), b->requestPriority());
|
| + }
|
| + // Compare backings. Lowest priority first.
|
| + static inline bool compareBackings(CCPrioritizedTexture::Backing* a, CCPrioritizedTexture::Backing* b)
|
| + {
|
| + int priorityA = a->requestPriorityAtLastPriorityUpdate();
|
| + int priorityB = b->requestPriorityAtLastPriorityUpdate();
|
| + if (priorityA != priorityB)
|
| + return CCPriorityCalculator::priorityIsLower(priorityA, priorityB);
|
| + bool aboveCutoffA = a->wasAbovePriorityCutoffAtLastPriorityUpdate();
|
| + bool aboveCutoffB = b->wasAbovePriorityCutoffAtLastPriorityUpdate();
|
| + if (!aboveCutoffA && aboveCutoffB)
|
| + return true;
|
| + if (aboveCutoffA && !aboveCutoffB)
|
| + return false;
|
| + return a < b;
|
| + }
|
| +
|
| + CCPrioritizedTextureManager(size_t maxMemoryLimitBytes, int maxTextureSize, int pool);
|
| +
|
| + void updateBackingsPriorities();
|
| + void evictBackingsToReduceMemory(size_t limitBytes, EvictionPriorityPolicy, CCResourceProvider*);
|
| + CCPrioritizedTexture::Backing* createBacking(IntSize, GC3Denum format, CCResourceProvider*);
|
| + void evictBackingResource(CCPrioritizedTexture::Backing*, CCResourceProvider*);
|
| +
|
| +#if !ASSERT_DISABLED
|
| + void assertInvariants();
|
| +#endif
|
| +
|
| + size_t m_maxMemoryLimitBytes;
|
| + unsigned m_priorityCutoff;
|
| + size_t m_memoryUseBytes;
|
| + size_t m_memoryAboveCutoffBytes;
|
| + size_t m_memoryAvailableBytes;
|
| + int m_pool;
|
| +
|
| + typedef base::hash_set<CCPrioritizedTexture*> TextureSet;
|
| + typedef ListHashSet<CCPrioritizedTexture::Backing*> BackingSet;
|
| + typedef Vector<CCPrioritizedTexture*> TextureVector;
|
| +
|
| + TextureSet m_textures;
|
| + BackingSet m_backings;
|
| + BackingVector m_evictedBackings;
|
| +
|
| + TextureVector m_tempTextureVector;
|
| + BackingVector m_tempBackingVector;
|
| +
|
| + // Set by the main thread when it adjust priorities in such a way that
|
| + // the m_backings array's view of priorities is now out of date.
|
| + bool m_needsUpdateBackingsPrioritites;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CCPrioritizedTextureManager);
|
| +};
|
| +
|
| +} // namespace cc
|
| +
|
| +#endif
|
|
|