]> git.tdb.fi Git - libs/gl.git/blob - source/core/renderbuffer.cpp
844fcd3a700e184a07538166e03925f2c848a1b6
[libs/gl.git] / source / core / renderbuffer.cpp
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"
7
8 using namespace std;
9
10 namespace Msp {
11 namespace GL {
12
13 Renderbuffer::Renderbuffer()
14 {
15         static Require _req(EXT_framebuffer_object);
16
17         if(ARB_direct_state_access)
18                 glCreateRenderbuffers(1, &id);
19         else
20                 glGenRenderbuffers(1, &id);
21 }
22
23 Renderbuffer::~Renderbuffer()
24 {
25         glDeleteRenderbuffers(1, &id);
26 }
27
28 void Renderbuffer::storage(PixelFormat fmt, unsigned wd, unsigned ht)
29 {
30         require_pixelformat(fmt);
31         width = wd;
32         height = ht;
33         GLenum gl_fmt = get_gl_pixelformat(fmt);
34         if(ARB_direct_state_access)
35                 glNamedRenderbufferStorage(id, gl_fmt, width, height);
36         else
37         {
38                 glBindRenderbuffer(GL_RENDERBUFFER, id);
39                 glRenderbufferStorage(GL_RENDERBUFFER, gl_fmt, width, height);
40                 glBindRenderbuffer(GL_RENDERBUFFER, 0);
41         }
42 }
43
44 unsigned Renderbuffer::get_max_samples()
45 {
46         return Limits::get_global().max_samples;
47 }
48
49 void Renderbuffer::storage_multisample(unsigned samples, PixelFormat fmt, unsigned wd, unsigned ht)
50 {
51         if(!samples)
52                 return storage(fmt, wd, ht);
53
54         static Require _req(EXT_framebuffer_multisample);
55         if(samples>Limits::get_global().max_samples)
56                 throw out_of_range("Renderbuffer::storage_multisample");
57
58         require_pixelformat(fmt);
59
60         width = wd;
61         height = ht;
62         GLenum gl_fmt = get_gl_pixelformat(fmt);
63         if(ARB_direct_state_access)
64                 glNamedRenderbufferStorageMultisample(id, samples, gl_fmt, width, height);
65         else
66         {
67                 glBindRenderbuffer(GL_RENDERBUFFER, id);
68                 glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, gl_fmt, width, height);
69                 glBindRenderbuffer(GL_RENDERBUFFER, 0);
70         }
71 }
72
73 void Renderbuffer::set_debug_name(const string &name)
74 {
75 #ifdef DEBUG
76         if(KHR_debug)
77                 glObjectLabel(GL_RENDERBUFFER, id, name.size(), name.c_str());
78 #else
79         (void)name;
80 #endif
81 }
82
83 } // namespace GL
84 } // namespace Msp