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