/*
 * 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 GrD3DAttachment_DEFINED
#define GrD3DAttachment_DEFINED

#include "src/gpu/ganesh/GrAttachment.h"

#include "include/gpu/d3d/GrD3DTypes.h"
#include "src/gpu/ganesh/d3d/GrD3DDescriptorHeap.h"
#include "src/gpu/ganesh/d3d/GrD3DTextureResource.h"

class GrD3DGpu;

class GrD3DAttachment : public GrAttachment, public GrD3DTextureResource {
public:
    static sk_sp<GrD3DAttachment> MakeStencil(GrD3DGpu* gpu,
                                              SkISize dimensions,
                                              int sampleCnt,
                                              DXGI_FORMAT format);

    ~GrD3DAttachment() override {}

    GrBackendFormat backendFormat() const override { return GrBackendFormat::MakeDxgi(fFormat); }

    D3D12_CPU_DESCRIPTOR_HANDLE view() const { return fView.fHandle; }

protected:
    void onRelease() override;
    void onAbandon() override;

private:
    GrD3DAttachment(GrD3DGpu* gpu,
                    SkISize dimensions,
                    UsageFlags supportedUsages,
                    DXGI_FORMAT format,
                    const D3D12_RESOURCE_DESC&,
                    const GrD3DTextureResourceInfo&,
                    sk_sp<GrD3DResourceState>,
                    const GrD3DDescriptorHeap::CPUHandle& view,
                    std::string_view label);

    GrD3DGpu* getD3DGpu() const;

    void onSetLabel() override;

    GrD3DDescriptorHeap::CPUHandle fView;
    DXGI_FORMAT fFormat;
};

#endif
