#include "color.h"
#include "framebuffer_backend.h"
#include "frameformat.h"
+#include "rect.h"
#include "texturecube.h"
namespace Msp {
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.
*/
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:
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; }
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
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. */
void attach_layered(FrameAttachment attch, TextureCube &, unsigned level = 0);
void detach(FrameAttachment attch);
+ 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. */
void require_complete() const;