X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fframebuffer.cpp;h=93a726868c040d6464382ead82c148d58ed20c08;hp=4dbb30929e05dc38ff822c981b51e251613f61bb;hb=cd5f37b066352119cf92d53d0001af7ff99be437;hpb=ce3658993ce2f6b7527a04a36a5e1af349c6f2e9 diff --git a/source/core/framebuffer.cpp b/source/core/framebuffer.cpp index 4dbb3092..93a72686 100644 --- a/source/core/framebuffer.cpp +++ b/source/core/framebuffer.cpp @@ -8,8 +8,8 @@ #include "error.h" #include "framebuffer.h" #include "misc.h" -#include "renderbuffer.h" #include "texture2d.h" +#include "texture2dmultisample.h" #include "texture3d.h" #include "windowview.h" @@ -106,37 +106,31 @@ void Framebuffer::update() const const Attachment &attch = attachments[i]; if(dirty&(1<get_id()); - else - glFramebufferRenderbuffer(GL_FRAMEBUFFER, attch.attachment, GL_RENDERBUFFER, attch.rbuf->get_id()); - } - else if(attch.type) + if(attch.tex) { + GLenum type = attch.tex->get_target(); if(ARB_direct_state_access) { - if(attch.type==GL_TEXTURE_2D || attch.layer<0) + if(type==GL_TEXTURE_2D || type==GL_TEXTURE_2D_MULTISAMPLE || 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(type==GL_TEXTURE_2D || type==GL_TEXTURE_2D_MULTISAMPLE) + glFramebufferTexture2D(GL_FRAMEBUFFER, attch.attachment, 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) + else if(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) - glFramebufferTexture3D(GL_FRAMEBUFFER, attch.attachment, attch.type, attch.tex->get_id(), attch.level, attch.layer); - else if(attch.type==GL_TEXTURE_CUBE_MAP) + else if(type==GL_TEXTURE_3D) + glFramebufferTexture3D(GL_FRAMEBUFFER, attch.attachment, type, attch.tex->get_id(), attch.level, attch.layer); + else if(type==GL_TEXTURE_CUBE_MAP) glFramebufferTexture2D(GL_FRAMEBUFFER, attch.attachment, TextureCube::enumerate_faces(attch.layer), attch.tex->get_id(), attch.level); } else if(ARB_direct_state_access) - glNamedFramebufferRenderbuffer(id, attch.attachment, 0, 0); + glNamedFramebufferTexture(id, attch.attachment, 0, 0); else - glFramebufferRenderbuffer(GL_FRAMEBUFFER, attch.attachment, 0, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, attch.attachment, GL_TEXTURE_2D, 0, 0); } if(attch.attachment>=COLOR_ATTACHMENT0 && attch.attachment<=COLOR_ATTACHMENT3) @@ -176,26 +170,28 @@ void Framebuffer::update() const void Framebuffer::check_size() { for(vector::iterator i=attachments.begin(); i!=attachments.end(); ++i) - if(i->type) + if(i->tex) { - if(i->type==GL_RENDERBUFFER) - { - width = i->rbuf->get_width(); - height = i->rbuf->get_height(); - } - else if(i->type==GL_TEXTURE_2D) + GLenum type = i->tex->get_target(); + if(type==GL_TEXTURE_2D) { Texture2D *tex = static_cast(i->tex); width = max(tex->get_width()>>i->level, 1U); height = max(tex->get_height()>>i->level, 1U); } - else if(i->type==GL_TEXTURE_3D || i->type==GL_TEXTURE_2D_ARRAY) + else if(type==GL_TEXTURE_2D_MULTISAMPLE) + { + Texture2DMultisample *tex = static_cast(i->tex); + width = tex->get_width(); + height = tex->get_height(); + } + else if(type==GL_TEXTURE_3D || type==GL_TEXTURE_2D_ARRAY) { Texture3D *tex = static_cast(i->tex); width = max(tex->get_width()>>i->level, 1U); height = max(tex->get_height()>>i->level, 1U); } - else if(i->type==GL_TEXTURE_CUBE_MAP) + else if(type==GL_TEXTURE_CUBE_MAP) { width = max(static_cast(i->tex)->get_size()>>i->level, 1U); height = width; @@ -213,7 +209,7 @@ unsigned Framebuffer::get_attachment_index(FramebufferAttachment attch) return attachments.size()-1; } -void Framebuffer::set_texture_attachment(FramebufferAttachment attch, Texture &tex, unsigned level, int layer) +void Framebuffer::set_attachment(FrameAttachment attch, Texture &tex, unsigned level, int layer) { if(!id) throw invalid_operation("Framebuffer::attach"); @@ -224,47 +220,41 @@ void Framebuffer::set_texture_attachment(FramebufferAttachment attch, Texture &t check_size(); } -void Framebuffer::attach(FramebufferAttachment attch, Renderbuffer &rbuf) +void Framebuffer::attach(FramebufferAttachment attch, Texture2D &tex, unsigned level) { - if(!id) - throw invalid_operation("Framebuffer::attach"); - - unsigned i = get_attachment_index(attch); - attachments[i].set(rbuf); - dirty |= 1<