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

#ifndef GrFBBindableObj_DEFINED
#define GrFBBindableObj_DEFINED

#include "SkTDArray.h"
#include "GrFakeRefObj.h"

////////////////////////////////////////////////////////////////////////////////
// A common base class for render buffers and textures
class GrFBBindableObj : public GrFakeRefObj {

public:
    GrFBBindableObj()
        : GrFakeRefObj() {
    }

    virtual ~GrFBBindableObj() {
        GrAlwaysAssert(0 == fColorReferees.count());
        GrAlwaysAssert(0 == fDepthReferees.count());
        GrAlwaysAssert(0 == fStencilReferees.count());
    }

    void setColorBound(GrFakeRefObj *referee) {
        fColorReferees.append(1, &referee);
    }
    void resetColorBound(GrFakeRefObj *referee) {
        int index = fColorReferees.find(referee);
        GrAlwaysAssert(0 <= index);
        fColorReferees.removeShuffle(index);
    }
    bool getColorBound(GrFakeRefObj *referee) const {
        int index = fColorReferees.find(referee);
        return 0 <= index;
    }
    bool getColorBound() const {
        return 0 != fColorReferees.count();
    }

    void setDepthBound(GrFakeRefObj *referee) {
        fDepthReferees.append(1, &referee);
    }
    void resetDepthBound(GrFakeRefObj *referee) {
        int index = fDepthReferees.find(referee);
        GrAlwaysAssert(0 <= index);
        fDepthReferees.removeShuffle(index);
    }
    bool getDepthBound(GrFakeRefObj *referee) const {
        int index = fDepthReferees.find(referee);
        return 0 <= index;
    }
    bool getDepthBound() const {
        return 0 != fDepthReferees.count();
    }

    void setStencilBound(GrFakeRefObj *referee) {
        fStencilReferees.append(1, &referee);
    }
    void resetStencilBound(GrFakeRefObj *referee) {
        int index = fStencilReferees.find(referee);
        GrAlwaysAssert(0 <= index);
        fStencilReferees.removeShuffle(index);
    }
    bool getStencilBound(GrFakeRefObj *referee) const {
        int index = fStencilReferees.find(referee);
        return 0 <= index;
    }
    bool getStencilBound() const {
        return 0 != fStencilReferees.count();
    }


protected:
private:
    SkTDArray<GrFakeRefObj *> fColorReferees;   // frame buffers that use this as a color buffer (via "glFramebufferRenderbuffer" or "glFramebufferTexture2D")
    SkTDArray<GrFakeRefObj *> fDepthReferees;   // frame buffers that use this as a depth buffer (via "glFramebufferRenderbuffer" or "glFramebufferTexture2D")
    SkTDArray<GrFakeRefObj *> fStencilReferees; // frame buffers that use this as a stencil buffer (via "glFramebufferRenderbuffer" or "glFramebufferTexture2D")

    typedef GrFakeRefObj INHERITED;
};

#endif // GrFBBindableObj_DEFINED
