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

#ifndef GrDawnTexture_DEFINED
#define GrDawnTexture_DEFINED

#include "include/gpu/GrTexture.h"
#include "dawn/dawncpp.h"

class GrDawnGpu;
struct GrDawnImageInfo;

class GrDawnTexture : public GrTexture {
public:
    static sk_sp<GrDawnTexture> Make(GrDawnGpu*, const SkISize& dimensions, GrPixelConfig config,
                                     wgpu::TextureFormat format, GrRenderable, int sampleCnt,
                                     SkBudgeted, int mipLevels, GrMipMapsStatus);

    static sk_sp<GrDawnTexture> MakeWrapped(GrDawnGpu*, const SkISize& dimensions,
                                            GrPixelConfig config, GrRenderable, int sampleCnt,
                                            GrMipMapsStatus, GrWrapCacheable,
                                            const GrDawnImageInfo&);

    ~GrDawnTexture() override;

    GrBackendTexture getBackendTexture() const override;
    GrBackendFormat backendFormat() const override;

    void textureParamsModified() override {}

    void upload(const GrMipLevel texels[], int mipLevels, wgpu::CommandEncoder copyEncoder);
    void upload(const GrMipLevel texels[], int mipLevels, const SkIRect& dstRect,
                wgpu::CommandEncoder copyEncoder);

    wgpu::Texture texture() const { return fInfo.fTexture; }
    wgpu::TextureView textureView() const { return fTextureView; }
protected:
    GrDawnTexture(GrDawnGpu*, const SkISize& dimensions, GrPixelConfig config, wgpu::TextureView,
                  const GrDawnImageInfo&, GrMipMapsStatus);

    GrDawnGpu* getDawnGpu() const;

    void onAbandon() override;
    void onRelease() override;

    bool onStealBackendTexture(GrBackendTexture*, SkImage::BackendTextureReleaseProc*) override {
        return false;
    }

private:
    GrDawnTexture(GrDawnGpu*, const GrSurfaceDesc&, const GrDawnImageInfo&, GrMipMapsStatus);

    GrDawnImageInfo          fInfo;
    wgpu::TextureView        fTextureView;

    typedef GrTexture INHERITED;
};

#endif
