Chromium Code Reviews| Index: include/gpu/GrGpuObject.h |
| diff --git a/include/gpu/GrGpuObject.h b/include/gpu/GrGpuObject.h |
| index 0347d441005d88af1ad46a9adf4b08c8f427a5ac..17264c61881cc24bb7a8414ce955c4b3918c8dbe 100644 |
| --- a/include/gpu/GrGpuObject.h |
| +++ b/include/gpu/GrGpuObject.h |
| @@ -1,25 +1,40 @@ |
| /* |
| - * Copyright 2011 Google Inc. |
| + * Copyright 2014 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
|
robertphillips
2014/07/25 12:53:06
Shouldn't we keep this matching the class name?
bsalomon
2014/07/25 14:20:53
Yup, oversight as I merged the two .h files.
|
| -#ifndef GrGpuObject_DEFINED |
| -#define GrGpuObject_DEFINED |
| +#ifndef GrCacheable_DEFINED |
| +#define GrCacheable_DEFINED |
| -#include "GrCacheable.h" |
| +#include "SkInstCnt.h" |
| #include "SkTInternalLList.h" |
| +class GrResourceCacheEntry; |
| class GrGpu; |
| class GrContext; |
| /** |
| - * Base class for the GPU objects created by a GrContext. |
| + * Base class for objects that can be kept in the GrResourceCache. |
| */ |
| -class GrGpuObject : public GrCacheable { |
| +class GrGpuObject : public SkNoncopyable { |
| public: |
| - SK_DECLARE_INST_COUNT(GrGpuObject) |
| + SK_DECLARE_INST_COUNT_ROOT(GrGpuObject) |
| + |
| + // These method signatures are written to mirror SkRefCnt. However, we don't require |
| + // thread safety as GrCacheable objects are not intended to cross thread boundaries. |
| + // internal_dispose() exists because of GrTexture's reliance on it. It will be removed |
| + // soon. |
| + void ref() const { ++fRefCnt; } |
| + void unref() const { --fRefCnt; if (0 == fRefCnt) { this->internal_dispose(); } } |
| + virtual void internal_dispose() const { SkDELETE(this); } |
| + bool unique() const { return 1 == fRefCnt; } |
| +#ifdef SK_DEBUG |
| + void validate() const { |
| + SkASSERT(fRefCnt > 0); |
| + } |
| +#endif |
| /** |
| * Frees the object in the underlying 3D API. It must be safe to call this |
| @@ -54,17 +69,31 @@ public: |
| const GrContext* getContext() const; |
| GrContext* getContext(); |
| - virtual bool isValidOnGpu() const SK_OVERRIDE { return !this->wasDestroyed(); } |
| + /** |
| + * Retrieves the amount of GPU memory used by this resource in bytes. It is |
| + * approximate since we aren't aware of additional padding or copies made |
| + * by the driver. |
| + * |
| + * @return the amount of GPU memory used in bytes |
| + */ |
| + virtual size_t gpuMemorySize() const = 0; |
| + |
| + void setCacheEntry(GrResourceCacheEntry* cacheEntry) { fCacheEntry = cacheEntry; } |
| + GrResourceCacheEntry* getCacheEntry() { return fCacheEntry; } |
| -protected: |
| /** |
| - * isWrapped indicates we have wrapped a client-created backend object in a GrGpuObject. If it |
| - * is true then the client is responsible for the lifetime of the underlying backend object. |
| - * Otherwise, our onRelease() should free the object. |
| + * Gets an id that is unique for this GrCacheable object. It is static in that it does |
| + * not change when the content of the GrCacheable object changes. This will never return |
| + * 0. |
| */ |
| - GrGpuObject(GrGpu* gpu, bool isWrapped); |
| + uint32_t getUniqueID() const { return fUniqueID; } |
| + |
| +protected: |
| + GrGpuObject(GrGpu*, bool isWrapped); |
| virtual ~GrGpuObject(); |
| + bool isInCache() const { return NULL != fCacheEntry; } |
| + |
| GrGpu* getGpu() const { return fGpu; } |
| // Derived classes should always call their parent class' onRelease |
| @@ -74,11 +103,21 @@ protected: |
| bool isWrapped() const { return kWrapped_FlagBit & fFlags; } |
| + /** |
| + * This entry point should be called whenever gpuMemorySize() begins |
| + * reporting a different size. If the object is in the cache, it will call |
| + * gpuMemorySize() immediately and pass the new size on to the resource |
| + * cache. |
| + */ |
| + void didChangeGpuMemorySize() const; |
| + |
| private: |
| #ifdef SK_DEBUG |
| friend class GrGpu; // for assert in GrGpu to access getGpu |
| #endif |
| + static uint32_t CreateUniqueID(); |
| + |
| // We're in an internal doubly linked list |
| SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrGpuObject); |
| @@ -93,9 +132,14 @@ private: |
| */ |
| kWrapped_FlagBit = 0x1, |
| }; |
| - uint32_t fFlags; |
| - typedef GrCacheable INHERITED; |
| + uint32_t fFlags; |
| + |
| + mutable int32_t fRefCnt; |
| + GrResourceCacheEntry* fCacheEntry; // NULL if not in cache |
| + const uint32_t fUniqueID; |
| + |
| + typedef SkNoncopyable INHERITED; |
| }; |
| #endif |