1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 68fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com */ 78fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 86d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon#include "GrGpuResource.h" 9cabe20cafd5f091a68bbc2c0c48755ba9b61b0b7kkinnunen#include "GrContext.h" 106be756b673b823881e90a2ef68c12b640ddde549Robert Phillips#include "GrContextPriv.h" 110ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon#include "GrResourceCache.h" 128fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#include "GrGpu.h" 133582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon#include "GrGpuResourcePriv.h" 140a5fa484fd58d27088f8696bdc11c8cc8f2b4866ericrk#include "SkTraceMemoryDump.h" 158fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 160ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomonstatic inline GrResourceCache* get_resource_cache(GrGpu* gpu) { 1749f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(gpu); 1849f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(gpu->getContext()); 196be756b673b823881e90a2ef68c12b640ddde549Robert Phillips SkASSERT(gpu->getContext()->contextPriv().getResourceCache()); 206be756b673b823881e90a2ef68c12b640ddde549Robert Phillips return gpu->getContext()->contextPriv().getResourceCache(); 21c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon} 22c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon 232e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunenGrGpuResource::GrGpuResource(GrGpu* gpu) 24e2e87f3484e5524dbfd6c01f402136738d1d434bbsalomon : fExternalFlushCntWhenBecamePurgeable(0) 25e2e87f3484e5524dbfd6c01f402136738d1d434bbsalomon , fGpu(gpu) 2669ed47f42d4877c178fdc0031cb01af2966ae235bsalomon , fGpuMemorySize(kInvalidGpuMemorySize) 272e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen , fBudgeted(SkBudgeted::kNo) 282e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen , fRefsWrappedObjects(false) 2984c8e62fad59f0e19b40ac718467f5b7884b431dbsalomon , fUniqueID(CreateUniqueID()) { 309f2d1571ed1f0ed579e5d7779c46a90e20f30f22bsalomon SkDEBUGCODE(fCacheArrayIndex = -1); 31169612621f00b3fe9f71014079991287d311751absalomon} 32169612621f00b3fe9f71014079991287d311751absalomon 332e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunenvoid GrGpuResource::registerWithCache(SkBudgeted budgeted) { 342e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen SkASSERT(fBudgeted == SkBudgeted::kNo); 352e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen fBudgeted = budgeted; 362e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen this->computeScratchKey(&fScratchKey); 372e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen get_resource_cache(fGpu)->resourceAccess().insertResource(this); 382e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen} 392e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen 402e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunenvoid GrGpuResource::registerWithCacheWrapped() { 412e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen SkASSERT(fBudgeted == SkBudgeted::kNo); 422e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen // Currently resources referencing wrapped objects are not budgeted. 432e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen fRefsWrappedObjects = true; 440ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon get_resource_cache(fGpu)->resourceAccess().insertResource(this); 458fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com} 468fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 476d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomonGrGpuResource::~GrGpuResource() { 4812299ab7a1be5f4b99284ecf289d46107ef0a946bsalomon // The cache should have released or destroyed this resource. 49089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org SkASSERT(this->wasDestroyed()); 5076b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com} 5176b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com 529d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanaryvoid GrGpuResource::release() { 5312299ab7a1be5f4b99284ecf289d46107ef0a946bsalomon SkASSERT(fGpu); 5412299ab7a1be5f4b99284ecf289d46107ef0a946bsalomon this->onRelease(); 550ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon get_resource_cache(fGpu)->resourceAccess().removeResource(this); 5696fcdcc219d2a0d3579719b84b28bede76efba64halcanary fGpu = nullptr; 5712299ab7a1be5f4b99284ecf289d46107ef0a946bsalomon fGpuMemorySize = 0; 588fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com} 598fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 606d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomonvoid GrGpuResource::abandon() { 61c6363ef7b4763b36a9a0d255bc775a973d2fc7a5bsalomon if (this->wasDestroyed()) { 62c6363ef7b4763b36a9a0d255bc775a973d2fc7a5bsalomon return; 63c6363ef7b4763b36a9a0d255bc775a973d2fc7a5bsalomon } 6412299ab7a1be5f4b99284ecf289d46107ef0a946bsalomon SkASSERT(fGpu); 6512299ab7a1be5f4b99284ecf289d46107ef0a946bsalomon this->onAbandon(); 660ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon get_resource_cache(fGpu)->resourceAccess().removeResource(this); 6796fcdcc219d2a0d3579719b84b28bede76efba64halcanary fGpu = nullptr; 6812299ab7a1be5f4b99284ecf289d46107ef0a946bsalomon fGpuMemorySize = 0; 698fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com} 70f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com 710a5fa484fd58d27088f8696bdc11c8cc8f2b4866ericrkvoid GrGpuResource::dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const { 726ab4e8f2e499169071bd4168082e8b6cdcb4a107Eric Karl if (this->fRefsWrappedObjects && !traceMemoryDump->shouldDumpWrappedObjects()) { 736ab4e8f2e499169071bd4168082e8b6cdcb4a107Eric Karl return; 746ab4e8f2e499169071bd4168082e8b6cdcb4a107Eric Karl } 756ab4e8f2e499169071bd4168082e8b6cdcb4a107Eric Karl 7667914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger this->dumpMemoryStatisticsPriv(traceMemoryDump, this->getResourceName(), 7767914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger this->getResourceType(), this->gpuMemorySize()); 7867914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger} 790a5fa484fd58d27088f8696bdc11c8cc8f2b4866ericrk 8067914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenbergervoid GrGpuResource::dumpMemoryStatisticsPriv(SkTraceMemoryDump* traceMemoryDump, 8167914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger const SkString& resourceName, 8267914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger const char* type, size_t size) const { 8367914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger const char* tag = "Scratch"; 8467914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger if (fUniqueKey.isValid()) { 8567914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger tag = (fUniqueKey.tag() != nullptr) ? fUniqueKey.tag() : "Other"; 8667914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger } 870a5fa484fd58d27088f8696bdc11c8cc8f2b4866ericrk 8867914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger traceMemoryDump->dumpNumericValue(resourceName.c_str(), "size", "bytes", size); 8967914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger traceMemoryDump->dumpStringValue(resourceName.c_str(), "type", type); 9067914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger traceMemoryDump->dumpStringValue(resourceName.c_str(), "category", tag); 910a5fa484fd58d27088f8696bdc11c8cc8f2b4866ericrk if (this->isPurgeable()) { 9267914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger traceMemoryDump->dumpNumericValue(resourceName.c_str(), "purgeable_size", "bytes", size); 930a5fa484fd58d27088f8696bdc11c8cc8f2b4866ericrk } 940a5fa484fd58d27088f8696bdc11c8cc8f2b4866ericrk 9567914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger this->setMemoryBacking(traceMemoryDump, resourceName); 9667914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger} 9767914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger 9867914ebddfc81b5f564dfa119eca3c8bad33db74Derek SollenbergerSkString GrGpuResource::getResourceName() const { 9967914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger // Dump resource as "skia/gpu_resources/resource_#". 10067914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger SkString resourceName("skia/gpu_resources/resource_"); 10167914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger resourceName.appendU32(this->uniqueID().asUInt()); 10267914ebddfc81b5f564dfa119eca3c8bad33db74Derek Sollenberger return resourceName; 1030a5fa484fd58d27088f8696bdc11c8cc8f2b4866ericrk} 1040a5fa484fd58d27088f8696bdc11c8cc8f2b4866ericrk 1056d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomonconst GrContext* GrGpuResource::getContext() const { 10649f085dddff10473b6ebf832a974288300224e60bsalomon if (fGpu) { 107f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com return fGpu->getContext(); 108f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com } else { 10996fcdcc219d2a0d3579719b84b28bede76efba64halcanary return nullptr; 110f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com } 111f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com} 112f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com 1136d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomonGrContext* GrGpuResource::getContext() { 11449f085dddff10473b6ebf832a974288300224e60bsalomon if (fGpu) { 115f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com return fGpu->getContext(); 116f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com } else { 11796fcdcc219d2a0d3579719b84b28bede76efba64halcanary return nullptr; 118f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com } 119f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com} 120c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon 12171cb0c241e439b6ed746b90294d0b6916644a644bsalomonvoid GrGpuResource::didChangeGpuMemorySize() const { 12271cb0c241e439b6ed746b90294d0b6916644a644bsalomon if (this->wasDestroyed()) { 12371cb0c241e439b6ed746b90294d0b6916644a644bsalomon return; 12471cb0c241e439b6ed746b90294d0b6916644a644bsalomon } 12571cb0c241e439b6ed746b90294d0b6916644a644bsalomon 12671cb0c241e439b6ed746b90294d0b6916644a644bsalomon size_t oldSize = fGpuMemorySize; 12771cb0c241e439b6ed746b90294d0b6916644a644bsalomon SkASSERT(kInvalidGpuMemorySize != oldSize); 12871cb0c241e439b6ed746b90294d0b6916644a644bsalomon fGpuMemorySize = kInvalidGpuMemorySize; 1290ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon get_resource_cache(fGpu)->resourceAccess().didChangeGpuMemorySize(this, oldSize); 13071cb0c241e439b6ed746b90294d0b6916644a644bsalomon} 13171cb0c241e439b6ed746b90294d0b6916644a644bsalomon 1328718aafec239c93485e45bbe8fed19d9a8def079bsalomonvoid GrGpuResource::removeUniqueKey() { 133c6363ef7b4763b36a9a0d255bc775a973d2fc7a5bsalomon if (this->wasDestroyed()) { 134c6363ef7b4763b36a9a0d255bc775a973d2fc7a5bsalomon return; 135c6363ef7b4763b36a9a0d255bc775a973d2fc7a5bsalomon } 1368718aafec239c93485e45bbe8fed19d9a8def079bsalomon SkASSERT(fUniqueKey.isValid()); 137f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon get_resource_cache(fGpu)->resourceAccess().removeUniqueKey(this); 13823e619cf462b2a8a500f3ca750e099f79601f508bsalomon} 13923e619cf462b2a8a500f3ca750e099f79601f508bsalomon 140f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomonvoid GrGpuResource::setUniqueKey(const GrUniqueKey& key) { 1416d4488c5e03010c94200b3706631d34ec3201411bsalomon SkASSERT(this->internalHasRef()); 14223e619cf462b2a8a500f3ca750e099f79601f508bsalomon SkASSERT(key.isValid()); 143dace19ec17e85872df3fb35212e1b8bce72018b6bsalomon 1440562eb9c6c98f07732ca96a1dd4e986f1ca089b8Brian Osman // Uncached resources can never have a unique key, unless they're wrapped resources. Wrapped 1450562eb9c6c98f07732ca96a1dd4e986f1ca089b8Brian Osman // resources are a special case: the unique keys give us a weak ref so that we can reuse the 1460562eb9c6c98f07732ca96a1dd4e986f1ca089b8Brian Osman // same resource (rather than re-wrapping). When a wrapped resource is no longer referenced, 1470562eb9c6c98f07732ca96a1dd4e986f1ca089b8Brian Osman // it will always be released - it is never converted to a scratch resource. 1480562eb9c6c98f07732ca96a1dd4e986f1ca089b8Brian Osman if (SkBudgeted::kNo == this->resourcePriv().isBudgeted() && !this->fRefsWrappedObjects) { 149f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon return; 150dace19ec17e85872df3fb35212e1b8bce72018b6bsalomon } 15184c8e62fad59f0e19b40ac718467f5b7884b431dbsalomon 152f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon if (this->wasDestroyed()) { 153f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon return; 1548b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon } 1558b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 156f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon get_resource_cache(fGpu)->resourceAccess().changeUniqueKey(this, key); 1578b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon} 1588b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 1593f324321cdd8fde7976d958e2888a1ec4e657e35bsalomonvoid GrGpuResource::notifyAllCntsAreZero(CntType lastCntTypeToReachZero) const { 16012299ab7a1be5f4b99284ecf289d46107ef0a946bsalomon if (this->wasDestroyed()) { 16112299ab7a1be5f4b99284ecf289d46107ef0a946bsalomon // We've already been removed from the cache. Goodbye cruel world! 162385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary delete this; 1633f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon return; 164bcf0a52d4f4221b158e68a06ba0c4cc4db011060bsalomon } 1653f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon 1663f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon // We should have already handled this fully in notifyRefCntIsZero(). 1673f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon SkASSERT(kRef_CntType != lastCntTypeToReachZero); 1683f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon 1693f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon GrGpuResource* mutableThis = const_cast<GrGpuResource*>(this); 1703f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon static const uint32_t kFlag = 1713f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon GrResourceCache::ResourceAccess::kAllCntsReachedZero_RefNotificationFlag; 1723f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon get_resource_cache(fGpu)->resourceAccess().notifyCntReachedZero(mutableThis, kFlag); 1733f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon} 1743f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon 1753f324321cdd8fde7976d958e2888a1ec4e657e35bsalomonbool GrGpuResource::notifyRefCountIsZero() const { 1763f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon if (this->wasDestroyed()) { 1773f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon // handle this in notifyAllCntsAreZero(). 1783f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon return true; 1793f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon } 1803f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon 1813f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon GrGpuResource* mutableThis = const_cast<GrGpuResource*>(this); 182b6deea8f0ed61475382fc48c7359118bfdcbff85Robert Phillips uint32_t flags = GrResourceCache::ResourceAccess::kRefCntReachedZero_RefNotificationFlag; 1833f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon if (!this->internalHasPendingIO()) { 1843f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon flags |= GrResourceCache::ResourceAccess::kAllCntsReachedZero_RefNotificationFlag; 1853f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon } 1863f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon get_resource_cache(fGpu)->resourceAccess().notifyCntReachedZero(mutableThis, flags); 1873f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon 1883f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon // There is no need to call our notifyAllCntsAreZero function at this point since we already 1893f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon // told the cache about the state of cnts. 1903f324321cdd8fde7976d958e2888a1ec4e657e35bsalomon return false; 191bcf0a52d4f4221b158e68a06ba0c4cc4db011060bsalomon} 192bcf0a52d4f4221b158e68a06ba0c4cc4db011060bsalomon 19310e23caea3106be125acea10a637789e5a15c728bsalomonvoid GrGpuResource::removeScratchKey() { 1947775c85611c734a2af709b3a9c127939a4296c48bsalomon if (!this->wasDestroyed() && fScratchKey.isValid()) { 1950ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon get_resource_cache(fGpu)->resourceAccess().willRemoveScratchKey(this); 1967775c85611c734a2af709b3a9c127939a4296c48bsalomon fScratchKey.reset(); 19710e23caea3106be125acea10a637789e5a15c728bsalomon } 19810e23caea3106be125acea10a637789e5a15c728bsalomon} 19910e23caea3106be125acea10a637789e5a15c728bsalomon 200afe3005be3392e43bc51eb7eb2017eefaed85ad1bsalomonvoid GrGpuResource::makeBudgeted() { 2012e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen if (!this->wasDestroyed() && SkBudgeted::kNo == fBudgeted) { 2022e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen // Currently resources referencing wrapped objects are not budgeted. 2032e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen SkASSERT(!fRefsWrappedObjects); 2042e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen fBudgeted = SkBudgeted::kYes; 2050ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon get_resource_cache(fGpu)->resourceAccess().didChangeBudgetStatus(this); 206afe3005be3392e43bc51eb7eb2017eefaed85ad1bsalomon } 207afe3005be3392e43bc51eb7eb2017eefaed85ad1bsalomon} 208afe3005be3392e43bc51eb7eb2017eefaed85ad1bsalomon 209c2f35b750a57d7dc0b8053a98279631d1ccb9b56bsalomonvoid GrGpuResource::makeUnbudgeted() { 2102e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen if (!this->wasDestroyed() && SkBudgeted::kYes == fBudgeted && 211c6363ef7b4763b36a9a0d255bc775a973d2fc7a5bsalomon !fUniqueKey.isValid()) { 2122e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen fBudgeted = SkBudgeted::kNo; 2130ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon get_resource_cache(fGpu)->resourceAccess().didChangeBudgetStatus(this); 214c2f35b750a57d7dc0b8053a98279631d1ccb9b56bsalomon } 215c2f35b750a57d7dc0b8053a98279631d1ccb9b56bsalomon} 216c2f35b750a57d7dc0b8053a98279631d1ccb9b56bsalomon 2176d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomonuint32_t GrGpuResource::CreateUniqueID() { 218c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon static int32_t gUniqueID = SK_InvalidUniqueID; 219c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon uint32_t id; 220c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon do { 221c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon id = static_cast<uint32_t>(sk_atomic_inc(&gUniqueID) + 1); 222c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon } while (id == SK_InvalidUniqueID); 223c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon return id; 224c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon} 225