X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frenderbuffer.cpp;h=5bea07fc81e60a70c26c7744f3e7d5a6434bc621;hp=8f0b582a1ba7b6cf0249dd27ee95a252c368d97f;hb=bf1f59c4dca6b651e39c126c63a0780b65a34927;hpb=41b4cb3002f3551ce1bd6fdf15994ee7bc523788 diff --git a/source/renderbuffer.cpp b/source/renderbuffer.cpp index 8f0b582a..5bea07fc 100644 --- a/source/renderbuffer.cpp +++ b/source/renderbuffer.cpp @@ -1,7 +1,11 @@ -#include "ext_framebuffer_multisample.h" -#include "ext_framebuffer_object.h" +#include +#include +#include +#include "misc.h" #include "renderbuffer.h" +using namespace std; + namespace Msp { namespace GL { @@ -9,7 +13,10 @@ Renderbuffer::Renderbuffer() { static Require _req(EXT_framebuffer_object); - glGenRenderbuffers(1, &id); + if(ARB_direct_state_access) + glCreateRenderbuffers(1, &id); + else + glGenRenderbuffers(1, &id); } Renderbuffer::~Renderbuffer() @@ -17,24 +24,56 @@ Renderbuffer::~Renderbuffer() glDeleteRenderbuffers(1, &id); } +PixelFormat Renderbuffer::normalize_format(PixelFormat fmt) +{ + if(!get_component_size(fmt) && OES_required_internalformat) + return get_default_sized_pixelformat(fmt); + + return fmt; +} + void Renderbuffer::storage(PixelFormat fmt, unsigned wd, unsigned ht) { + fmt = normalize_format(fmt); require_pixelformat(fmt); - Bind _bind(this, true); width = wd; height = ht; - glRenderbufferStorage(GL_RENDERBUFFER, fmt, width, height); + if(ARB_direct_state_access) + glNamedRenderbufferStorage(id, fmt, width, height); + else + { + BindRestore _bind(this); + glRenderbufferStorage(GL_RENDERBUFFER, fmt, width, height); + } +} + +unsigned Renderbuffer::get_max_samples() +{ + static unsigned max_samples = (EXT_framebuffer_multisample ? get_i(GL_MAX_SAMPLES) : 0); + return max_samples; } void Renderbuffer::storage_multisample(unsigned samples, PixelFormat fmt, unsigned wd, unsigned ht) { + if(!samples) + return storage(fmt, wd, ht); + static Require _req(EXT_framebuffer_multisample); + if(samples>get_max_samples()) + throw out_of_range("Renderbuffer::storage_multisample"); + + fmt = normalize_format(fmt); require_pixelformat(fmt); - Bind _bind(this, true); width = wd; height = ht; - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, fmt, width, height); + if(ARB_direct_state_access) + glNamedRenderbufferStorageMultisample(id, samples, fmt, width, height); + else + { + BindRestore _bind(this); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, fmt, width, height); + } } void Renderbuffer::bind() const