From 3ada0d8d1d53f97a7bce830a4030a9b9f1eeb103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 24 May 2013 11:57:21 +0200 Subject: [PATCH] Added Renderbuffer::setStorageMultisample(). --- src/Context.cpp | 2 ++ src/Extensions.h | 2 ++ src/Renderbuffer.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ src/Renderbuffer.h | 34 +++++++++++++++++++++++++++++++++- 4 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/Context.cpp b/src/Context.cpp index b63b32013..bd7c44245 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -224,6 +224,7 @@ const std::vector& Extension::extensions(Version version) { _extension(GL,OES,texture_3D)}; static const std::vector extensionsES300{ _extension(GL,ANGLE,framebuffer_blit), + _extension(GL,ANGLE,framebuffer_multisample), _extension(GL,ANGLE,depth_texture), // done _extension(GL,APPLE,framebuffer_multisample), _extension(GL,ARM,rgba8), @@ -239,6 +240,7 @@ const std::vector& Extension::extensions(Version version) { _extension(GL,NV,read_depth), _extension(GL,NV,read_depth_stencil), _extension(GL,NV,framebuffer_blit), // done + _extension(GL,NV,framebuffer_multisample), _extension(GL,OES,depth24), _extension(GL,OES,element_index_uint), _extension(GL,OES,rgb8_rgba8), diff --git a/src/Extensions.h b/src/Extensions.h index 8aefbebf4..02963ce29 100644 --- a/src/Extensions.h +++ b/src/Extensions.h @@ -187,6 +187,7 @@ namespace GL { #line 1 namespace ANGLE { _extension(GL,ANGLE,framebuffer_blit, GLES200, GLES300) // #83 + _extension(GL,ANGLE,framebuffer_multisample, GLES200, GLES300) // #84 _extension(GL,ANGLE,depth_texture, GLES200, GLES300) // #138 } namespace APPLE { _extension(GL,APPLE,framebuffer_multisample, GLES200, GLES300) // #78 @@ -217,6 +218,7 @@ namespace GL { _extension(GL,NV,read_stencil, GLES200, None) // #94 _extension(GL,NV,read_depth_stencil, GLES200, GLES300) // #94 _extension(GL,NV,framebuffer_blit, GLES200, GLES300) // #142 + _extension(GL,NV,framebuffer_multisample, GLES200, GLES300) // #143 _extension(GL,NV,texture_border_clamp, GLES200, None) // #149 } namespace OES { _extension(GL,OES,depth24, GLES200, GLES300) // #24 diff --git a/src/Renderbuffer.cpp b/src/Renderbuffer.cpp index 6baba9d13..36237aa0b 100644 --- a/src/Renderbuffer.cpp +++ b/src/Renderbuffer.cpp @@ -33,6 +33,12 @@ namespace Magnum { Renderbuffer::StorageImplementation Renderbuffer::storageImplementation = &Renderbuffer::storageImplementationDefault; +Renderbuffer::StorageMultisampleImplementation Renderbuffer::storageMultisampleImplementation = + #ifndef MAGNUM_TARGET_GLES2 + &Renderbuffer::storageMultisampleImplementationDefault; + #else + nullptr; + #endif Renderbuffer::~Renderbuffer() { /* If bound, remove itself from state */ @@ -57,6 +63,17 @@ void Renderbuffer::initializeContextBasedFunctionality(Context* context) { Debug() << "Renderbuffer: using" << Extensions::GL::EXT::direct_state_access::string() << "features"; storageImplementation = &Renderbuffer::storageImplementationDSA; + storageMultisampleImplementation = &Renderbuffer::storageMultisampleImplementationDSA; + } + #elif !defined(MAGNUM_TARGET_GLES3) + if(context->isExtensionSupported()) { + Debug() << "Renderbuffer: using" << Extensions::GL::ANGLE::framebuffer_multisample::string() << "features"; + + storageMultisampleImplementation = &Renderbuffer::storageMultisampleImplementationANGLE; + } else if (context->isExtensionSupported()) { + Debug() << "Renderbuffer: using" << Extensions::GL::NV::framebuffer_multisample::string() << "features"; + + storageMultisampleImplementation = &Renderbuffer::storageMultisampleImplementationNV; } #else static_cast(context); @@ -74,4 +91,29 @@ void Renderbuffer::storageImplementationDSA(RenderbufferFormat internalFormat, c } #endif +/** @todo Enable when extension wrangler for ES is done */ + +#ifndef MAGNUM_TARGET_GLES2 +void Renderbuffer::storageMultisampleImplementationDefault(const GLsizei samples, const RenderbufferFormat internalFormat, const Vector2i& size) { + bind(); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GLenum(internalFormat), size.x(), size.y()); +} +#else +void Renderbuffer::storageMultisampleImplementationANGLE(GLsizei, RenderbufferFormat, const Vector2i&) { + CORRADE_INTERNAL_ASSERT(false); + //glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, samples, internalFormat, size.x(), size.y()); +} + +void Renderbuffer::storageMultisampleImplementationNV(GLsizei, RenderbufferFormat, const Vector2i&) { + CORRADE_INTERNAL_ASSERT(false); + //glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, samples, internalFormat, size.x(), size.y()); +} +#endif + +#ifndef MAGNUM_TARGET_GLES +void Renderbuffer::storageMultisampleImplementationDSA(GLsizei samples, RenderbufferFormat internalFormat, const Vector2i& size) { + glNamedRenderbufferStorageMultisampleEXT(_id, samples, GLenum(internalFormat), size.x(), size.y()); +} +#endif + } diff --git a/src/Renderbuffer.h b/src/Renderbuffer.h index 0ae8f24e8..916ec4f14 100644 --- a/src/Renderbuffer.h +++ b/src/Renderbuffer.h @@ -84,7 +84,7 @@ class MAGNUM_EXPORT Renderbuffer { /** * @brief Set renderbuffer storage * @param internalFormat Internal format - * @param size Renderbuffer size + * @param size %Renderbuffer size * * If @extension{EXT,direct_state_access} is not available and the * framebufferbuffer is not currently bound, it is bound before the @@ -96,6 +96,26 @@ class MAGNUM_EXPORT Renderbuffer { (this->*storageImplementation)(internalFormat, size); } + /** + * @brief Set multisample renderbuffer storage + * @param samples Sample count + * @param internalFormat Internal format + * @param size %Renderbuffer size + * + * If @extension{EXT,direct_state_access} is not available and the + * framebufferbuffer is not currently bound, it is bound before the + * operation. + * @see @fn_gl{BindRenderbuffer}, @fn_gl{RenderbufferStorage} or + * @fn_gl_extension{NamedRenderbufferStorage,EXT,direct_state_access} + * @requires_gl30 %Extension @extension{EXT,framebuffer_multisample} + * @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_multisample} + * or @es_extension{NV,framebuffer_multisample} + * @todo How about @es_extension{APPLE,framebuffer_multisample}? + */ + inline void setStorageMultisample(Int samples, RenderbufferFormat internalFormat, const Vector2i& size) { + (this->*storageMultisampleImplementation)(samples, internalFormat, size); + } + private: static void MAGNUM_LOCAL initializeContextBasedFunctionality(Context* context); @@ -106,6 +126,18 @@ class MAGNUM_EXPORT Renderbuffer { #endif static StorageImplementation storageImplementation; + typedef void(Renderbuffer::*StorageMultisampleImplementation)(GLsizei, RenderbufferFormat, const Vector2i&); + #ifndef MAGNUM_TARGET_GLES2 + void MAGNUM_LOCAL storageMultisampleImplementationDefault(GLsizei samples, RenderbufferFormat internalFormat, const Vector2i& size); + #else + void MAGNUM_LOCAL storageMultisampleImplementationANGLE(GLsizei samples, RenderbufferFormat internalFormat, const Vector2i& size); + void MAGNUM_LOCAL storageMultisampleImplementationNV(GLsizei samples, RenderbufferFormat internalFormat, const Vector2i& size); + #endif + #ifndef MAGNUM_TARGET_GLES + void MAGNUM_LOCAL storageMultisampleImplementationDSA(GLsizei samples, RenderbufferFormat internalFormat, const Vector2i& size); + #endif + static StorageMultisampleImplementation storageMultisampleImplementation; + void MAGNUM_LOCAL bind(); GLuint _id;