Browse Source

Updates for buffer texture support in ES 3.2.

Turns out Buffer::TargetHint::Texture was not enabled for AEP. Fixed
that now.
pull/231/head
Vladimír Vondruš 9 years ago
parent
commit
6f0a716738
  1. 2
      src/Magnum/Buffer.cpp
  2. 8
      src/Magnum/Buffer.h
  3. 58
      src/Magnum/BufferTexture.cpp
  4. 30
      src/Magnum/BufferTexture.h
  5. 2
      src/Magnum/BufferTextureFormat.h
  6. 4
      src/Magnum/Implementation/BufferState.cpp
  7. 4
      src/Magnum/Implementation/BufferState.h
  8. 16
      src/Magnum/Implementation/TextureState.cpp

2
src/Magnum/Buffer.cpp

@ -601,7 +601,7 @@ Debug& operator<<(Debug& debug, Buffer::TargetHint value) {
_c(ShaderStorage) _c(ShaderStorage)
#endif #endif
#endif #endif
#ifndef MAGNUM_TARGET_GLES #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
_c(Texture) _c(Texture)
#endif #endif
#ifndef MAGNUM_TARGET_GLES2 #ifndef MAGNUM_TARGET_GLES2

8
src/Magnum/Buffer.h

@ -337,12 +337,14 @@ class MAGNUM_EXPORT Buffer: public AbstractObject {
#endif #endif
#endif #endif
#ifndef MAGNUM_TARGET_GLES #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
/** /**
* Source for texel fetches. See @ref BufferTexture. * Source for texel fetches. See @ref BufferTexture.
* @requires_gl31 Extension @extension{ARB,texture_buffer_object} * @requires_gl31 Extension @extension{ARB,texture_buffer_object}
* @requires_gl Texture buffers are not available in OpenGL ES or * @requires_gles30 Not defined in OpenGL ES 2.0.
* WebGL. * @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, Texture = GL_TEXTURE_BUFFER,
#endif #endif

58
src/Magnum/BufferTexture.cpp

@ -47,13 +47,8 @@ Int BufferTexture::maxSize() {
GLint& value = Context::current().state().texture->maxBufferSize; GLint& value = Context::current().state().texture->maxBufferSize;
/* Get the value, if not already cached */ /* Get the value, if not already cached */
if(value == 0) glGetIntegerv( if(value == 0)
#ifndef MAGNUM_TARGET_GLES glGetIntegerv(GL_MAX_TEXTURE_BUFFER_SIZE, &value);
GL_MAX_TEXTURE_BUFFER_SIZE,
#else
GL_MAX_TEXTURE_BUFFER_SIZE_EXT,
#endif
&value);
return value; return value;
} }
@ -70,13 +65,8 @@ Int BufferTexture::offsetAlignment() {
GLint& value = Context::current().state().texture->bufferOffsetAlignment; GLint& value = Context::current().state().texture->bufferOffsetAlignment;
/* Get the value, if not already cached */ /* Get the value, if not already cached */
if(value == 0) glGetIntegerv( if(value == 0)
#ifndef MAGNUM_TARGET_GLES glGetIntegerv(GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, &value);
GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT,
#else
GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT,
#endif
&value);
return value; return value;
} }
@ -93,20 +83,16 @@ BufferTexture& BufferTexture::setBuffer(const BufferTextureFormat internalFormat
void BufferTexture::setBufferImplementationDefault(BufferTextureFormat internalFormat, Buffer& buffer) { void BufferTexture::setBufferImplementationDefault(BufferTextureFormat internalFormat, Buffer& buffer) {
bindInternal(); bindInternal();
#ifndef MAGNUM_TARGET_GLES glTexBuffer(GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer.id());
glTexBuffer
#else
glTexBufferEXT
#endif
(
#ifndef MAGNUM_TARGET_GLES
GL_TEXTURE_BUFFER,
#else
GL_TEXTURE_BUFFER_EXT,
#endif
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 #ifndef MAGNUM_TARGET_GLES
void BufferTexture::setBufferImplementationDSA(const BufferTextureFormat internalFormat, Buffer& buffer) { void BufferTexture::setBufferImplementationDSA(const BufferTextureFormat internalFormat, Buffer& buffer) {
glTextureBuffer(id(), GLenum(internalFormat), buffer.id()); 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) { void BufferTexture::setBufferRangeImplementationDefault(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size) {
bindInternal(); bindInternal();
#ifndef MAGNUM_TARGET_GLES glTexBufferRange(GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer.id(), offset, size);
glTexBufferRange
#else
glTexBufferRangeEXT
#endif
(
#ifndef MAGNUM_TARGET_GLES
GL_TEXTURE_BUFFER,
#else
GL_TEXTURE_BUFFER_EXT,
#endif
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 #ifndef MAGNUM_TARGET_GLES
void BufferTexture::setBufferRangeImplementationDSA(const BufferTextureFormat internalFormat, Buffer& buffer, const GLintptr offset, const GLsizeiptr size) { void BufferTexture::setBufferRangeImplementationDSA(const BufferTextureFormat internalFormat, Buffer& buffer, const GLintptr offset, const GLsizeiptr size) {
glTextureBufferRange(id(), GLenum(internalFormat), buffer.id(), offset, size); glTextureBufferRange(id(), GLenum(internalFormat), buffer.id(), offset, size);

30
src/Magnum/BufferTexture.h

@ -85,7 +85,7 @@ and respective function documentation for more information.
@ref CubeMapTextureArray, @ref RectangleTexture, @ref MultisampleTexture @ref CubeMapTextureArray, @ref RectangleTexture, @ref MultisampleTexture
@requires_gl31 Extension @extension{ARB,texture_buffer_object} @requires_gl31 Extension @extension{ARB,texture_buffer_object}
@requires_gles30 Not defined in OpenGL ES 2.0. @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} @extension{EXT,texture_buffer}
@requires_gles Texture buffers are not available in WebGL. @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}, * @fn_gl_keyword{CreateTextures} with @def_gl{TEXTURE_BUFFER},
* eventually @fn_gl_keyword{GenTextures} * eventually @fn_gl_keyword{GenTextures}
*/ */
explicit BufferTexture(): explicit BufferTexture(): AbstractTexture(GL_TEXTURE_BUFFER) {}
#ifndef MAGNUM_TARGET_GLES
AbstractTexture(GL_TEXTURE_BUFFER) {}
#else
AbstractTexture(GL_TEXTURE_BUFFER_EXT) {}
#endif
/** /**
* @brief Construct without creating the underlying OpenGL object * @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. * destructing) objects even without any OpenGL context being active.
* @see @ref BufferTexture(), @ref wrap() * @see @ref BufferTexture(), @ref wrap()
*/ */
explicit BufferTexture(NoCreateT) noexcept: explicit BufferTexture(NoCreateT) noexcept: AbstractTexture{NoCreate, GL_TEXTURE_BUFFER} {}
#ifndef MAGNUM_TARGET_GLES
AbstractTexture{NoCreate, GL_TEXTURE_BUFFER} {}
#else
AbstractTexture{NoCreate, GL_TEXTURE_BUFFER_EXT} {}
#endif
/** /**
* @brief Bind texture to given image unit * @brief Bind texture to given image unit
@ -239,21 +229,21 @@ class MAGNUM_EXPORT BufferTexture: public AbstractTexture {
#endif #endif
private: private:
explicit BufferTexture(GLuint id, ObjectFlags flags): AbstractTexture{id, explicit BufferTexture(GLuint id, ObjectFlags flags): AbstractTexture{id, GL_TEXTURE_BUFFER, flags} {}
#ifndef MAGNUM_TARGET_GLES
GL_TEXTURE_BUFFER,
#else
GL_TEXTURE_BUFFER_EXT,
#endif
flags} {}
void MAGNUM_LOCAL setBufferImplementationDefault(BufferTextureFormat internalFormat, Buffer& buffer); 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 #ifndef MAGNUM_TARGET_GLES
void MAGNUM_LOCAL setBufferImplementationDSA(BufferTextureFormat internalFormat, Buffer& buffer); void MAGNUM_LOCAL setBufferImplementationDSA(BufferTextureFormat internalFormat, Buffer& buffer);
void MAGNUM_LOCAL setBufferImplementationDSAEXT(BufferTextureFormat internalFormat, Buffer& buffer); void MAGNUM_LOCAL setBufferImplementationDSAEXT(BufferTextureFormat internalFormat, Buffer& buffer);
#endif #endif
void MAGNUM_LOCAL setBufferRangeImplementationDefault(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size); 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 #ifndef MAGNUM_TARGET_GLES
void MAGNUM_LOCAL setBufferRangeImplementationDSA(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size); void MAGNUM_LOCAL setBufferRangeImplementationDSA(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size);
void MAGNUM_LOCAL setBufferRangeImplementationDSAEXT(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size); void MAGNUM_LOCAL setBufferRangeImplementationDSAEXT(BufferTextureFormat internalFormat, Buffer& buffer, GLintptr offset, GLsizeiptr size);

2
src/Magnum/BufferTextureFormat.h

@ -43,7 +43,7 @@ namespace Magnum {
@m_enum_values_as_keywords @m_enum_values_as_keywords
@requires_gl31 Extension @extension{ARB,texture_buffer_object} @requires_gl31 Extension @extension{ARB,texture_buffer_object}
@requires_gles30 Not defined in OpenGL ES 2.0. @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} @extension{EXT,texture_buffer}
@requires_gles Texture buffers are not available in WebGL. @requires_gles Texture buffers are not available in WebGL.
*/ */

4
src/Magnum/Implementation/BufferState.cpp

@ -49,8 +49,6 @@ const Buffer::TargetHint BufferState::targetForIndex[] = {
Buffer::TargetHint::DispatchIndirect, Buffer::TargetHint::DispatchIndirect,
Buffer::TargetHint::DrawIndirect, Buffer::TargetHint::DrawIndirect,
Buffer::TargetHint::ShaderStorage, Buffer::TargetHint::ShaderStorage,
#endif
#ifndef MAGNUM_TARGET_GLES
Buffer::TargetHint::Texture Buffer::TargetHint::Texture
#endif #endif
#endif #endif
@ -72,8 +70,6 @@ std::size_t BufferState::indexForTarget(Buffer::TargetHint target) {
case Buffer::TargetHint::DispatchIndirect: return 10; case Buffer::TargetHint::DispatchIndirect: return 10;
case Buffer::TargetHint::DrawIndirect: return 11; case Buffer::TargetHint::DrawIndirect: return 11;
case Buffer::TargetHint::ShaderStorage: return 12; case Buffer::TargetHint::ShaderStorage: return 12;
#endif
#ifndef MAGNUM_TARGET_GLES
case Buffer::TargetHint::Texture: return 13; case Buffer::TargetHint::Texture: return 13;
#endif #endif
#endif #endif

4
src/Magnum/Implementation/BufferState.h

@ -31,12 +31,10 @@ namespace Magnum { namespace Implementation {
struct BufferState { struct BufferState {
enum: std::size_t { enum: std::size_t {
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_WEBGL
TargetCount = 13+1 TargetCount = 13+1
#elif !defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL) #elif !defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)
TargetCount = 8+1 TargetCount = 8+1
#elif !defined(MAGNUM_TARGET_GLES2)
TargetCount = 12+1
#else #else
TargetCount = 2+1 TargetCount = 2+1
#endif #endif

16
src/Magnum/Implementation/TextureState.cpp

@ -193,7 +193,7 @@ TextureState::TextureState(Context& context, std::vector<std::string>& extension
compressedSubImage3DImplementation = &AbstractTexture::compressedSubImageImplementationDefault; compressedSubImage3DImplementation = &AbstractTexture::compressedSubImageImplementationDefault;
#endif #endif
#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) #ifndef MAGNUM_TARGET_GLES
setBufferImplementation = &BufferTexture::setBufferImplementationDefault; setBufferImplementation = &BufferTexture::setBufferImplementationDefault;
setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationDefault; setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationDefault;
#endif #endif
@ -205,8 +205,8 @@ TextureState::TextureState(Context& context, std::vector<std::string>& extension
cubeCompressedSubImageImplementation = &CubeMapTexture::compressedSubImageImplementationDefault; cubeCompressedSubImageImplementation = &CubeMapTexture::compressedSubImageImplementationDefault;
} }
/* Integer parameter implementation for ES3 */
#if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) #if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
/* Integer parameter implementation for ES3 */
if(context.isVersionSupported(Version::GLES320)) { if(context.isVersionSupported(Version::GLES320)) {
parameterIuivImplementation = &AbstractTexture::parameterIImplementationDefault; parameterIuivImplementation = &AbstractTexture::parameterIImplementationDefault;
parameterIivImplementation = &AbstractTexture::parameterIImplementationDefault; parameterIivImplementation = &AbstractTexture::parameterIImplementationDefault;
@ -217,6 +217,18 @@ TextureState::TextureState(Context& context, std::vector<std::string>& extension
parameterIuivImplementation = nullptr; parameterIuivImplementation = nullptr;
parameterIivImplementation = nullptr; parameterIivImplementation = nullptr;
} }
/* Buffer texture implementation for ES3 */
if(context.isVersionSupported(Version::GLES320)) {
setBufferImplementation = &BufferTexture::setBufferImplementationDefault;
setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationDefault;
} else if(context.isExtensionSupported<Extensions::GL::EXT::texture_buffer>()) {
setBufferImplementation = &BufferTexture::setBufferImplementationEXT;
setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationEXT;
} else {
setBufferImplementation = nullptr;
setBufferRangeImplementation = nullptr;
}
#endif #endif
/* Data invalidation implementation */ /* Data invalidation implementation */

Loading…
Cancel
Save