/* * Copyright 2022 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/gpu/graphite/Resource.h" #include "src/gpu/graphite/ResourceCache.h" namespace skgpu::graphite { Resource::Resource(const SharedContext* sharedContext, Ownership ownership, skgpu::Budgeted budgeted) : fSharedContext(sharedContext) , fUsageRefCnt(1) , fCommandBufferRefCnt(0) , fCacheRefCnt(0) , fOwnership(ownership) , fBudgeted(budgeted) { // If we don't own the resource that must mean its wrapped in a client object. Thus we should // not be budgeted SkASSERT(fOwnership == Ownership::kOwned || fBudgeted == skgpu::Budgeted::kNo); } Resource::~Resource() { // The cache should have released or destroyed this resource. SkASSERT(this->wasDestroyed()); } void Resource::registerWithCache(sk_sp returnCache) { SkASSERT(!fReturnCache); SkASSERT(returnCache); fReturnCache = std::move(returnCache); } bool Resource::notifyARefIsZero(LastRemovedRef removedRef) const { // No resource should have been destroyed if there was still any sort of ref on it. SkASSERT(!this->wasDestroyed()); Resource* mutableThis = const_cast(this); // TODO: We have not switched all resources to use the ResourceCache yet. Once we do we should // be able to assert that we have an fCacheReturn. // SkASSERT(fReturnCache); if (removedRef != LastRemovedRef::kCache && fReturnCache && fReturnCache->returnResource(mutableThis, removedRef)) { return false; } if (!this->hasAnyRefs()) { return true; } return false; } void Resource::internalDispose() { SkASSERT(fSharedContext); this->freeGpuData(); fSharedContext = nullptr; // TODO: If we ever support freeing all the backend objects without deleting the object, we'll // need to add a hasAnyRefs() check here. delete this; } bool Resource::isPurgeable() const { return !this->hasAnyRefs(); } } // namespace skgpu::graphite