X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fframebuffer.cpp;h=23b39f2d691c8de06aeaf378be10c25fe39db601;hp=c90d6a70670b4560155d6a84f86d613a9565b193;hb=1863f17c5c5563be8492d7f01e5c613a740ea1e9;hpb=ccd636b2fa8b9f270fbe600629dd109e78d00992 diff --git a/source/core/framebuffer.cpp b/source/core/framebuffer.cpp index c90d6a70..23b39f2d 100644 --- a/source/core/framebuffer.cpp +++ b/source/core/framebuffer.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "error.h" #include "framebuffer.h" #include "misc.h" @@ -121,13 +122,15 @@ void Framebuffer::update_attachment(unsigned mask) const { 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) @@ -251,6 +254,20 @@ void Framebuffer::attach(FramebufferAttachment attch, TextureCube &tex, TextureC 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) @@ -377,6 +394,16 @@ void Framebuffer::unbind() 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); @@ -399,7 +426,7 @@ void Framebuffer::Attachment::set(Renderbuffer &r) 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;