| Index: cc/CCPrioritizedTextureManager.h
 | 
| diff --git a/cc/CCPrioritizedTextureManager.h b/cc/CCPrioritizedTextureManager.h
 | 
| index 15bdc186acc275231862157a806b0478f3549ba9..52b35d68d2b4696100cf9e74c19693b05392af7c 100644
 | 
| --- a/cc/CCPrioritizedTextureManager.h
 | 
| +++ b/cc/CCPrioritizedTextureManager.h
 | 
| @@ -33,6 +33,8 @@ public:
 | 
|      }
 | 
|      ~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:
 | 
| @@ -54,12 +56,18 @@ public:
 | 
|      void prioritizeTextures();
 | 
|      void clearPriorities();
 | 
|  
 | 
| +    void reduceMemoryOnImplThread(size_t limitBytes, CCResourceProvider*);
 | 
| +    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 to unlinked any backings from their owning texture while
 | 
| +    // destroying them.
 | 
| +    bool deleteEvictedBackings();
 | 
| +
 | 
|      bool requestLate(CCPrioritizedTexture*);
 | 
|  
 | 
|      void reduceMemory(CCResourceProvider*);
 | 
|      void clearAllMemory(CCResourceProvider*);
 | 
| -    void unlinkAllBackings();
 | 
| -    void deleteAllUnlinkedBackings();
 | 
|  
 | 
|      void acquireBackingTextureIfNeeded(CCPrioritizedTexture*, CCResourceProvider*);
 | 
|  
 | 
| @@ -67,11 +75,14 @@ public:
 | 
|      void unregisterTexture(CCPrioritizedTexture*);
 | 
|      void returnBackingTexture(CCPrioritizedTexture*);
 | 
|  
 | 
| -#if !ASSERT_DISABLED
 | 
| -    void assertInvariants();
 | 
| -#endif
 | 
| -
 | 
|  private:
 | 
| +    friend class CCPrioritizedTextureTest;
 | 
| +
 | 
| +    enum EvictionPriorityPolicy {
 | 
| +        RespectManagerPriorityCutoff,
 | 
| +        DoNotRespectManagerPriorityCutoff,
 | 
| +    };
 | 
| +
 | 
|      // Compare textures. Highest priority first.
 | 
|      static inline bool compareTextures(CCPrioritizedTexture* a, CCPrioritizedTexture* b)
 | 
|      {
 | 
| @@ -82,19 +93,29 @@ private:
 | 
|      // Compare backings. Lowest priority first.
 | 
|      static inline bool compareBackings(CCPrioritizedTexture::Backing* a, CCPrioritizedTexture::Backing* b)
 | 
|      {
 | 
| -        int priorityA = a->owner() ? a->owner()->requestPriority() : CCPriorityCalculator::lowestPriority();
 | 
| -        int priorityB = b->owner() ? b->owner()->requestPriority() : CCPriorityCalculator::lowestPriority();
 | 
| -        if (priorityA == priorityB)
 | 
| -            return a < b;
 | 
| -        return CCPriorityCalculator::priorityIsLower(priorityA, priorityB);
 | 
| +        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 reduceMemory(size_t limit, CCResourceProvider*);
 | 
| -
 | 
| +    void updateBackingsPriorities();
 | 
| +    void evictBackingsToReduceMemory(size_t limitBytes, EvictionPriorityPolicy, CCResourceProvider*);
 | 
|      CCPrioritizedTexture::Backing* createBacking(IntSize, GC3Denum format, CCResourceProvider*);
 | 
| -    void destroyBacking(CCPrioritizedTexture::Backing*, CCResourceProvider*);
 | 
| +    void evictBackingResource(CCPrioritizedTexture::Backing*, CCResourceProvider*);
 | 
| +
 | 
| +#if !ASSERT_DISABLED
 | 
| +    void assertInvariants();
 | 
| +#endif
 | 
|  
 | 
|      size_t m_maxMemoryLimitBytes;
 | 
|      unsigned m_priorityCutoff;
 | 
| @@ -106,13 +127,17 @@ private:
 | 
|      typedef HashSet<CCPrioritizedTexture*> TextureSet;
 | 
|      typedef ListHashSet<CCPrioritizedTexture::Backing*> BackingSet;
 | 
|      typedef Vector<CCPrioritizedTexture*> TextureVector;
 | 
| -    typedef Vector<CCPrioritizedTexture::Backing*> BackingVector;
 | 
|  
 | 
|      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;
 | 
|  };
 | 
|  
 | 
|  } // cc
 | 
| 
 |