X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fframebuffer.h;h=e370b7c7f38976c2211c496c4c6c5e640f835e07;hp=9fe59bf774b929474869cb2f5ba60b3970ba6804;hb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14;hpb=cd5f37b066352119cf92d53d0001af7ff99be437 diff --git a/source/core/framebuffer.h b/source/core/framebuffer.h index 9fe59bf7..e370b7c7 100644 --- a/source/core/framebuffer.h +++ b/source/core/framebuffer.h @@ -2,58 +2,23 @@ #define MSP_GL_FRAMEBUFFER_H_ #include -#include "gl.h" +#include "color.h" +#include "framebuffer_backend.h" +#include "frameformat.h" #include "texturecube.h" -#include -#include -#include -#include namespace Msp { namespace GL { -class Texture; class Texture2D; 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, - FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT, - FRAMEBUFFER_INCOMPLETE_DIMENSIONS = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT, - FRAMEBUFFER_INCOMPLETE_FORMATS = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT, - FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER, - FRAMEBUFFER_INCOMPLETE_READ_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER, - FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE, - FRAMEBUFFER_INCOMPLETE_LAYER_COUNT = GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB, - FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS, - FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED, - FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE -}; - -enum BufferBits -{ - COLOR_BUFFER_BIT = GL_COLOR_BUFFER_BIT, - DEPTH_BUFFER_BIT = GL_DEPTH_BUFFER_BIT, - STENCIL_BUFFER_BIT = GL_STENCIL_BUFFER_BIT -}; - class framebuffer_incomplete: public std::runtime_error { public: - framebuffer_incomplete(FramebufferStatus); + framebuffer_incomplete(const std::string &); virtual ~framebuffer_incomplete() throw() { } }; @@ -69,32 +34,44 @@ must be attached for the framebuffer to be usable. Requires the GL_EXT_framebuffer_object extension. The blit functions require the GL_EXT_framebuffer_blit extension. */ -class Framebuffer +class Framebuffer: public FramebufferBackend { + friend FramebufferBackend; + private: struct Attachment { - FramebufferAttachment attachment; - Texture *tex; - unsigned level; - int layer; + Texture *tex = 0; + unsigned level = 0; + int layer = 0; - Attachment(FramebufferAttachment); void set(Texture &, unsigned, int); void clear(); }; - unsigned id; + FrameFormat format; std::vector attachments; unsigned width; unsigned height; - mutable FramebufferStatus status; mutable unsigned dirty; - Framebuffer(unsigned); + Framebuffer(bool); public: + /** Creates an empty framebuffer. Format must be set before textures can + be attached. */ Framebuffer(); - ~Framebuffer(); + + /** Creates a framebuffer and sets its format to a single attachment. */ + Framebuffer(FrameAttachment); + + /** Creates a framebuffer and sets its format. */ + Framebuffer(const FrameFormat &); + + /** 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; } @@ -102,22 +79,23 @@ public: 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); - void resize(const WindowView &); + /** 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); - /** Returns FRAMEBUFFER_COMPLETE if the framebuffer is complete and can be - rendered to, or one of the error status codes otherwise. */ - FramebufferStatus get_status() const { return status; } + 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 &); /** Ensures that the framebuffer is complete, throwing an exception if it isn't. */ @@ -125,15 +103,23 @@ public: void refresh() const { if(dirty) update(); } - unsigned get_id() const { return id; } - - void set_debug_name(const std::string &); + using FramebufferBackend::set_debug_name; static Framebuffer &system(); }; -inline BufferBits operator|(BufferBits a, BufferBits b) -{ return static_cast(static_cast(a)|static_cast(b)); } + +union ClearValue +{ + Color color; + struct + { + float depth; + int stencil; + } depth_stencil; + + ClearValue(): color(0.0f, 0.0f, 0.0f, 0.0f) { } +}; } // namespace GL } // namespace Msp