/* $Id$
This file is part of libmspgl
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
+Copyright © 2007-2011 Mikko Rasa, Mikkosoft Productions
Distributed under the LGPL
*/
#include "extension.h"
+#include "ext_framebuffer_blit.h"
#include "ext_framebuffer_object.h"
#include "framebuffer.h"
#include "misc.h"
{
if(current()==this)
{
- bool has_color = false;
- bool has_depth = false;
+ GLenum color_buf = GL_NONE;
for(unsigned i=0; i<attachments.size(); ++i)
{
const Attachment &attch = attachments[i];
if(attch.type==GL_RENDERBUFFER_EXT)
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch.attachment, GL_RENDERBUFFER_EXT, 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);
+ }
else
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch.attachment, 0, 0);
}
if(attch.attachment>=COLOR_ATTACHMENT0 && attch.attachment<=COLOR_ATTACHMENT3)
- has_color = true;
- if(attch.attachment==DEPTH_ATTACHMENT)
- has_depth = true;
+ color_buf = attch.attachment;
}
- glDrawBuffer(has_color ? GL_FRONT : GL_NONE);
- glDepthMask(has_depth);
+ glDrawBuffer(color_buf);
}
else
dirty |= mask;
check_size();
}
-void Framebuffer::attach(FramebufferAttachment attch, Texture2D &tex, int level)
+void Framebuffer::attach(FramebufferAttachment attch, Texture2D &tex, unsigned level)
{
if(!id)
throw InvalidState("Can't attach to system framebuffer");
glClear(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");
+
+ const Framebuffer *old = current();
+ if(set_current(this))
+ {
+ glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, id);
+ if(dirty)
+ {
+ update_attachment(dirty);
+ dirty = 0;
+ }
+ }
+ if(old!=&other)
+ glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, other.id);
+
+ glBlitFramebufferEXT(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));
+}
+
+void Framebuffer::blit_from(const Framebuffer &other, int sx, int sy, unsigned wd, unsigned ht, int dx, int dy, BufferBits bits)
+{
+ blit_from(other, sx, sy, sx+wd, sy+ht, dx, dy, dx+wd, dy+ht, bits, false);
+}
+
+void Framebuffer::blit_from(const Framebuffer &other, BufferBits bits, bool filter)
+{
+ blit_from(other, 0, 0, other.width, other.height, 0, 0, width, height, bits, filter);
+}
+
void Framebuffer::bind() const
{
if(set_current(this))
level = 0;
}
-void Framebuffer::Attachment::set(Texture &t, int l)
+void Framebuffer::Attachment::set(Texture &t, unsigned l)
{
type = t.get_target();
tex = &t;