/*
 * Copyright 2020 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrD3DCommandSignature_DEFINED
#define GrD3DCommandSignature_DEFINED

#include "include/gpu/d3d/GrD3DTypes.h"
#include "src/gpu/GrManagedResource.h"

class GrD3DGpu;

class GrD3DCommandSignature : public GrManagedResource {
public:
    enum class ForIndexed : bool {
        kYes = true,
        kNo = false
    };
    static sk_sp<GrD3DCommandSignature> Make(GrD3DGpu* gpu, ForIndexed indexed, unsigned int slot);

    bool isCompatible(ForIndexed indexed, unsigned int slot) const {
        return (fIndexed == indexed && fSlot == slot);
    }

    ID3D12CommandSignature* commandSignature() const { return fCommandSignature.Get(); }

#ifdef SK_TRACE_MANAGED_RESOURCES
    /** Output a human-readable dump of this resource's information
    */
    void dumpInfo() const override {
        SkDebugf("GrD3DCommandSignature: %p, (%d refs)\n",
                 fCommandSignature.Get(), this->getRefCnt());
    }
#endif

private:
    GrD3DCommandSignature(ComPtr<ID3D12CommandSignature> commandSignature, ForIndexed indexed,
                          unsigned int slot)
        : fCommandSignature(commandSignature)
        , fIndexed(indexed)
        , fSlot(slot) {}

    // This will be called right before this class is destroyed and there is no reason to explicitly
    // release the fCommandSignature cause the ComPtr will handle that in the dtor.
    void freeGPUData() const override {}

    ComPtr<ID3D12CommandSignature> fCommandSignature;
    ForIndexed fIndexed;
    unsigned int fSlot;
};

#endif
