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>
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 if(ARB_direct_state_access)
34 glNamedRenderbufferStorage(id, fmt, width, height);
37 BindRestore _bind(this);
38 glRenderbufferStorage(GL_RENDERBUFFER, fmt, width, height);
42 unsigned Renderbuffer::get_max_samples()
44 static unsigned max_samples = (EXT_framebuffer_multisample ? get_i(GL_MAX_SAMPLES) : 0);
48 void Renderbuffer::storage_multisample(unsigned samples, PixelFormat fmt, unsigned wd, unsigned ht)
51 return storage(fmt, wd, ht);
53 static Require _req(EXT_framebuffer_multisample);
54 if(samples>get_max_samples())
55 throw out_of_range("Renderbuffer::storage_multisample");
57 require_pixelformat(fmt);
61 if(ARB_direct_state_access)
62 glNamedRenderbufferStorageMultisample(id, samples, fmt, width, height);
65 BindRestore _bind(this);
66 glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, fmt, width, height);
70 void Renderbuffer::bind() const
73 glBindRenderbuffer(GL_RENDERBUFFER, id);
76 void Renderbuffer::unbind()
79 glBindRenderbuffer(GL_RENDERBUFFER, 0);
82 void Renderbuffer::set_debug_name(const string &name)
86 glObjectLabel(GL_RENDERBUFFER, id, name.size(), name.c_str());