#include <msp/gl/extensions/ext_texture_array.h>
#include <msp/gl/extensions/ext_texture3d.h>
#include <msp/gl/extensions/msp_buffer_control.h>
+#include <msp/gl/extensions/khr_debug.h>
#include "error.h"
#include "framebuffer.h"
#include "misc.h"
{
if(ARB_direct_state_access)
{
- if(attch.type==GL_TEXTURE_2D)
+ if(attch.type==GL_TEXTURE_2D || attch.layer<0)
glNamedFramebufferTexture(id, attch.attachment, attch.tex->get_id(), attch.level);
else
glNamedFramebufferTextureLayer(id, attch.attachment, attch.tex->get_id(), attch.level, attch.layer);
}
else if(attch.type==GL_TEXTURE_2D)
glFramebufferTexture2D(GL_FRAMEBUFFER, attch.attachment, attch.type, attch.tex->get_id(), attch.level);
+ else if(attch.layer<0)
+ glFramebufferTexture(GL_FRAMEBUFFER, attch.attachment, attch.tex->get_id(), attch.level);
else if(attch.type==GL_TEXTURE_2D_ARRAY)
glFramebufferTextureLayer(GL_FRAMEBUFFER, attch.attachment, attch.tex->get_id(), attch.level, attch.layer);
else if(attch.type==GL_TEXTURE_3D)
set_texture_attachment(attch, tex, level, TextureCube::get_face_index(face));
}
+void Framebuffer::attach_layered(FramebufferAttachment attch, Texture3D &tex, unsigned level)
+{
+ static Require _req(ARB_geometry_shader4);
+ tex.allocate(level);
+ set_texture_attachment(attch, tex, level, -1);
+}
+
+void Framebuffer::attach_layered(FramebufferAttachment attch, TextureCube &tex, unsigned level)
+{
+ static Require _req(ARB_geometry_shader4);
+ tex.allocate(level);
+ set_texture_attachment(attch, tex, level, -1);
+}
+
void Framebuffer::detach(FramebufferAttachment attch)
{
if(!id)
system().bind();
}
+void Framebuffer::set_debug_name(const string &name)
+{
+#ifdef DEBUG
+ if(KHR_debug)
+ glObjectLabel(GL_FRAMEBUFFER, id, name.size(), name.c_str());
+#else
+ (void)name;
+#endif
+}
+
Framebuffer &Framebuffer::system()
{
static Framebuffer sys_framebuf(0);
layer = 0;
}
-void Framebuffer::Attachment::set(Texture &t, unsigned l, unsigned z)
+void Framebuffer::Attachment::set(Texture &t, unsigned l, int z)
{
type = t.get_target();
tex = &t;