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

#include "GrFakeRefObj.h"
class GrFBBindableObj;

////////////////////////////////////////////////////////////////////////////////
// TODO: when a framebuffer obj is bound the GL_SAMPLES query must return 0
// TODO: GL_STENCIL_BITS must also be redirected to the framebuffer
class GrFrameBufferObj : public GrFakeRefObj {
    GR_DEFINE_CREATOR(GrFrameBufferObj);

public:
    GrFrameBufferObj()
        : GrFakeRefObj()
        , fBound(false)
        , fColorBuffer(NULL)
        , fDepthBuffer(NULL)
        , fStencilBuffer(NULL) {
    }

    virtual ~GrFrameBufferObj() {
        fColorBuffer = NULL;
        fDepthBuffer = NULL;
        fStencilBuffer = NULL;
    }

    void setBound()         { fBound = true; }
    void resetBound()       { fBound = false; }
    bool getBound() const   { return fBound; }

    void setColor(GrFBBindableObj *buffer);
    GrFBBindableObj *getColor()       { return fColorBuffer; }

    void setDepth(GrFBBindableObj *buffer);
    GrFBBindableObj *getDepth()       { return fDepthBuffer; }

    void setStencil(GrFBBindableObj *buffer);
    GrFBBindableObj *getStencil()     { return fStencilBuffer; }

    virtual void deleteAction() SK_OVERRIDE {

        setColor(NULL);
        setDepth(NULL);
        setStencil(NULL);

        this->INHERITED::deleteAction();
    }

protected:
private:
    bool fBound;        // is this frame buffer currently bound via "glBindFramebuffer"?
    GrFBBindableObj * fColorBuffer;
    GrFBBindableObj * fDepthBuffer;
    GrFBBindableObj * fStencilBuffer;

    typedef GrFakeRefObj INHERITED;
};

#endif // GrFrameBufferObj_DEFINED
