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