X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fframebuffer.h;h=5476596317000dbecd53eca3146adce3dcc4407c;hp=920d9422fae0c103d0a492c81e9024b9f3a595ae;hb=HEAD;hpb=24ad0788cfe20dc619669429615220061b4865ea diff --git a/source/core/framebuffer.h b/source/core/framebuffer.h index 920d9422..4932f29a 100644 --- a/source/core/framebuffer.h +++ b/source/core/framebuffer.h @@ -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. */ @@ -38,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(); }; @@ -49,6 +57,7 @@ protected: std::vector attachments; unsigned width = 0; unsigned height = 0; + unsigned layers = 0; mutable unsigned dirty = 0; Framebuffer(bool); @@ -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; } 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,6 +114,14 @@ public: 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; + + using FramebufferBackend::is_presentable; + /** Ensures that the framebuffer is complete, throwing an exception if it isn't. */ void require_complete() const;