From 87b74b1263710b0acb9e0b72283e972fd54ee91b Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Thu, 6 May 2021 11:14:47 +0300 Subject: [PATCH] Support layered framebuffer attachments --- source/core/framebuffer.cpp | 20 ++++++++++++++++++-- source/core/framebuffer.h | 6 ++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/source/core/framebuffer.cpp b/source/core/framebuffer.cpp index c90d6a70..810f0cf1 100644 --- a/source/core/framebuffer.cpp +++ b/source/core/framebuffer.cpp @@ -121,13 +121,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 +253,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) @@ -399,7 +415,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; diff --git a/source/core/framebuffer.h b/source/core/framebuffer.h index 3086685e..88ab465a 100644 --- a/source/core/framebuffer.h +++ b/source/core/framebuffer.h @@ -82,11 +82,11 @@ private: Texture *tex; }; unsigned level; - unsigned layer; + int layer; Attachment(FramebufferAttachment); void set(Renderbuffer &); - void set(Texture &, unsigned, unsigned); + void set(Texture &, unsigned, int); void clear(); }; @@ -125,6 +125,8 @@ public: void attach(FramebufferAttachment attch, Texture2D &tex, unsigned level = 0); void attach(FramebufferAttachment attch, Texture3D &tex, unsigned layer, unsigned level = 0); void attach(FramebufferAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0); + void attach_layered(FramebufferAttachment attch, Texture3D &tex, unsigned level = 0); + void attach_layered(FramebufferAttachment attch, TextureCube &tex, unsigned level = 0); void detach(FramebufferAttachment attch); /** Checks the completeness of the framebuffer. Returns -- 2.43.0