]> git.tdb.fi Git - libs/gl.git/blob - source/core/renderbuffer.cpp
Remove public binding APIs from Renderbuffer and Clipping
[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                 glBindRenderbuffer(GL_RENDERBUFFER, id);
38                 glRenderbufferStorage(GL_RENDERBUFFER, fmt, width, height);
39                 glBindRenderbuffer(GL_RENDERBUFFER, 0);
40         }
41 }
42
43 unsigned Renderbuffer::get_max_samples()
44 {
45         return Limits::get_global().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>Limits::get_global().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                 glBindRenderbuffer(GL_RENDERBUFFER, id);
66                 glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, fmt, width, height);
67                 glBindRenderbuffer(GL_RENDERBUFFER, 0);
68         }
69 }
70
71 void Renderbuffer::set_debug_name(const string &name)
72 {
73 #ifdef DEBUG
74         if(KHR_debug)
75                 glObjectLabel(GL_RENDERBUFFER, id, name.size(), name.c_str());
76 #else
77         (void)name;
78 #endif
79 }
80
81 } // namespace GL
82 } // namespace Msp