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

#include "gl/GrGLInterface.h"
#include "GrStencilAttachment.h"

class GrGLStencilAttachment : public GrStencilAttachment {
public:
    static const GrGLenum kUnknownInternalFormat = ~0U;
    static const GrGLuint kUnknownBitCount = ~0U;
    struct Format {
        GrGLenum  fInternalFormat;
        GrGLuint  fStencilBits;
        GrGLuint  fTotalBits;
        bool      fPacked;
    };

    struct IDDesc {
        IDDesc() : fRenderbufferID(0), fLifeCycle(kCached_LifeCycle) {}
        GrGLuint fRenderbufferID;
        GrGpuResource::LifeCycle fLifeCycle;
    };

    GrGLStencilAttachment(GrGpu* gpu,
                      const IDDesc& idDesc,
                      int width, int height,
                      int sampleCnt,
                      const Format& format)
        : GrStencilAttachment(gpu, idDesc.fLifeCycle, width, height, format.fStencilBits, sampleCnt)
        , fFormat(format)
        , fRenderbufferID(idDesc.fRenderbufferID) {
        this->registerWithCache();
    }

    GrGLuint renderbufferID() const {
        return fRenderbufferID;
    }

    const Format& format() const { return fFormat; }

protected:
    // overrides of GrResource
    void onRelease() override;
    void onAbandon() override;

private:
    size_t onGpuMemorySize() const override;

    Format fFormat;
    // may be zero for external SBs associated with external RTs
    // (we don't require the client to give us the id, just tell
    // us how many bits of stencil there are).
    GrGLuint fRenderbufferID;

    typedef GrStencilAttachment INHERITED;
};

#endif
