| 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 |