
/*
 * 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; }

    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
