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

#include "GrFrameBufferObj.h"
#include "GrFBBindableObj.h"

void GrFrameBufferObj::setColor(GrFBBindableObj *buffer) {
    if (fColorBuffer) {
        // automatically break the binding of the old buffer
        GrAlwaysAssert(fColorBuffer->getColorBound(this));
        fColorBuffer->resetColorBound(this);

        GrAlwaysAssert(!fColorBuffer->getDeleted());
        fColorBuffer->unref();
    }
    fColorBuffer = buffer;
    if (fColorBuffer) {
        GrAlwaysAssert(!fColorBuffer->getDeleted());
        fColorBuffer->ref();

        GrAlwaysAssert(!fColorBuffer->getColorBound(this));
        fColorBuffer->setColorBound(this);
    }
}

void GrFrameBufferObj::setDepth(GrFBBindableObj *buffer) {
    if (fDepthBuffer) {
        // automatically break the binding of the old buffer
        GrAlwaysAssert(fDepthBuffer->getDepthBound(this));
        fDepthBuffer->resetDepthBound(this);

        GrAlwaysAssert(!fDepthBuffer->getDeleted());
        fDepthBuffer->unref();
    }
    fDepthBuffer = buffer;
    if (fDepthBuffer) {
        GrAlwaysAssert(!fDepthBuffer->getDeleted());
        fDepthBuffer->ref();

        GrAlwaysAssert(!fDepthBuffer->getDepthBound(this));
        fDepthBuffer->setDepthBound(this);
    }
}

void GrFrameBufferObj::setStencil(GrFBBindableObj *buffer) {
    if (fStencilBuffer) {
        // automatically break the binding of the old buffer
        GrAlwaysAssert(fStencilBuffer->getStencilBound(this));
        fStencilBuffer->resetStencilBound(this);

        //GrAlwaysAssert(!fStencilBuffer->getDeleted());
        fStencilBuffer->unref();
    }
    fStencilBuffer = buffer;
    if (fStencilBuffer) {
        GrAlwaysAssert(!fStencilBuffer->getDeleted());
        fStencilBuffer->ref();

        GrAlwaysAssert(!fStencilBuffer->getStencilBound(this));
        fStencilBuffer->setStencilBound(this);
    }
}
