diff --git a/src/Magnum/Buffer.cpp b/src/Magnum/Buffer.cpp index 677dd3249..30361ff66 100644 --- a/src/Magnum/Buffer.cpp +++ b/src/Magnum/Buffer.cpp @@ -601,7 +601,7 @@ Debug& operator<<(Debug& debug, Buffer::TargetHint value) { _c(ShaderStorage) #endif #endif - #ifndef MAGNUM_TARGET_GLES + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) _c(Texture) #endif #ifndef MAGNUM_TARGET_GLES2 diff --git a/src/Magnum/Buffer.h b/src/Magnum/Buffer.h index 1231a17d7..5351650e0 100644 --- a/src/Magnum/Buffer.h +++ b/src/Magnum/Buffer.h @@ -337,12 +337,14 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { #endif #endif - #ifndef MAGNUM_TARGET_GLES + #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) /** * Source for texel fetches. See @ref BufferTexture. * @requires_gl31 Extension @extension{ARB,texture_buffer_object} - * @requires_gl Texture buffers are not available in OpenGL ES or - * WebGL. + * @requires_gles30 Not defined in OpenGL ES 2.0. + * @requires_gles32 Extension @extension{ANDROID,extension_pack_es31a} / + * @extension{EXT,texture_buffer} + * @requires_gles Texture buffers are not available in WebGL. */ Texture = GL_TEXTURE_BUFFER, #endif diff --git a/src/Magnum/BufferTexture.cpp b/src/Magnum/BufferTexture.cpp index 0e4e33b69..cfbc47bff 100644 --- a/src/Magnum/BufferTexture.cpp +++ b/src/Magnum/BufferTexture.cpp @@ -47,13 +47,8 @@ Int BufferTexture::maxSize() { GLint& value = Context::current().state().texture->maxBufferSize; /* Get the value, if not already cached */ - if(value == 0) glGetIntegerv( - #ifndef MAGNUM_TARGET_GLES - GL_MAX_TEXTURE_BUFFER_SIZE, - #else - GL_MAX_TEXTURE_BUFFER_SIZE_EXT, - #endif - &value); + if(value == 0) + glGetIntegerv(GL_MAX_TEXTURE_BUFFER_SIZE, &value); return value; } @@ -70,13 +65,8 @@ Int BufferTexture::offsetAlignment() { GLint& value = Context::current().state().texture->bufferOffsetAlignment; /* Get the value, if not already cached */ - if(value == 0) glGetIntegerv( - #ifndef MAGNUM_TARGET_GLES - GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, - #else - GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT, - #endif - &value); + if(value == 0) + glGetIntegerv(GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, &value); return value; } @@ -93,20 +83,16 @@ BufferTexture& BufferTexture::setBuffer(const BufferTextureFormat internalFormat void BufferTexture::setBufferImplementationDefault(BufferTextureFormat internalFormat, Buffer& buffer) { bindInternal(); - #ifndef MAGNUM_TARGET_GLES - glTexBuffer - #else - glTexBufferEXT - #endif - ( - #ifndef MAGNUM_TARGET_GLES - GL_TEXTURE_BUFFER, - #else - GL_TEXTURE_BUFFER_EXT, - #endif - GLenum(internalFormat), buffer.id()); + glTexBuffer(GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer.id()); } +#ifdef MAGNUM_TARGET_GLES +void BufferTexture::setBufferImplementationEXT(BufferTextureFormat internalFormat, Buffer& buffer) { + bindInternal(); + glTexBufferEXT(GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer.id()); +} +#endif + #ifndef MAGNUM_TARGET_GLES void BufferTexture::setBufferImplementationDSA(const BufferTextureFormat internalFormat, Buffer& buffer) { glTextureBuffer(id(), GLenum(internalFormat), buffer.id()); @@ -119,20 +105,16 @@ void BufferTexture::setBufferImplementationDSAEXT(BufferTextureFormat internalFo void BufferTexture::setBufferRangeImplementationDefault(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size) { bindInternal(); - #ifndef MAGNUM_TARGET_GLES - glTexBufferRange - #else - glTexBufferRangeEXT - #endif - ( - #ifndef MAGNUM_TARGET_GLES - GL_TEXTURE_BUFFER, - #else - GL_TEXTURE_BUFFER_EXT, - #endif - GLenum(internalFormat), buffer.id(), offset, size); + glTexBufferRange(GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer.id(), offset, size); } +#ifdef MAGNUM_TARGET_GLES +void BufferTexture::setBufferRangeImplementationEXT(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size) { + bindInternal(); + glTexBufferRangeEXT(GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer.id(), offset, size); +} +#endif + #ifndef MAGNUM_TARGET_GLES void BufferTexture::setBufferRangeImplementationDSA(const BufferTextureFormat internalFormat, Buffer& buffer, const GLintptr offset, const GLsizeiptr size) { glTextureBufferRange(id(), GLenum(internalFormat), buffer.id(), offset, size); diff --git a/src/Magnum/BufferTexture.h b/src/Magnum/BufferTexture.h index afe18c41c..8ca2c50f5 100644 --- a/src/Magnum/BufferTexture.h +++ b/src/Magnum/BufferTexture.h @@ -85,7 +85,7 @@ and respective function documentation for more information. @ref CubeMapTextureArray, @ref RectangleTexture, @ref MultisampleTexture @requires_gl31 Extension @extension{ARB,texture_buffer_object} @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{EXT,texture_buffer} @requires_gles Texture buffers are not available in WebGL. */ @@ -138,12 +138,7 @@ class MAGNUM_EXPORT BufferTexture: public AbstractTexture { * @fn_gl_keyword{CreateTextures} with @def_gl{TEXTURE_BUFFER}, * eventually @fn_gl_keyword{GenTextures} */ - explicit BufferTexture(): - #ifndef MAGNUM_TARGET_GLES - AbstractTexture(GL_TEXTURE_BUFFER) {} - #else - AbstractTexture(GL_TEXTURE_BUFFER_EXT) {} - #endif + explicit BufferTexture(): AbstractTexture(GL_TEXTURE_BUFFER) {} /** * @brief Construct without creating the underlying OpenGL object @@ -156,12 +151,7 @@ class MAGNUM_EXPORT BufferTexture: public AbstractTexture { * destructing) objects even without any OpenGL context being active. * @see @ref BufferTexture(), @ref wrap() */ - explicit BufferTexture(NoCreateT) noexcept: - #ifndef MAGNUM_TARGET_GLES - AbstractTexture{NoCreate, GL_TEXTURE_BUFFER} {} - #else - AbstractTexture{NoCreate, GL_TEXTURE_BUFFER_EXT} {} - #endif + explicit BufferTexture(NoCreateT) noexcept: AbstractTexture{NoCreate, GL_TEXTURE_BUFFER} {} /** * @brief Bind texture to given image unit @@ -239,21 +229,21 @@ class MAGNUM_EXPORT BufferTexture: public AbstractTexture { #endif private: - explicit BufferTexture(GLuint id, ObjectFlags flags): AbstractTexture{id, - #ifndef MAGNUM_TARGET_GLES - GL_TEXTURE_BUFFER, - #else - GL_TEXTURE_BUFFER_EXT, - #endif - flags} {} + explicit BufferTexture(GLuint id, ObjectFlags flags): AbstractTexture{id, GL_TEXTURE_BUFFER, flags} {} void MAGNUM_LOCAL setBufferImplementationDefault(BufferTextureFormat internalFormat, Buffer& buffer); + #ifdef MAGNUM_TARGET_GLES + void MAGNUM_LOCAL setBufferImplementationEXT(BufferTextureFormat internalFormat, Buffer& buffer); + #endif #ifndef MAGNUM_TARGET_GLES void MAGNUM_LOCAL setBufferImplementationDSA(BufferTextureFormat internalFormat, Buffer& buffer); void MAGNUM_LOCAL setBufferImplementationDSAEXT(BufferTextureFormat internalFormat, Buffer& buffer); #endif void MAGNUM_LOCAL setBufferRangeImplementationDefault(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size); + #ifdef MAGNUM_TARGET_GLES + void MAGNUM_LOCAL setBufferRangeImplementationEXT(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size); + #endif #ifndef MAGNUM_TARGET_GLES void MAGNUM_LOCAL setBufferRangeImplementationDSA(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size); void MAGNUM_LOCAL setBufferRangeImplementationDSAEXT(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size); diff --git a/src/Magnum/BufferTextureFormat.h b/src/Magnum/BufferTextureFormat.h index 17ff6fdbb..7ff33cb0d 100644 --- a/src/Magnum/BufferTextureFormat.h +++ b/src/Magnum/BufferTextureFormat.h @@ -43,7 +43,7 @@ namespace Magnum { @m_enum_values_as_keywords @requires_gl31 Extension @extension{ARB,texture_buffer_object} @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{EXT,texture_buffer} @requires_gles Texture buffers are not available in WebGL. */ diff --git a/src/Magnum/Implementation/BufferState.cpp b/src/Magnum/Implementation/BufferState.cpp index a3e2b785a..59d6a0834 100644 --- a/src/Magnum/Implementation/BufferState.cpp +++ b/src/Magnum/Implementation/BufferState.cpp @@ -49,8 +49,6 @@ const Buffer::TargetHint BufferState::targetForIndex[] = { Buffer::TargetHint::DispatchIndirect, Buffer::TargetHint::DrawIndirect, Buffer::TargetHint::ShaderStorage, - #endif - #ifndef MAGNUM_TARGET_GLES Buffer::TargetHint::Texture #endif #endif @@ -72,8 +70,6 @@ std::size_t BufferState::indexForTarget(Buffer::TargetHint target) { case Buffer::TargetHint::DispatchIndirect: return 10; case Buffer::TargetHint::DrawIndirect: return 11; case Buffer::TargetHint::ShaderStorage: return 12; - #endif - #ifndef MAGNUM_TARGET_GLES case Buffer::TargetHint::Texture: return 13; #endif #endif diff --git a/src/Magnum/Implementation/BufferState.h b/src/Magnum/Implementation/BufferState.h index cbd6557b4..784bf07d6 100644 --- a/src/Magnum/Implementation/BufferState.h +++ b/src/Magnum/Implementation/BufferState.h @@ -31,12 +31,10 @@ namespace Magnum { namespace Implementation { struct BufferState { enum: std::size_t { - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_WEBGL TargetCount = 13+1 #elif !defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL) TargetCount = 8+1 - #elif !defined(MAGNUM_TARGET_GLES2) - TargetCount = 12+1 #else TargetCount = 2+1 #endif diff --git a/src/Magnum/Implementation/TextureState.cpp b/src/Magnum/Implementation/TextureState.cpp index 102861d98..caf433549 100644 --- a/src/Magnum/Implementation/TextureState.cpp +++ b/src/Magnum/Implementation/TextureState.cpp @@ -193,7 +193,7 @@ TextureState::TextureState(Context& context, std::vector& extension compressedSubImage3DImplementation = &AbstractTexture::compressedSubImageImplementationDefault; #endif - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + #ifndef MAGNUM_TARGET_GLES setBufferImplementation = &BufferTexture::setBufferImplementationDefault; setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationDefault; #endif @@ -205,8 +205,8 @@ TextureState::TextureState(Context& context, std::vector& extension cubeCompressedSubImageImplementation = &CubeMapTexture::compressedSubImageImplementationDefault; } - /* Integer parameter implementation for ES3 */ #if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + /* Integer parameter implementation for ES3 */ if(context.isVersionSupported(Version::GLES320)) { parameterIuivImplementation = &AbstractTexture::parameterIImplementationDefault; parameterIivImplementation = &AbstractTexture::parameterIImplementationDefault; @@ -217,6 +217,18 @@ TextureState::TextureState(Context& context, std::vector& extension parameterIuivImplementation = nullptr; parameterIivImplementation = nullptr; } + + /* Buffer texture implementation for ES3 */ + if(context.isVersionSupported(Version::GLES320)) { + setBufferImplementation = &BufferTexture::setBufferImplementationDefault; + setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationDefault; + } else if(context.isExtensionSupported()) { + setBufferImplementation = &BufferTexture::setBufferImplementationEXT; + setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationEXT; + } else { + setBufferImplementation = nullptr; + setBufferRangeImplementation = nullptr; + } #endif /* Data invalidation implementation */