]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/framebuffer.h
Redesign framebuffer attachment management
[libs/gl.git] / source / core / framebuffer.h
index 9fe59bf774b929474869cb2f5ba60b3970ba6804..f2fbfea40e19bca9577cd97a540d6bfcfb3b1673 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_GL_FRAMEBUFFER_H_
 
 #include <vector>
+#include "frameformat.h"
 #include "gl.h"
 #include "texturecube.h"
 #include <msp/gl/extensions/arb_geometry_shader4.h>
@@ -18,16 +19,6 @@ class Texture2DMultisample;
 class Texture3D;
 class WindowView;
 
-enum FramebufferAttachment
-{
-       COLOR_ATTACHMENT0  = GL_COLOR_ATTACHMENT0,
-       COLOR_ATTACHMENT1  = GL_COLOR_ATTACHMENT1,
-       COLOR_ATTACHMENT2  = GL_COLOR_ATTACHMENT2,
-       COLOR_ATTACHMENT3  = GL_COLOR_ATTACHMENT3,
-       DEPTH_ATTACHMENT   = GL_DEPTH_ATTACHMENT,
-       STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT
-};
-
 enum FramebufferStatus
 {
        FRAMEBUFFER_INCOMPLETE_ATTACHMENT         = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
@@ -74,17 +65,17 @@ class Framebuffer
 private:
        struct Attachment
        {
-               FramebufferAttachment attachment;
                Texture *tex;
                unsigned level;
                int layer;
 
-               Attachment(FramebufferAttachment);
+               Attachment();
                void set(Texture &, unsigned, int);
                void clear();
        };
 
        unsigned id;
+       FrameFormat format;
        std::vector<Attachment> attachments;
        unsigned width;
        unsigned height;
@@ -93,25 +84,48 @@ private:
 
        Framebuffer(unsigned);
 public:
+       /** Creates an empty framebuffer.  Format must be set before textures can
+       be attached. */
        Framebuffer();
+
+       /** Creates a framebuffer and sets its format to a single attachment. */
+       Framebuffer(FrameAttachment);
+
+       /** Creates a framebuffer and sets its format. */
+       Framebuffer(const FrameFormat &);
+
+private:
+       void init();
+public:
        ~Framebuffer();
 
+       /** Sets the format of the framebuffer.  Once the format is set, it can't
+       be changed. */
+       void set_format(const FrameFormat &);
+
+       const FrameFormat &get_format() const { return format; }
+
        unsigned get_width() const { return width; }
        unsigned get_height() const { return height; }
 
 private:
        void update() const;
        void check_size();
-       unsigned get_attachment_index(FramebufferAttachment);
-       void set_attachment(FramebufferAttachment, Texture &, unsigned, int);
+       void set_attachment(FrameAttachment, Texture &, unsigned, int, unsigned);
 public:
-       void attach(FramebufferAttachment attch, Texture2D &tex, unsigned level = 0);
-       void attach(FramebufferAttachment attch, Texture2DMultisample &tex);
-       void attach(FramebufferAttachment attch, Texture3D &tex, unsigned layer, unsigned level = 0);
-       void attach(FramebufferAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0);
-       void attach_layered(FramebufferAttachment attch, Texture3D &tex, unsigned level = 0);
-       void attach_layered(FramebufferAttachment attch, TextureCube &tex, unsigned level = 0);
-       void detach(FramebufferAttachment attch);
+
+       /** Attaches a texture to the framebuffer.  Only the attachment point
+       portion of attch is considered; pixel format is ignored.  The framebuffer
+       must have a format and the format of the texture must match that defined
+       in the framebuffer for this attachment point. */
+       void attach(FrameAttachment attch, Texture2D &tex, unsigned level = 0);
+
+       void attach(FrameAttachment attch, Texture2DMultisample &tex);
+       void attach(FrameAttachment attch, Texture3D &tex, unsigned layer, unsigned level = 0);
+       void attach(FrameAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0);
+       void attach_layered(FrameAttachment attch, Texture3D &tex, unsigned level = 0);
+       void attach_layered(FrameAttachment attch, TextureCube &tex, unsigned level = 0);
+       void detach(FrameAttachment attch);
 
        void resize(const WindowView &);