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