]> git.tdb.fi Git - libs/gl.git/blob - source/core/renderbuffer.cpp
9af18daec9f1082ccd54c6e432e33a77478e9ed7
[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 "misc.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         if(ARB_direct_state_access)
34                 glNamedRenderbufferStorage(id, fmt, width, height);
35         else
36         {
37                 BindRestore _bind(this);
38                 glRenderbufferStorage(GL_RENDERBUFFER, fmt, width, height);
39         }
40 }
41
42 unsigned Renderbuffer::get_max_samples()
43 {
44         static unsigned max_samples = (EXT_framebuffer_multisample ? get_i(GL_MAX_SAMPLES) : 0);
45         return max_samples;
46 }
47
48 void Renderbuffer::storage_multisample(unsigned samples, PixelFormat fmt, unsigned wd, unsigned ht)
49 {
50         if(!samples)
51                 return storage(fmt, wd, ht);
52
53         static Require _req(EXT_framebuffer_multisample);
54         if(samples>get_max_samples())
55                 throw out_of_range("Renderbuffer::storage_multisample");
56
57         require_pixelformat(fmt);
58
59         width = wd;
60         height = ht;
61         if(ARB_direct_state_access)
62                 glNamedRenderbufferStorageMultisample(id, samples, fmt, width, height);
63         else
64         {
65                 BindRestore _bind(this);
66                 glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, fmt, width, height);
67         }
68 }
69
70 void Renderbuffer::bind() const
71 {
72         if(set_current(this))
73                 glBindRenderbuffer(GL_RENDERBUFFER, id);
74 }
75
76 void Renderbuffer::unbind()
77 {
78         if(set_current(0))
79                 glBindRenderbuffer(GL_RENDERBUFFER, 0);
80 }
81
82 void Renderbuffer::set_debug_name(const string &name)
83 {
84 #ifdef DEBUG
85         if(KHR_debug)
86                 glObjectLabel(GL_RENDERBUFFER, id, name.size(), name.c_str());
87 #else
88         (void)name;
89 #endif
90 }
91
92 } // namespace GL
93 } // namespace Msp