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