]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/framebuffer.h
Rework multisample resolve to use resolve attachments
[libs/gl.git] / source / core / framebuffer.h
index 5476596317000dbecd53eca3146adce3dcc4407c..b3359a34aeb5998052a728b1aff98f733f2fd74f 100644 (file)
@@ -28,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.
 */
@@ -39,10 +45,11 @@ 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();
        };
 
@@ -79,7 +86,7 @@ public:
 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
@@ -88,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. */
@@ -105,6 +116,9 @@ public:
 
        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;
 
        /** Ensures that the framebuffer is complete, throwing an exception if it
        isn't. */