blob: 06490fd61f74f335910e40b69a6ddca4cb5aaa90 [file] [log] [blame]
/*
* Copyright 2020 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/GrManagedResource.h"
#include "src/gpu/GrGpuResourcePriv.h"
#include "src/gpu/GrTexture.h"
#ifdef SK_TRACE_MANAGED_RESOURCES
std::atomic<uint32_t> GrManagedResource::fKeyCounter{0};
#endif
void GrTextureResource::addIdleProc(GrTexture* owningTexture,
sk_sp<GrRefCntedCallback> idleProc) const {
SkASSERT(!fOwningTexture || fOwningTexture == owningTexture);
fOwningTexture = owningTexture;
fIdleProcs.push_back(std::move(idleProc));
}
int GrTextureResource::idleProcCnt() const { return fIdleProcs.count(); }
sk_sp<GrRefCntedCallback> GrTextureResource::idleProc(int i) const { return fIdleProcs[i]; }
void GrTextureResource::resetIdleProcs() const { fIdleProcs.reset(); }
void GrTextureResource::removeOwningTexture() const { fOwningTexture = nullptr; }
void GrTextureResource::notifyQueuedForWorkOnGpu() const { ++fNumOwners; }
void GrTextureResource::notifyFinishedWithWorkOnGpu() const {
SkASSERT(fNumOwners);
if (--fNumOwners || !fIdleProcs.count()) {
return;
}
if (fOwningTexture) {
if (fOwningTexture->resourcePriv().hasRef()) {
// Wait for the texture to become idle in the cache to call the procs.
return;
}
fOwningTexture->callIdleProcsOnBehalfOfResource();
} else {
fIdleProcs.reset();
}
}