]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/framebuffer.h
Check the flat qualifier from the correct member
[libs/gl.git] / source / core / framebuffer.h
index d2029022d94b6fee2d0380d43a18dbff90338a63..4932f29a31b687dff3fe8cd9abe52818eeef7b00 100644 (file)
@@ -5,6 +5,7 @@
 #include "color.h"
 #include "framebuffer_backend.h"
 #include "frameformat.h"
+#include "rect.h"
 #include "texturecube.h"
 
 namespace Msp {
@@ -27,6 +28,12 @@ Uses one or more textures as buffers to draw into.  Framebuffers can contain
 multiple color buffers to match multiple outputs from a fragment shader, but
 only one depth and stencil buffer.
 
+If a framebuffer has a multisampled format, each attachment can optionally have
+a single-sampled resolve attachment associated with it.  When a multisample
+resolve operation is performed on the framebuffer (such as by a Sequence), the
+sample values from the primary attachments are converted to a single value per
+pixel in the corresponding resolve attachments.
+
 RenderTarget provides a higher-level interface which manages the textures as
 well as the framebuffer itself.
 */
@@ -34,22 +41,24 @@ class Framebuffer: public FramebufferBackend
 {
        friend FramebufferBackend;
 
-private:
+protected:
        struct Attachment
        {
                Texture *tex = 0;
+               Texture *resolve = 0;
                unsigned level = 0;
                int layer = 0;
 
-               void set(Texture &, unsigned, int);
+               void set(Texture &, Texture *, unsigned, int);
                void clear();
        };
 
        FrameFormat format;
        std::vector<Attachment> attachments;
-       unsigned width;
-       unsigned height;
-       mutable unsigned dirty;
+       unsigned width = 0;
+       unsigned height = 0;
+       unsigned layers = 0;
+       mutable unsigned dirty = 0;
 
        Framebuffer(bool);
 public:
@@ -71,11 +80,13 @@ public:
 
        unsigned get_width() const { return width; }
        unsigned get_height() const { return height; }
+       Rect get_rect() const { return Rect(0, 0, width, height); }
+       unsigned get_layers() const { return layers; }
 
-private:
+protected:
        void update() const;
        void check_size();
-       void set_attachment(FrameAttachment, Texture &, unsigned, int, unsigned);
+       void set_attachment(FrameAttachment, Texture &, Texture *, unsigned, int, unsigned);
 
 public:
        /** Attaches a texture to the framebuffer.  Only the attachment point
@@ -84,7 +95,11 @@ public:
        in the framebuffer for this attachment point. */
        void attach(FrameAttachment attch, Texture2D &, unsigned level = 0);
 
-       void attach(FrameAttachment attch, Texture2DMultisample &);
+       /** Attaches a multisample texture to the framebuffer.  The texture must
+       have a sample count matching the frame format.  A resolve attachment may
+       be given as well and used to resolve the multisample image into a single
+       value per texel. */
+       void attach(FrameAttachment attch, Texture2DMultisample &, Texture2D *);
 
        /** Attaches a single layer from a 3-dimensional texture to the
        framebuffer. */
@@ -99,7 +114,13 @@ public:
        void attach_layered(FrameAttachment attch, TextureCube &, unsigned level = 0);
        void detach(FrameAttachment attch);
 
-       void resize(const WindowView &);
+       const Texture *get_attachment(FrameAttachment) const;
+       const Texture *get_attachment(unsigned) const;
+       const Texture *get_resolve_attachment(FrameAttachment) const;
+       const Texture *get_resolve_attachment(unsigned) const;
+       bool has_resolve_attachments() const;
+
+       using FramebufferBackend::is_presentable;
 
        /** Ensures that the framebuffer is complete, throwing an exception if it
        isn't. */
@@ -108,8 +129,6 @@ public:
        void refresh() const { if(dirty) update(); }
 
        using FramebufferBackend::set_debug_name;
-
-       static Framebuffer &system();
 };