/*
 * 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"

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();
    }
}
