| 1 | /* | 
|---|
| 2 | * Copyright 2015 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 GrGpuResourcePriv_DEFINED | 
|---|
| 9 | #define GrGpuResourcePriv_DEFINED | 
|---|
| 10 |  | 
|---|
| 11 | #include "src/gpu/GrGpuResource.h" | 
|---|
| 12 |  | 
|---|
| 13 | /** | 
|---|
| 14 | * This class allows code internal to Skia privileged access to manage the cache keys and budget | 
|---|
| 15 | * status of a GrGpuResource object. | 
|---|
| 16 | */ | 
|---|
| 17 | class GrGpuResource::ResourcePriv { | 
|---|
| 18 | public: | 
|---|
| 19 | /** | 
|---|
| 20 | * Sets a unique key for the resource. If the resource was previously cached as scratch it will | 
|---|
| 21 | * be converted to a uniquely-keyed resource. If the key is invalid then this is equivalent to | 
|---|
| 22 | * removeUniqueKey(). If another resource is using the key then its unique key is removed and | 
|---|
| 23 | * this resource takes over the key. | 
|---|
| 24 | */ | 
|---|
| 25 | void setUniqueKey(const GrUniqueKey& key) { fResource->setUniqueKey(key); } | 
|---|
| 26 |  | 
|---|
| 27 | /** Removes the unique key from a resource. If the resource has a scratch key, it may be | 
|---|
| 28 | preserved for recycling as scratch. */ | 
|---|
| 29 | void removeUniqueKey() { fResource->removeUniqueKey(); } | 
|---|
| 30 |  | 
|---|
| 31 | /** | 
|---|
| 32 | * If the resource is uncached make it cached. Has no effect on resources that are wrapped or | 
|---|
| 33 | * already cached. | 
|---|
| 34 | */ | 
|---|
| 35 | void makeBudgeted() { fResource->makeBudgeted(); } | 
|---|
| 36 |  | 
|---|
| 37 | /** | 
|---|
| 38 | * If the resource is cached make it uncached. Has no effect on resources that are wrapped or | 
|---|
| 39 | * already uncached. Furthermore, resources with unique keys cannot be made unbudgeted. | 
|---|
| 40 | */ | 
|---|
| 41 | void makeUnbudgeted() { fResource->makeUnbudgeted(); } | 
|---|
| 42 |  | 
|---|
| 43 | /** | 
|---|
| 44 | * Get the resource's budgeted-type which indicates whether it counts against the resource cache | 
|---|
| 45 | * budget and if not whether it is allowed to be cached. | 
|---|
| 46 | */ | 
|---|
| 47 | GrBudgetedType budgetedType() const { | 
|---|
| 48 | SkASSERT(GrBudgetedType::kBudgeted == fResource->fBudgetedType || | 
|---|
| 49 | !fResource->getUniqueKey().isValid() || fResource->fRefsWrappedObjects); | 
|---|
| 50 | return fResource->fBudgetedType; | 
|---|
| 51 | } | 
|---|
| 52 |  | 
|---|
| 53 | /** | 
|---|
| 54 | * Is the resource object wrapping an externally allocated GPU resource? | 
|---|
| 55 | */ | 
|---|
| 56 | bool refsWrappedObjects() const { return fResource->fRefsWrappedObjects; } | 
|---|
| 57 |  | 
|---|
| 58 | /** | 
|---|
| 59 | * If this resource can be used as a scratch resource this returns a valid scratch key. | 
|---|
| 60 | * Otherwise it returns a key for which isNullScratch is true. The resource may currently be | 
|---|
| 61 | * used as a uniquely keyed resource rather than scratch. Check isScratch(). | 
|---|
| 62 | */ | 
|---|
| 63 | const GrScratchKey& getScratchKey() const { return fResource->fScratchKey; } | 
|---|
| 64 |  | 
|---|
| 65 | /** | 
|---|
| 66 | * If the resource has a scratch key, the key will be removed. Since scratch keys are installed | 
|---|
| 67 | * at resource creation time, this means the resource will never again be used as scratch. | 
|---|
| 68 | */ | 
|---|
| 69 | void removeScratchKey() const { fResource->removeScratchKey();  } | 
|---|
| 70 |  | 
|---|
| 71 | bool isPurgeable() const { return fResource->isPurgeable(); } | 
|---|
| 72 |  | 
|---|
| 73 | bool hasRef() const { return fResource->hasRef(); } | 
|---|
| 74 |  | 
|---|
| 75 | protected: | 
|---|
| 76 | ResourcePriv(GrGpuResource* resource) : fResource(resource) {   } | 
|---|
| 77 | ResourcePriv(const ResourcePriv& that) : fResource(that.fResource) {} | 
|---|
| 78 | ResourcePriv& operator=(const CacheAccess&); // unimpl | 
|---|
| 79 |  | 
|---|
| 80 | // No taking addresses of this type. | 
|---|
| 81 | const ResourcePriv* operator&() const; | 
|---|
| 82 | ResourcePriv* operator&(); | 
|---|
| 83 |  | 
|---|
| 84 | GrGpuResource* fResource; | 
|---|
| 85 |  | 
|---|
| 86 | friend class GrGpuResource; // to construct/copy this type. | 
|---|
| 87 | }; | 
|---|
| 88 |  | 
|---|
| 89 | inline GrGpuResource::ResourcePriv GrGpuResource::resourcePriv() { return ResourcePriv(this); } | 
|---|
| 90 |  | 
|---|
| 91 | inline const GrGpuResource::ResourcePriv GrGpuResource::resourcePriv() const { | 
|---|
| 92 | return ResourcePriv(const_cast<GrGpuResource*>(this)); | 
|---|
| 93 | } | 
|---|
| 94 |  | 
|---|
| 95 | #endif | 
|---|
| 96 |  | 
|---|