1 #include <msp/gl/extensions/arb_direct_state_access.h>
2 #include <msp/gl/extensions/ext_framebuffer_multisample.h>
3 #include <msp/gl/extensions/ext_framebuffer_object.h>
4 #include <msp/gl/extensions/khr_debug.h>
5 #include "deviceinfo.h"
6 #include "renderbuffer.h"
13 Renderbuffer::Renderbuffer()
15 static Require _req(EXT_framebuffer_object);
17 if(ARB_direct_state_access)
18 glCreateRenderbuffers(1, &id);
20 glGenRenderbuffers(1, &id);
23 Renderbuffer::~Renderbuffer()
25 glDeleteRenderbuffers(1, &id);
28 void Renderbuffer::storage(PixelFormat fmt, unsigned wd, unsigned ht)
30 require_pixelformat(fmt);
33 GLenum gl_fmt = get_gl_pixelformat(fmt);
34 if(ARB_direct_state_access)
35 glNamedRenderbufferStorage(id, gl_fmt, width, height);
38 glBindRenderbuffer(GL_RENDERBUFFER, id);
39 glRenderbufferStorage(GL_RENDERBUFFER, gl_fmt, width, height);
40 glBindRenderbuffer(GL_RENDERBUFFER, 0);
44 unsigned Renderbuffer::get_max_samples()
46 return Limits::get_global().max_samples;
49 void Renderbuffer::storage_multisample(unsigned samples, PixelFormat fmt, unsigned wd, unsigned ht)
52 return storage(fmt, wd, ht);
54 static Require _req(EXT_framebuffer_multisample);
55 if(samples>Limits::get_global().max_samples)
56 throw out_of_range("Renderbuffer::storage_multisample");
58 require_pixelformat(fmt);
62 GLenum gl_fmt = get_gl_pixelformat(fmt);
63 if(ARB_direct_state_access)
64 glNamedRenderbufferStorageMultisample(id, samples, gl_fmt, width, height);
67 glBindRenderbuffer(GL_RENDERBUFFER, id);
68 glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, gl_fmt, width, height);
69 glBindRenderbuffer(GL_RENDERBUFFER, 0);
73 void Renderbuffer::set_debug_name(const string &name)
77 glObjectLabel(GL_RENDERBUFFER, id, name.size(), name.c_str());