From 175e5dbff024f255b2d2f1ec5d6f4c40eb1b5e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 27 Apr 2017 01:18:18 +0200 Subject: [PATCH] Updates for multisample array texture storage in ES 3.2. --- src/Magnum/AbstractTexture.cpp | 14 ++++++++------ src/Magnum/AbstractTexture.h | 3 +++ src/Magnum/Framebuffer.h | 2 +- src/Magnum/Implementation/TextureState.cpp | 8 +++++++- src/Magnum/MultisampleTexture.h | 8 ++++---- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/Magnum/AbstractTexture.cpp b/src/Magnum/AbstractTexture.cpp index def1e13a6..c287ff509 100644 --- a/src/Magnum/AbstractTexture.cpp +++ b/src/Magnum/AbstractTexture.cpp @@ -1400,14 +1400,16 @@ void AbstractTexture::storageMultisampleImplementationFallback(const GLsizei sam #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) void AbstractTexture::storageMultisampleImplementationDefault(const GLsizei samples, const TextureFormat internalFormat, const Vector3i& size, const GLboolean fixedSampleLocations) { bindInternal(); - #ifndef MAGNUM_TARGET_GLES - glTexStorage3DMultisample - #else - glTexStorage3DMultisampleOES - #endif - (_target, samples, GLenum(internalFormat), size.x(), size.y(), size.z(), fixedSampleLocations); + glTexStorage3DMultisample(_target, samples, GLenum(internalFormat), size.x(), size.y(), size.z(), fixedSampleLocations); +} + +#ifdef MAGNUM_TARGET_GLES +void AbstractTexture::storageMultisampleImplementationOES(const GLsizei samples, const TextureFormat internalFormat, const Vector3i& size, const GLboolean fixedSampleLocations) { + bindInternal(); + glTexStorage3DMultisampleOES(_target, samples, GLenum(internalFormat), size.x(), size.y(), size.z(), fixedSampleLocations); } #endif +#endif #ifndef MAGNUM_TARGET_GLES void AbstractTexture::storageMultisampleImplementationDSA(const GLsizei samples, const TextureFormat internalFormat, const Vector3i& size, const GLboolean fixedSampleLocations) { diff --git a/src/Magnum/AbstractTexture.h b/src/Magnum/AbstractTexture.h index 6c0c6c92a..708cc55fe 100644 --- a/src/Magnum/AbstractTexture.h +++ b/src/Magnum/AbstractTexture.h @@ -612,6 +612,9 @@ class MAGNUM_EXPORT AbstractTexture: public AbstractObject { #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) void MAGNUM_LOCAL storageMultisampleImplementationDefault(GLsizei samples, TextureFormat internalFormat, const Vector2i& size, GLboolean fixedsamplelocations); void MAGNUM_LOCAL storageMultisampleImplementationDefault(GLsizei samples, TextureFormat internalFormat, const Vector3i& size, GLboolean fixedsamplelocations); + #ifdef MAGNUM_TARGET_GLES + void MAGNUM_LOCAL storageMultisampleImplementationOES(GLsizei samples, TextureFormat internalFormat, const Vector3i& size, GLboolean fixedsamplelocations); + #endif #endif #ifndef MAGNUM_TARGET_GLES void MAGNUM_LOCAL storageMultisampleImplementationDSA(GLsizei samples, TextureFormat internalFormat, const Vector2i& size, GLboolean fixedsamplelocations); diff --git a/src/Magnum/Framebuffer.h b/src/Magnum/Framebuffer.h index e258eb577..eaf80bbe1 100644 --- a/src/Magnum/Framebuffer.h +++ b/src/Magnum/Framebuffer.h @@ -785,7 +785,7 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @requires_gl32 Extension @extension{ARB,texture_multisample} * @requires_gles30 Multisample 2D array textures are not defined in * OpenGL ES 2.0. - * @requires_es_extension Extension @extension{ANDROID,extension_pack_es31a}/ + * @requires_gles32 Extension @extension{ANDROID,extension_pack_es31a} / * @extension{OES,texture_storage_multisample_2d_array} * @requires_gles Multisample textures are not available in WebGL. */ diff --git a/src/Magnum/Implementation/TextureState.cpp b/src/Magnum/Implementation/TextureState.cpp index caf433549..87e68a05f 100644 --- a/src/Magnum/Implementation/TextureState.cpp +++ b/src/Magnum/Implementation/TextureState.cpp @@ -391,7 +391,13 @@ TextureState::TextureState(Context& context, std::vector& extension } #elif !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) storage2DMultisampleImplementation = &AbstractTexture::storageMultisampleImplementationDefault; - storage3DMultisampleImplementation = &AbstractTexture::storageMultisampleImplementationDefault; + + if(context.isVersionSupported(Version::GLES320)) + storage3DMultisampleImplementation = &AbstractTexture::storageMultisampleImplementationDefault; + else if(context.isExtensionSupported()) + storage3DMultisampleImplementation = &AbstractTexture::storageMultisampleImplementationOES; + else + storage3DMultisampleImplementation = nullptr; #endif /* Anisotropic filter implementation */ diff --git a/src/Magnum/MultisampleTexture.h b/src/Magnum/MultisampleTexture.h index b380f1905..30664586e 100644 --- a/src/Magnum/MultisampleTexture.h +++ b/src/Magnum/MultisampleTexture.h @@ -97,7 +97,7 @@ Note that multisample textures don't support compressed formats. older. @requires_gles30 Multisample 2D array textures are not defined in OpenGL ES 2.0. -@requires_es_extension Extension @extension{ANDROID,extension_pack_es31a}/ +@requires_gles32 Extension @extension{ANDROID,extension_pack_es31a} / @extension{OES,texture_storage_multisample_2d_array} for multisample 2D array textures. @requires_gles Multisample textures are not available in WebGL. @@ -204,7 +204,7 @@ template class MultisampleTexture: public AbstractTextur * @ref AbstractShaderProgram::maxImageUnits(), * @fn_gl_keyword{BindImageTexture} * @requires_gl42 Extension @extension{ARB,shader_image_load_store} - * @requires_es_extension Extension @extension{ANDROID,extension_pack_es31a}/ + * @requires_gles32 Extension @extension{ANDROID,extension_pack_es31a} / * @extension{OES,texture_storage_multisample_2d_array} for * multisample 2D array textures. */ @@ -230,7 +230,7 @@ template class MultisampleTexture: public AbstractTextur * @ref AbstractShaderProgram::maxImageUnits(), * @fn_gl_keyword{BindImageTexture} * @requires_gl42 Extension @extension{ARB,shader_image_load_store} - * @requires_es_extension Extension @extension{ANDROID,extension_pack_es31a}/ + * @requires_gles32 Extension @extension{ANDROID,extension_pack_es31a} / * @extension{OES,texture_storage_multisample_2d_array} for * multisample 2D array textures. */ @@ -334,7 +334,7 @@ typedef MultisampleTexture<2> MultisampleTexture2D; @requires_gl32 Extension @extension{ARB,texture_multisample} @requires_gles30 Not defined in OpenGL ES 2.0. -@requires_es_extension Extension @extension{ANDROID,extension_pack_es31a}/ +@requires_gles32 Extension @extension{ANDROID,extension_pack_es31a} / @extension{OES,texture_storage_multisample_2d_array} @requires_gles Multisample textures are not available in WebGL. */