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)
#endif
#endif
#ifndef MAGNUM_TARGET_GLES
#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL)
_c(Texture)
#endif
#ifndef MAGNUM_TARGET_GLES2

8
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

58
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);

30
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);

2
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.
*/

4
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

4
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

16
src/Magnum/Implementation/TextureState.cpp

@ -193,7 +193,7 @@ TextureState::TextureState(Context& context, std::vector<std::string>& 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<std::string>& 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<std::string>& 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<Extensions::GL::EXT::texture_buffer>()) {
setBufferImplementation = &BufferTexture::setBufferImplementationEXT;
setBufferRangeImplementation = &BufferTexture::setBufferRangeImplementationEXT;
} else {
setBufferImplementation = nullptr;
setBufferRangeImplementation = nullptr;
}
#endif
/* Data invalidation implementation */

Loading…
Cancel
Save