]> git.tdb.fi Git - libs/gl.git/blob - source/framebuffer.h
Complete rewrite of extension handling
[libs/gl.git] / source / framebuffer.h
1 #ifndef MSP_GL_FRAMEBUFFER_H_
2 #define MSP_GL_FRAMEBUFFER_H_
3
4 #include <vector>
5 #include "bindable.h"
6 #include "gl.h"
7 #include "texturecube.h"
8
9 namespace Msp {
10 namespace GL {
11
12 class Renderbuffer;
13 class Texture;
14 class Texture2D;
15
16 enum FramebufferAttachment
17 {
18         COLOR_ATTACHMENT0  = GL_COLOR_ATTACHMENT0,
19         COLOR_ATTACHMENT1  = GL_COLOR_ATTACHMENT1,
20         COLOR_ATTACHMENT2  = GL_COLOR_ATTACHMENT2,
21         COLOR_ATTACHMENT3  = GL_COLOR_ATTACHMENT3,
22         DEPTH_ATTACHMENT   = GL_DEPTH_ATTACHMENT,
23         STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT
24 };
25
26 enum FramebufferStatus
27 {
28         FRAMEBUFFER_INCOMPLETE_ATTACHMENT         = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
29         FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,
30         FRAMEBUFFER_INCOMPLETE_DIMENSIONS         = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT,
31         FRAMEBUFFER_INCOMPLETE_FORMATS            = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT,
32         FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER        = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER,
33         FRAMEBUFFER_INCOMPLETE_READ_BUFFER        = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER,
34         FRAMEBUFFER_UNSUPPORTED                   = GL_FRAMEBUFFER_UNSUPPORTED,
35         FRAMEBUFFER_COMPLETE                      = GL_FRAMEBUFFER_COMPLETE
36 };
37
38 enum BufferBits
39 {
40         COLOR_BUFFER_BIT   = GL_COLOR_BUFFER_BIT,
41         DEPTH_BUFFER_BIT   = GL_DEPTH_BUFFER_BIT,
42         STENCIL_BUFFER_BIT = GL_STENCIL_BUFFER_BIT,
43         ACCUM_BUFFER_BIT   = GL_ACCUM_BUFFER_BIT
44 };
45
46 enum RWBuffer
47 {
48         NO_BUFFER      = GL_NONE,
49         FRONT_LEFT     = GL_FRONT_LEFT,
50         FRONT_RIGHT    = GL_FRONT_RIGHT,
51         BACK_LEFT      = GL_BACK_LEFT,
52         BACK_RIGHT     = GL_BACK_RIGHT,
53         FRONT          = GL_FRONT,
54         BACK           = GL_BACK,
55         LEFT           = GL_LEFT,
56         RIGHT          = GL_RIGHT,
57         FRONT_AND_BACK = GL_FRONT_AND_BACK
58 };
59
60 /**
61 Framebuffer objects can be used to perform offscreen rendering.  The most
62 common application is rendering to a texture, which can then be used for
63 fullscreen shader effects.
64
65 A framebuffer consist of a number of logical buffers, such as color and depth
66 buffers.  Renderbuffers and Textures can be attached to the logical buffers.  At
67 least one image must be attached for the framebuffer to be usable.
68
69 Requires the GL_EXT_framebuffer_object extension.  The blit functions require
70 the GL_EXT_framebuffer_blit extension.
71 */
72 class Framebuffer: public Bindable<Framebuffer>
73 {
74 private:
75         struct Attachment
76         {
77                 FramebufferAttachment attachment;
78                 GLenum type;
79                 union
80                 {
81                         Renderbuffer *rbuf;
82                         Texture *tex;
83                 };
84                 unsigned level;
85                 GLenum cube_face;
86
87                 Attachment(FramebufferAttachment);
88                 void set(Renderbuffer &);
89                 void set(Texture &, GLenum, unsigned);
90                 void clear();
91         };
92
93         unsigned id;
94         std::vector<Attachment> attachments;
95         unsigned width;
96         unsigned height;
97         mutable unsigned dirty;
98
99         Framebuffer(unsigned);
100 public:
101         Framebuffer();
102         ~Framebuffer();
103
104         unsigned get_width() const { return width; }
105         unsigned get_height() const { return height; }
106
107 private:
108         void update_attachment(unsigned) const;
109         void check_size();
110         unsigned get_attachment_index(FramebufferAttachment);
111 public:
112         void attach(FramebufferAttachment attch, Renderbuffer &rbuf);
113         void attach(FramebufferAttachment attch, Texture2D &tex, unsigned level = 0);
114         void attach(FramebufferAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0);
115         void detach(FramebufferAttachment attch);
116
117         /** Checks the completeness of the framebuffer.  Returns
118         FRAMEBUFFER_COMPLETE if the framebuffer is complete and can be rendered to,
119         or one of the error status codes otherwise. */
120         FramebufferStatus check_status() const;
121
122         void clear(BufferBits);
123
124         /** Blits a region from another framebuffer into this one.  If the source
125         and destination regions have different dimensions, the contents will be
126         stretched.  If filter is true, linear interpolation will be used, otherwise
127         no interpolation is done. */
128         void blit_from(const Framebuffer &other, int sx0, int sy0, int sx1, int sy1,
129                 int dx0, int dy0, int dx1, int dy1, BufferBits bits, bool filter);
130
131         /** Blits a region from another framebuffer into this one, retaining its
132         dimensions. */
133         void blit_from(const Framebuffer & other, int sx, int sy,
134                 unsigned wd, unsigned ht, int dx, int dy, BufferBits bits);
135
136         /** Blits the entire contents of another framebuffer into this one. */
137         void blit_from(const Framebuffer &other, BufferBits bits, bool filter);
138
139         void bind() const;
140
141         static const Framebuffer *current();
142         static void unbind();
143
144         static Framebuffer &system();
145 };
146
147 inline BufferBits operator|(BufferBits a, BufferBits b)
148 { return static_cast<BufferBits>(static_cast<int>(a)|static_cast<int>(b)); }
149
150 } // namespace GL
151 } // namespace Msp
152
153 #endif