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

#ifndef GrMtlStencil_DEFINED
#define GrMtlStencil_DEFINED

#include "GrStencilAttachment.h"

#import <Metal/Metal.h>

class GrMtlImageView;
class GrMtlGpu;

class GrMtlStencilAttachment : public GrStencilAttachment {
public:
    struct Format {
        MTLPixelFormat fInternalFormat;
        int  fStencilBits;
        int  fTotalBits;
        bool fPacked;
    };

    static GrMtlStencilAttachment* Create(GrMtlGpu* gpu, int width, int height,
                                          int sampleCnt, const Format& format);

    ~GrMtlStencilAttachment() override;

    MTLPixelFormat mtlFormat() const { return fFormat.fInternalFormat; }

    id<MTLTexture> stencilView() const { return fStencilView; }

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

private:
    size_t onGpuMemorySize() const override;

    GrMtlStencilAttachment(GrMtlGpu* gpu,
                           const Format& format,
                           const id<MTLTexture> stencilView);

    GrMtlGpu* getMtlGpu() const;

    Format fFormat;

    id<MTLTexture> fStencilView;
};

#endif
