Browse Source

Added Renderbuffer::setStorageMultisample().

pull/278/head
Vladimír Vondruš 13 years ago
parent
commit
3ada0d8d1d
  1. 2
      src/Context.cpp
  2. 2
      src/Extensions.h
  3. 42
      src/Renderbuffer.cpp
  4. 34
      src/Renderbuffer.h

2
src/Context.cpp

@ -224,6 +224,7 @@ const std::vector<Extension>& Extension::extensions(Version version) {
_extension(GL,OES,texture_3D)};
static const std::vector<Extension> 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>& 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),

2
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

42
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<Extensions::GL::ANGLE::framebuffer_multisample>()) {
Debug() << "Renderbuffer: using" << Extensions::GL::ANGLE::framebuffer_multisample::string() << "features";
storageMultisampleImplementation = &Renderbuffer::storageMultisampleImplementationANGLE;
} else if (context->isExtensionSupported<Extensions::GL::NV::framebuffer_multisample>()) {
Debug() << "Renderbuffer: using" << Extensions::GL::NV::framebuffer_multisample::string() << "features";
storageMultisampleImplementation = &Renderbuffer::storageMultisampleImplementationNV;
}
#else
static_cast<void>(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
}

34
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;

Loading…
Cancel
Save