-#include "extension.h"
-#include "ext_framebuffer_multisample.h"
-#include "ext_framebuffer_object.h"
+#include <msp/gl/extensions/arb_direct_state_access.h>
+#include <msp/gl/extensions/ext_framebuffer_multisample.h>
+#include <msp/gl/extensions/ext_framebuffer_object.h>
#include "renderbuffer.h"
namespace Msp {
Renderbuffer::Renderbuffer()
{
- static RequireExtension _ext("GL_EXT_framebuffer_object");
+ static Require _req(EXT_framebuffer_object);
- glGenRenderbuffersEXT(1, &id);
+ if(ARB_direct_state_access)
+ glCreateRenderbuffers(1, &id);
+ else
+ glGenRenderbuffers(1, &id);
}
Renderbuffer::~Renderbuffer()
{
- glDeleteRenderbuffersEXT(1, &id);
+ glDeleteRenderbuffers(1, &id);
+}
+
+PixelFormat Renderbuffer::normalize_format(PixelFormat fmt)
+{
+ if(!get_component_size(fmt) && MSP_sized_internal_formats)
+ {
+ unsigned size = (fmt==DEPTH_COMPONENT ? get_gl_api()==OPENGL_ES2 ? 2 : 4 : 1);
+ return get_sized_pixelformat(fmt, size);
+ }
+
+ return fmt;
}
void Renderbuffer::storage(PixelFormat fmt, unsigned wd, unsigned ht)
{
- Bind _bind(this, true);
+ fmt = normalize_format(fmt);
+ require_pixelformat(fmt);
width = wd;
height = ht;
- glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, fmt, width, height);
+ if(ARB_direct_state_access)
+ glNamedRenderbufferStorage(id, fmt, width, height);
+ else
+ {
+ BindRestore _bind(this);
+ glRenderbufferStorage(GL_RENDERBUFFER, fmt, width, height);
+ }
}
void Renderbuffer::storage_multisample(unsigned samples, PixelFormat fmt, unsigned wd, unsigned ht)
{
- static RequireExtension _ext("GL_EXT_framebuffer_multisample");
+ static Require _req(EXT_framebuffer_multisample);
+ fmt = normalize_format(fmt);
+ require_pixelformat(fmt);
- Bind _bind(this, true);
width = wd;
height = ht;
- glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, 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
{
if(set_current(this))
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, id);
+ glBindRenderbuffer(GL_RENDERBUFFER, id);
}
void Renderbuffer::unbind()
{
if(set_current(0))
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
} // namespace GL