+#include "arb_draw_buffers.h"
#include "error.h"
-#include "extension.h"
#include "ext_framebuffer_blit.h"
#include "ext_framebuffer_object.h"
#include "framebuffer.h"
height(0),
dirty(0)
{
- static RequireExtension _ext("GL_EXT_framebuffer_object");
+ static Require _req(EXT_framebuffer_object);
- glGenFramebuffersEXT(1, &id);
+ glGenFramebuffers(1, &id);
}
Framebuffer::~Framebuffer()
{
if(id)
- glDeleteFramebuffersEXT(1, &id);
+ glDeleteFramebuffers(1, &id);
if(current()==this)
unbind();
}
{
if(current()==this)
{
- GLenum color_buf = GL_NONE;
+ std::vector<GLenum> color_bufs;
+ color_bufs.reserve(attachments.size());
for(unsigned i=0; i<attachments.size(); ++i)
{
const Attachment &attch = attachments[i];
if(mask&(1<<i))
{
- if(attch.type==GL_RENDERBUFFER_EXT)
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch.attachment, GL_RENDERBUFFER_EXT, attch.rbuf->get_id());
+ if(attch.type==GL_RENDERBUFFER)
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, attch.attachment, GL_RENDERBUFFER, attch.rbuf->get_id());
else if(attch.type==GL_TEXTURE_2D)
{
static_cast<Texture2D *>(attch.tex)->allocate(attch.level);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attch.attachment, attch.type, attch.tex->get_id(), attch.level);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, attch.attachment, attch.type, attch.tex->get_id(), attch.level);
}
else if(attch.type==GL_TEXTURE_CUBE_MAP)
{
static_cast<TextureCube *>(attch.tex)->allocate(attch.level);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attch.attachment, attch.cube_face, attch.tex->get_id(), attch.level);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, attch.attachment, attch.cube_face, attch.tex->get_id(), attch.level);
}
else
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch.attachment, 0, 0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, attch.attachment, 0, 0);
}
if(attch.attachment>=COLOR_ATTACHMENT0 && attch.attachment<=COLOR_ATTACHMENT3)
- color_buf = attch.attachment;
+ color_bufs.push_back(attch.attachment);
}
- glDrawBuffer(color_buf);
+ if(color_bufs.empty())
+ glDrawBuffer(GL_NONE);
+ else if(color_bufs.size()==1)
+ glDrawBuffer(color_bufs.front());
+ else
+ {
+ static Require _req(ARB_draw_buffers);
+ glDrawBuffers(color_bufs.size(), &color_bufs[0]);
+ }
}
else
dirty |= mask;
for(vector<Attachment>::iterator i=attachments.begin(); i!=attachments.end(); ++i)
if(i->type)
{
- if(i->type==GL_RENDERBUFFER_EXT)
+ if(i->type==GL_RENDERBUFFER)
{
width = i->rbuf->get_width();
height = i->rbuf->get_height();
FramebufferStatus Framebuffer::check_status() const
{
Bind _bind(this, true);
- return static_cast<FramebufferStatus>(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
+ return static_cast<FramebufferStatus>(glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
void Framebuffer::clear(BufferBits bits)
void Framebuffer::blit_from(const Framebuffer &other, int sx0, int sy0, int sx1, int sy1, int dx0, int dy0, int dx1, int dy1, BufferBits bits, bool filter)
{
- static RequireExtension _ext("GL_EXT_framebuffer_blit");
+ static Require _req(EXT_framebuffer_blit);
const Framebuffer *old = current();
if(set_current(this))
{
- glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, id);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, id);
if(dirty)
{
update_attachment(dirty);
}
}
if(old!=&other)
- glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, other.id);
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, other.id);
- glBlitFramebufferEXT(sx0, sy0, sx1, sy1, dx0, dy0, dx1, dy1, bits, (filter ? GL_LINEAR : GL_NEAREST));
+ glBlitFramebuffer(sx0, sy0, sx1, sy1, dx0, dy0, dx1, dy1, bits, (filter ? GL_LINEAR : GL_NEAREST));
set_current(old);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, (old ? old->id : 0));
+ glBindFramebuffer(GL_FRAMEBUFFER, (old ? old->id : 0));
}
void Framebuffer::blit_from(const Framebuffer &other, int sx, int sy, unsigned wd, unsigned ht, int dx, int dy, BufferBits bits)
{
if(set_current(this))
{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);
+ glBindFramebuffer(GL_FRAMEBUFFER, id);
if(dirty)
{
update_attachment(dirty);
void Framebuffer::Attachment::set(Renderbuffer &r)
{
- type = GL_RENDERBUFFER_EXT;
+ type = GL_RENDERBUFFER;
rbuf = &r;
level = 0;
}