]> git.tdb.fi Git - libs/gl.git/blob - source/renderbuffer.cpp
Add a get_default_sized_pixelformat function
[libs/gl.git] / source / 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 "renderbuffer.h"
5
6 namespace Msp {
7 namespace GL {
8
9 Renderbuffer::Renderbuffer()
10 {
11         static Require _req(EXT_framebuffer_object);
12
13         if(ARB_direct_state_access)
14                 glCreateRenderbuffers(1, &id);
15         else
16                 glGenRenderbuffers(1, &id);
17 }
18
19 Renderbuffer::~Renderbuffer()
20 {
21         glDeleteRenderbuffers(1, &id);
22 }
23
24 PixelFormat Renderbuffer::normalize_format(PixelFormat fmt)
25 {
26         if(!get_component_size(fmt) && OES_required_internalformat)
27                 return get_default_sized_pixelformat(fmt);
28
29         return fmt;
30 }
31
32 void Renderbuffer::storage(PixelFormat fmt, unsigned wd, unsigned ht)
33 {
34         fmt = normalize_format(fmt);
35         require_pixelformat(fmt);
36         width = wd;
37         height = ht;
38         if(ARB_direct_state_access)
39                 glNamedRenderbufferStorage(id, fmt, width, height);
40         else
41         {
42                 BindRestore _bind(this);
43                 glRenderbufferStorage(GL_RENDERBUFFER, fmt, width, height);
44         }
45 }
46
47 void Renderbuffer::storage_multisample(unsigned samples, PixelFormat fmt, unsigned wd, unsigned ht)
48 {
49         static Require _req(EXT_framebuffer_multisample);
50         fmt = normalize_format(fmt);
51         require_pixelformat(fmt);
52
53         width = wd;
54         height = ht;
55         if(ARB_direct_state_access)
56                 glNamedRenderbufferStorageMultisample(id, samples, fmt, width, height);
57         else
58         {
59                 BindRestore _bind(this);
60                 glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, fmt, width, height);
61         }
62 }
63
64 void Renderbuffer::bind() const
65 {
66         if(set_current(this))
67                 glBindRenderbuffer(GL_RENDERBUFFER, id);
68 }
69
70 void Renderbuffer::unbind()
71 {
72         if(set_current(0))
73                 glBindRenderbuffer(GL_RENDERBUFFER, 0);
74 }
75
76 } // namespace GL
77 } // namespace Msp