Home | History | Annotate | Download | only in gpu
      1 /*
      2  * Copyright 2014 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef GrCacheable_DEFINED
      9 #define GrCacheable_DEFINED
     10 
     11 #include "SkRefCnt.h"
     12 
     13 class GrResourceCacheEntry;
     14 
     15 /**
     16  * Base class for objects that can be kept in the GrResourceCache.
     17  */
     18 class GrCacheable : public SkRefCnt {
     19 public:
     20     SK_DECLARE_INST_COUNT(GrCacheable)
     21 
     22     /**
     23      * Retrieves the amount of GPU memory used by this resource in bytes. It is
     24      * approximate since we aren't aware of additional padding or copies made
     25      * by the driver.
     26      *
     27      * @return the amount of GPU memory used in bytes
     28      */
     29     virtual size_t gpuMemorySize() const = 0;
     30 
     31     /**
     32      * Checks whether the GPU memory allocated to this resource is still in effect.
     33      * It can become invalid if its context is destroyed or lost, in which case it
     34      * should no longer count against the GrResourceCache budget.
     35      *
     36      * @return true if this resource is still holding GPU memory
     37      *         false otherwise.
     38      */
     39     virtual bool isValidOnGpu() const = 0;
     40 
     41     void setCacheEntry(GrResourceCacheEntry* cacheEntry) { fCacheEntry = cacheEntry; }
     42     GrResourceCacheEntry* getCacheEntry() { return fCacheEntry; }
     43 
     44     /**
     45      * Gets an id that is unique for this GrCacheable object. It is static in that it does
     46      * not change when the content of the GrCacheable object changes. This will never return
     47      * 0.
     48      */
     49     uint32_t getGenerationID() const;
     50 
     51 protected:
     52     GrCacheable()
     53         : fCacheEntry(NULL)
     54         , fGenID(0) {}
     55 
     56     bool isInCache() const { return NULL != fCacheEntry; }
     57 
     58     /**
     59      * This entry point should be called whenever gpuMemorySize() begins
     60      * reporting a different size. If the object is in the cache, it will call
     61      * gpuMemorySize() immediately and pass the new size on to the resource
     62      * cache.
     63      */
     64     void didChangeGpuMemorySize() const;
     65 
     66 private:
     67     GrResourceCacheEntry*   fCacheEntry;  // NULL if not in cache
     68     mutable uint32_t        fGenID;
     69 
     70     typedef SkRefCnt INHERITED;
     71 };
     72 
     73 #endif
     74