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


#ifndef GrStencilAttachment_DEFINED
#define GrStencilAttachment_DEFINED

#include "GrGpuResource.h"
#include "SkClipStack.h"

class GrRenderTarget;
class GrResourceKey;

class GrStencilAttachment : public GrGpuResource {
public:
    ~GrStencilAttachment() override {
        // TODO: allow SB to be purged and detach itself from rts
    }

    int width() const { return fWidth; }
    int height() const { return fHeight; }
    int bits() const { return fBits; }
    int numSamples() const { return fSampleCnt; }
    bool isDirty() const { return fIsDirty; }

    void cleared() { fIsDirty = false; }

    // We create a unique stencil buffer at each width, height and sampleCnt and share it for
    // all render targets that require a stencil with those params.
    static void ComputeSharedStencilAttachmentKey(int width, int height, int sampleCnt,
                                                  GrUniqueKey* key);

protected:
    GrStencilAttachment(GrGpu* gpu, int width, int height, int bits, int sampleCnt)
            : INHERITED(gpu)
            , fWidth(width)
            , fHeight(height)
            , fBits(bits)
            , fSampleCnt(sampleCnt)
            , fIsDirty(true) {
    }

private:
    const char* getResourceType() const override { return "Stencil"; }

    int fWidth;
    int fHeight;
    int fBits;
    int fSampleCnt;
    bool fIsDirty;

    typedef GrGpuResource INHERITED;
};

#endif
