| OLD | NEW | 
|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef CCPrioritizedTextureManager_h | 5 #ifndef CCPrioritizedTextureManager_h | 
| 6 #define CCPrioritizedTextureManager_h | 6 #define CCPrioritizedTextureManager_h | 
| 7 | 7 | 
| 8 #include "CCPrioritizedTexture.h" | 8 #include "CCPrioritizedTexture.h" | 
| 9 #include "CCPriorityCalculator.h" | 9 #include "CCPriorityCalculator.h" | 
| 10 #include "CCTexture.h" | 10 #include "CCTexture.h" | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 26     static PassOwnPtr<CCPrioritizedTextureManager> create(size_t maxMemoryLimitB
     ytes, int maxTextureSize, int pool) | 26     static PassOwnPtr<CCPrioritizedTextureManager> create(size_t maxMemoryLimitB
     ytes, int maxTextureSize, int pool) | 
| 27     { | 27     { | 
| 28         return adoptPtr(new CCPrioritizedTextureManager(maxMemoryLimitBytes, max
     TextureSize, pool)); | 28         return adoptPtr(new CCPrioritizedTextureManager(maxMemoryLimitBytes, max
     TextureSize, pool)); | 
| 29     } | 29     } | 
| 30     PassOwnPtr<CCPrioritizedTexture> createTexture(IntSize size, GC3Denum format
     ) | 30     PassOwnPtr<CCPrioritizedTexture> createTexture(IntSize size, GC3Denum format
     ) | 
| 31     { | 31     { | 
| 32         return adoptPtr(new CCPrioritizedTexture(this, size, format)); | 32         return adoptPtr(new CCPrioritizedTexture(this, size, format)); | 
| 33     } | 33     } | 
| 34     ~CCPrioritizedTextureManager(); | 34     ~CCPrioritizedTextureManager(); | 
| 35 | 35 | 
|  | 36     typedef Vector<CCPrioritizedTexture::Backing*> BackingVector; | 
|  | 37 | 
| 36     // FIXME (http://crbug.com/137094): This 64MB default is a straggler from th
     e | 38     // FIXME (http://crbug.com/137094): This 64MB default is a straggler from th
     e | 
| 37     // old texture manager and is just to give us a default memory allocation be
     fore | 39     // old texture manager and is just to give us a default memory allocation be
     fore | 
| 38     // we get a callback from the GPU memory manager. We should probaby either: | 40     // we get a callback from the GPU memory manager. We should probaby either: | 
| 39     // - wait for the callback before rendering anything instead | 41     // - wait for the callback before rendering anything instead | 
| 40     // - push this into the GPU memory manager somehow. | 42     // - push this into the GPU memory manager somehow. | 
| 41     static size_t defaultMemoryAllocationLimit() { return 64 * 1024 * 1024; } | 43     static size_t defaultMemoryAllocationLimit() { return 64 * 1024 * 1024; } | 
| 42 | 44 | 
| 43     // memoryUseBytes() describes the number of bytes used by existing allocated
      textures. | 45     // memoryUseBytes() describes the number of bytes used by existing allocated
      textures. | 
| 44     // memoryAboveCutoffBytes() describes the number of bytes that would be used
      if all | 46     // memoryAboveCutoffBytes() describes the number of bytes that would be used
      if all | 
| 45     // textures that are above the cutoff were allocated. | 47     // textures that are above the cutoff were allocated. | 
| 46     // memoryUseBytes() <= memoryAboveCutoffBytes() should always be true. | 48     // memoryUseBytes() <= memoryAboveCutoffBytes() should always be true. | 
| 47     size_t memoryUseBytes() const { return m_memoryUseBytes; } | 49     size_t memoryUseBytes() const { return m_memoryUseBytes; } | 
| 48     size_t memoryAboveCutoffBytes() const { return m_memoryAboveCutoffBytes; } | 50     size_t memoryAboveCutoffBytes() const { return m_memoryAboveCutoffBytes; } | 
| 49     size_t memoryForSelfManagedTextures() const { return m_maxMemoryLimitBytes -
      m_memoryAvailableBytes; } | 51     size_t memoryForSelfManagedTextures() const { return m_maxMemoryLimitBytes -
      m_memoryAvailableBytes; } | 
| 50 | 52 | 
| 51     void setMaxMemoryLimitBytes(size_t bytes) { m_maxMemoryLimitBytes = bytes; } | 53     void setMaxMemoryLimitBytes(size_t bytes) { m_maxMemoryLimitBytes = bytes; } | 
| 52     size_t maxMemoryLimitBytes() const { return m_maxMemoryLimitBytes; } | 54     size_t maxMemoryLimitBytes() const { return m_maxMemoryLimitBytes; } | 
| 53 | 55 | 
| 54     void prioritizeTextures(); | 56     void prioritizeTextures(); | 
| 55     void clearPriorities(); | 57     void clearPriorities(); | 
| 56 | 58 | 
|  | 59     void reduceMemoryOnImplThread(size_t limitBytes, CCResourceProvider*); | 
|  | 60     void getEvictedBackings(BackingVector& evictedBackings); | 
|  | 61     void unlinkEvictedBackings(const BackingVector& evictedBackings); | 
|  | 62     // Deletes all evicted backings, unlinking them from their owning textures i
     f needed. | 
|  | 63     // Returns true if this function to unlinked any backings from their owning 
     texture while | 
|  | 64     // destroying them. | 
|  | 65     bool deleteEvictedBackings(); | 
|  | 66 | 
| 57     bool requestLate(CCPrioritizedTexture*); | 67     bool requestLate(CCPrioritizedTexture*); | 
| 58 | 68 | 
| 59     void reduceMemory(CCResourceProvider*); | 69     void reduceMemory(CCResourceProvider*); | 
| 60     void clearAllMemory(CCResourceProvider*); | 70     void clearAllMemory(CCResourceProvider*); | 
| 61     void unlinkAllBackings(); |  | 
| 62     void deleteAllUnlinkedBackings(); |  | 
| 63 | 71 | 
| 64     void acquireBackingTextureIfNeeded(CCPrioritizedTexture*, CCResourceProvider
     *); | 72     void acquireBackingTextureIfNeeded(CCPrioritizedTexture*, CCResourceProvider
     *); | 
| 65 | 73 | 
| 66     void registerTexture(CCPrioritizedTexture*); | 74     void registerTexture(CCPrioritizedTexture*); | 
| 67     void unregisterTexture(CCPrioritizedTexture*); | 75     void unregisterTexture(CCPrioritizedTexture*); | 
| 68     void returnBackingTexture(CCPrioritizedTexture*); | 76     void returnBackingTexture(CCPrioritizedTexture*); | 
| 69 | 77 | 
| 70 #if !ASSERT_DISABLED | 78 private: | 
| 71     void assertInvariants(); | 79     friend class CCPrioritizedTextureTest; | 
| 72 #endif |  | 
| 73 | 80 | 
| 74 private: | 81     enum EvictionPriorityPolicy { | 
|  | 82         RespectManagerPriorityCutoff, | 
|  | 83         DoNotRespectManagerPriorityCutoff, | 
|  | 84     }; | 
|  | 85 | 
| 75     // Compare textures. Highest priority first. | 86     // Compare textures. Highest priority first. | 
| 76     static inline bool compareTextures(CCPrioritizedTexture* a, CCPrioritizedTex
     ture* b) | 87     static inline bool compareTextures(CCPrioritizedTexture* a, CCPrioritizedTex
     ture* b) | 
| 77     { | 88     { | 
| 78         if (a->requestPriority() == b->requestPriority()) | 89         if (a->requestPriority() == b->requestPriority()) | 
| 79             return a < b; | 90             return a < b; | 
| 80         return CCPriorityCalculator::priorityIsHigher(a->requestPriority(), b->r
     equestPriority()); | 91         return CCPriorityCalculator::priorityIsHigher(a->requestPriority(), b->r
     equestPriority()); | 
| 81     } | 92     } | 
| 82     // Compare backings. Lowest priority first. | 93     // Compare backings. Lowest priority first. | 
| 83     static inline bool compareBackings(CCPrioritizedTexture::Backing* a, CCPrior
     itizedTexture::Backing* b) | 94     static inline bool compareBackings(CCPrioritizedTexture::Backing* a, CCPrior
     itizedTexture::Backing* b) | 
| 84     { | 95     { | 
| 85         int priorityA = a->owner() ? a->owner()->requestPriority() : CCPriorityC
     alculator::lowestPriority(); | 96         int priorityA = a->requestPriorityAtLastPriorityUpdate(); | 
| 86         int priorityB = b->owner() ? b->owner()->requestPriority() : CCPriorityC
     alculator::lowestPriority(); | 97         int priorityB = b->requestPriorityAtLastPriorityUpdate(); | 
| 87         if (priorityA == priorityB) | 98         if (priorityA != priorityB) | 
| 88             return a < b; | 99             return CCPriorityCalculator::priorityIsLower(priorityA, priorityB); | 
| 89         return CCPriorityCalculator::priorityIsLower(priorityA, priorityB); | 100         bool aboveCutoffA = a->wasAbovePriorityCutoffAtLastPriorityUpdate(); | 
|  | 101         bool aboveCutoffB = b->wasAbovePriorityCutoffAtLastPriorityUpdate(); | 
|  | 102         if (!aboveCutoffA && aboveCutoffB) | 
|  | 103             return true; | 
|  | 104         if (aboveCutoffA && !aboveCutoffB) | 
|  | 105             return false; | 
|  | 106         return a < b; | 
| 90     } | 107     } | 
| 91 | 108 | 
| 92     CCPrioritizedTextureManager(size_t maxMemoryLimitBytes, int maxTextureSize, 
     int pool); | 109     CCPrioritizedTextureManager(size_t maxMemoryLimitBytes, int maxTextureSize, 
     int pool); | 
| 93 | 110 | 
| 94     void reduceMemory(size_t limit, CCResourceProvider*); | 111     void updateBackingsPriorities(); | 
|  | 112     void evictBackingsToReduceMemory(size_t limitBytes, EvictionPriorityPolicy, 
     CCResourceProvider*); | 
|  | 113     CCPrioritizedTexture::Backing* createBacking(IntSize, GC3Denum format, CCRes
     ourceProvider*); | 
|  | 114     void evictBackingResource(CCPrioritizedTexture::Backing*, CCResourceProvider
     *); | 
| 95 | 115 | 
| 96     CCPrioritizedTexture::Backing* createBacking(IntSize, GC3Denum format, CCRes
     ourceProvider*); | 116 #if !ASSERT_DISABLED | 
| 97     void destroyBacking(CCPrioritizedTexture::Backing*, CCResourceProvider*); | 117     void assertInvariants(); | 
|  | 118 #endif | 
| 98 | 119 | 
| 99     size_t m_maxMemoryLimitBytes; | 120     size_t m_maxMemoryLimitBytes; | 
| 100     unsigned m_priorityCutoff; | 121     unsigned m_priorityCutoff; | 
| 101     size_t m_memoryUseBytes; | 122     size_t m_memoryUseBytes; | 
| 102     size_t m_memoryAboveCutoffBytes; | 123     size_t m_memoryAboveCutoffBytes; | 
| 103     size_t m_memoryAvailableBytes; | 124     size_t m_memoryAvailableBytes; | 
| 104     int m_pool; | 125     int m_pool; | 
| 105 | 126 | 
| 106     typedef HashSet<CCPrioritizedTexture*> TextureSet; | 127     typedef HashSet<CCPrioritizedTexture*> TextureSet; | 
| 107     typedef ListHashSet<CCPrioritizedTexture::Backing*> BackingSet; | 128     typedef ListHashSet<CCPrioritizedTexture::Backing*> BackingSet; | 
| 108     typedef Vector<CCPrioritizedTexture*> TextureVector; | 129     typedef Vector<CCPrioritizedTexture*> TextureVector; | 
| 109     typedef Vector<CCPrioritizedTexture::Backing*> BackingVector; |  | 
| 110 | 130 | 
| 111     TextureSet m_textures; | 131     TextureSet m_textures; | 
| 112     BackingSet m_backings; | 132     BackingSet m_backings; | 
|  | 133     BackingVector m_evictedBackings; | 
| 113 | 134 | 
| 114     TextureVector m_tempTextureVector; | 135     TextureVector m_tempTextureVector; | 
| 115     BackingVector m_tempBackingVector; | 136     BackingVector m_tempBackingVector; | 
|  | 137 | 
|  | 138     // Set by the main thread when it adjust priorities in such a way that | 
|  | 139     // the m_backings array's view of priorities is now out of date. | 
|  | 140     bool m_needsUpdateBackingsPrioritites; | 
| 116 }; | 141 }; | 
| 117 | 142 | 
| 118 } // cc | 143 } // cc | 
| 119 | 144 | 
| 120 #endif | 145 #endif | 
| OLD | NEW | 
|---|