Browse Source

Internal texture and renderbuffer format rework.

Got rid of InternalFormat class, now it is all in one big enum, as each
version (desktop, ES2, ES3) has different requirements and it can't be
done that way anymore (moreover that was terribly ugly solution).
pull/7/head
Vladimír Vondruš 14 years ago
parent
commit
9153bcd957
  1. 77
      src/AbstractTexture.cpp
  2. 919
      src/AbstractTexture.h
  3. 36
      src/BufferedTexture.cpp
  4. 160
      src/BufferedTexture.h
  5. 57
      src/Renderbuffer.cpp
  6. 516
      src/Renderbuffer.h

77
src/AbstractTexture.cpp

@ -227,22 +227,22 @@ void AbstractTexture::parameterImplementationDSA(GLenum parameter, const GLfloat
void AbstractTexture::imageImplementationDefault(GLenum target, GLint mipLevel, InternalFormat internalFormat, const Math::Vector<1, GLsizei>& size, AbstractImage::Components components, AbstractImage::ComponentType type, const GLvoid* data) {
bindInternal();
glTexImage1D(target, mipLevel, internalFormat, size[0], 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
glTexImage1D(target, mipLevel, static_cast<GLint>(internalFormat), size[0], 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
}
void AbstractTexture::imageImplementationDSA(GLenum target, GLint mipLevel, InternalFormat internalFormat, const Math::Vector<1, GLsizei>& size, AbstractImage::Components components, AbstractImage::ComponentType type, const GLvoid* data) {
glTextureImage1DEXT(_id, target, mipLevel, internalFormat, size[0], 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
glTextureImage1DEXT(_id, target, mipLevel, GLint(internalFormat), size[0], 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
}
#endif
void AbstractTexture::imageImplementationDefault(GLenum target, GLint mipLevel, InternalFormat internalFormat, const Vector2i& size, AbstractImage::Components components, AbstractImage::ComponentType type, const GLvoid* data) {
bindInternal();
glTexImage2D(target, mipLevel, internalFormat, size.x(), size.y(), 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
glTexImage2D(target, mipLevel, GLint(internalFormat), size.x(), size.y(), 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
}
#ifndef MAGNUM_TARGET_GLES
void AbstractTexture::imageImplementationDSA(GLenum target, GLint mipLevel, InternalFormat internalFormat, const Vector2i& size, AbstractImage::Components components, AbstractImage::ComponentType type, const GLvoid* data) {
glTextureImage2DEXT(_id, target, mipLevel, internalFormat, size.x(), size.y(), 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
glTextureImage2DEXT(_id, target, mipLevel, GLint(internalFormat), size.x(), size.y(), 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
}
#endif
@ -250,7 +250,7 @@ void AbstractTexture::imageImplementationDefault(GLenum target, GLint mipLevel,
bindInternal();
/** @todo Get some extension wrangler instead to avoid linker errors to glTexImage3D() on ES2 */
#ifndef MAGNUM_TARGET_GLES2
glTexImage3D(target, mipLevel, internalFormat, size.x(), size.y(), size.z(), 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
glTexImage3D(target, mipLevel, GLint(internalFormat), size.x(), size.y(), size.z(), 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
#else
static_cast<void>(target);
static_cast<void>(mipLevel);
@ -264,7 +264,7 @@ void AbstractTexture::imageImplementationDefault(GLenum target, GLint mipLevel,
#ifndef MAGNUM_TARGET_GLES
void AbstractTexture::imageImplementationDSA(GLenum target, GLint mipLevel, InternalFormat internalFormat, const Vector3i& size, AbstractImage::Components components, AbstractImage::ComponentType type, const GLvoid* data) {
glTextureImage3DEXT(_id, target, mipLevel, internalFormat, size.x(), size.y(), size.z(), 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
glTextureImage3DEXT(_id, target, mipLevel, GLint(internalFormat), size.x(), size.y(), size.z(), 0, static_cast<GLenum>(components), static_cast<GLenum>(type), data);
}
#endif
@ -312,71 +312,6 @@ void AbstractTexture::subImageImplementationDSA(GLenum target, GLint mipLevel, c
}
#endif
#ifndef MAGNUM_TARGET_GLES2
AbstractTexture::InternalFormat::InternalFormat(AbstractTexture::Components components, AbstractTexture::ComponentType type) {
#ifndef MAGNUM_TARGET_GLES
#define internalFormatSwitch(c) switch(type) { \
case ComponentType::UnsignedByte: \
internalFormat = GL_##c##8UI; break; \
case ComponentType::Byte: \
internalFormat = GL_##c##8I; break; \
case ComponentType::UnsignedShort: \
internalFormat = GL_##c##16UI; break; \
case ComponentType::Short: \
internalFormat = GL_##c##16I; break; \
case ComponentType::UnsignedInt: \
internalFormat = GL_##c##32UI; break; \
case ComponentType::Int: \
internalFormat = GL_##c##32I; break; \
case ComponentType::Half: \
internalFormat = GL_##c##16F; break; \
case ComponentType::Float: \
internalFormat = GL_##c##32F; break; \
case ComponentType::NormalizedUnsignedByte: \
internalFormat = GL_##c##8; break; \
case ComponentType::NormalizedByte: \
internalFormat = GL_##c##8_SNORM; break; \
case ComponentType::NormalizedUnsignedShort: \
internalFormat = GL_##c##16; break; \
case ComponentType::NormalizedShort: \
internalFormat = GL_##c##16_SNORM; break; \
}
#else
#define internalFormatSwitch(c) switch(type) { \
case ComponentType::UnsignedByte: \
internalFormat = GL_##c##8UI; break; \
case ComponentType::Byte: \
internalFormat = GL_##c##8I; break; \
case ComponentType::UnsignedShort: \
internalFormat = GL_##c##16UI; break; \
case ComponentType::Short: \
internalFormat = GL_##c##16I; break; \
case ComponentType::UnsignedInt: \
internalFormat = GL_##c##32UI; break; \
case ComponentType::Int: \
internalFormat = GL_##c##32I; break; \
case ComponentType::Half: \
internalFormat = GL_##c##16F; break; \
case ComponentType::Float: \
internalFormat = GL_##c##32F; break; \
case ComponentType::NormalizedUnsignedByte: \
internalFormat = GL_##c##8; break; \
case ComponentType::NormalizedByte: \
internalFormat = GL_##c##8_SNORM; break; \
}
#endif
if(components == Components::Red)
internalFormatSwitch(R)
else if(components == Components::RedGreen)
internalFormatSwitch(RG)
else if(components == Components::RGB)
internalFormatSwitch(RGB)
else if(components == Components::RGBA)
internalFormatSwitch(RGBA)
#undef internalFormatSwitch
}
#endif
#ifndef DOXYGEN_GENERATING_OUTPUT
void AbstractTexture::DataHelper<2>::setWrapping(AbstractTexture* texture, const Array2D<Wrapping>& wrapping) {
#ifndef MAGNUM_TARGET_GLES

919
src/AbstractTexture.h

File diff suppressed because it is too large Load Diff

36
src/BufferedTexture.cpp

@ -34,43 +34,11 @@ void BufferedTexture::initializeContextBasedFunctionality(Context* context) {
void BufferedTexture::setBufferImplementationDefault(BufferedTexture::InternalFormat internalFormat, Buffer* buffer) {
bindInternal();
glTexBuffer(GL_TEXTURE_BUFFER, internalFormat, buffer->id());
glTexBuffer(GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer->id());
}
void BufferedTexture::setBufferImplementationDSA(BufferedTexture::InternalFormat internalFormat, Buffer* buffer) {
glTextureBufferEXT(id(), GL_TEXTURE_BUFFER, internalFormat, buffer->id());
}
BufferedTexture::InternalFormat::InternalFormat(Components components, ComponentType type) {
#define internalFormatSwitch(c) switch(type) { \
case ComponentType::UnsignedByte: \
internalFormat = GL_##c##8UI; break; \
case ComponentType::Byte: \
internalFormat = GL_##c##8I; break; \
case ComponentType::UnsignedShort: \
internalFormat = GL_##c##16UI; break; \
case ComponentType::Short: \
internalFormat = GL_##c##16I; break; \
case ComponentType::UnsignedInt: \
internalFormat = GL_##c##32UI; break; \
case ComponentType::Int: \
internalFormat = GL_##c##32I; break; \
case ComponentType::Half: \
internalFormat = GL_##c##16F; break; \
case ComponentType::Float: \
internalFormat = GL_##c##32F; break; \
case ComponentType::NormalizedUnsignedByte: \
internalFormat = GL_##c##8; break; \
case ComponentType::NormalizedUnsignedShort: \
internalFormat = GL_##c##16; break; \
}
if(components == Components::Red)
internalFormatSwitch(R)
else if(components == Components::RedGreen)
internalFormatSwitch(RG)
else if(components == Components::RGBA)
internalFormatSwitch(RGBA)
#undef internalFormatSwitch
glTextureBufferEXT(id(), GL_TEXTURE_BUFFER, GLenum(internalFormat), buffer->id());
}
}

160
src/BufferedTexture.h

@ -79,75 +79,120 @@ class MAGNUM_EXPORT BufferedTexture: private AbstractTexture {
BufferedTexture& operator=(BufferedTexture&& other) = delete;
public:
/** @{ @name Internal buffered texture formats */
/**
* @copybrief AbstractTexture::Components
* @brief Internal format
*
* Like AbstractTexture::Components, without three-component RGB.
* @see setBuffer()
*/
enum class Components {
Red, RedGreen, RGBA
};
enum class InternalFormat: GLenum {
/** Red component, normalized unsigned byte. */
R8 = GL_R8,
/**
* @copybrief AbstractTexture::ComponentType
*
* Like AbstractTexture::ComponentType, without normalized signed
* types.
*/
enum class ComponentType {
UnsignedByte, Byte, UnsignedShort, Short, UnsignedInt, Int, Half,
Float, NormalizedUnsignedByte, NormalizedUnsignedShort
};
/** Red and green component, each normalized unsigned byte. */
RG8 = GL_RG8,
/** @copybrief AbstractTexture::Format */
enum class Format: GLenum {
/**
* Three-component RGB, float, each component 32bit, 96bit total.
*
* @requires_gl40 Extension @extension{ARB,texture_buffer_object_rgb32}
*/
RGB32Float = GL_RGB32F,
/** RGBA, each component normalized unsigned byte. */
RGBA8 = GL_RGBA8,
/** Red component, normalized unsigned short. */
R16 = GL_R16,
/** Red and green component, each normalized unsigned short. */
RG16 = GL_RG16,
/** RGBA, each component normalized unsigned short. */
RGBA16 = GL_RGBA16,
/** Red component, non-normalized unsigned byte. */
R8UI = GL_R8UI,
/** Red and green component, each non-normalized unsigned byte. */
RG8UI = GL_RG8UI,
/** RGBA, each component non-normalized unsigned byte. */
RGBA8UI = GL_RGBA8UI,
/** Red component, non-normalized signed byte. */
R8I = GL_R8I,
/** Red and green component, each non-normalized signed byte. */
RG8I = GL_RG8I,
/** RGBA, each component non-normalized signed byte. */
RGBA8I = GL_RGBA8I,
/** Red component, non-normalized unsigned short. */
R16UI = GL_R16UI,
/** Red and green component, each non-normalized unsigned short. */
RG16UI = GL_RG16UI,
/** RGBA, each component non-normalized unsigned short. */
RGBA16UI = GL_RGBA16UI,
/** Red component, non-normalized signed short. */
R16I = GL_R16I,
/** Red and green component, each non-normalized signed short. */
RG16I = GL_RG16I,
/** RGBA, each component non-normalized signed short. */
RGBA16I = GL_RGBA16I,
/** Red component, non-normalized unsigned int. */
R32UI = GL_R32UI,
/** Red and green component, each non-normalized unsigned int. */
RG32UI = GL_RG32UI,
/**
* Three-component RGB, unsigned non-normalized, each component
* 32bit, 96bit total.
*
* RGB, each component non-normalized unsigned int.
* @requires_gl40 Extension @extension{ARB,texture_buffer_object_rgb32}
*/
RGB32UnsignedInt = GL_RGB32UI,
RGB32UI = GL_RGB32UI,
/** RGBA, each component non-normalized unsigned int. */
RGBA32UI = GL_RGBA32UI,
/** Red component, non-normalized signed int. */
R32I = GL_R32I,
/** Red and green component, each non-normalized signed int. */
RG32I = GL_RG32I,
/**
* Three-component RGB, signed non-normalized, each component
* 32bit, 96bit total.
*
* RGB, each component non-normalized signed int.
* @requires_gl40 Extension @extension{ARB,texture_buffer_object_rgb32}
*/
RGB32Int = GL_RGB32I
};
RGB32I = GL_RGB32I,
/** @copydoc AbstractTexture::InternalFormat */
class MAGNUM_EXPORT InternalFormat {
public:
/** @copybrief AbstractTexture::InternalFormat::InternalFormat(AbstractTexture::Components, AbstractTexture::ComponentType) */
InternalFormat(Components components, ComponentType type);
/** RGBA, each component non-normalized signed int. */
RGBA32I = GL_RGBA32I,
/** @copydoc AbstractTexture::InternalFormat::InternalFormat(AbstractTexture::Format) */
inline constexpr InternalFormat(Format format): internalFormat(static_cast<GLenum>(format)) {}
/** Red component, half float. */
R16F = GL_R16F,
/**
* @brief OpenGL internal format ID
*
* @todoc Remove workaround when Doxygen supports \@copydoc for conversion operators
*/
inline constexpr operator GLint() const { return internalFormat; }
/** Red and green component, each half float. */
RG16F = GL_RG16F,
private:
GLint internalFormat;
};
/** RGBA, each component half float. */
RGBA16F = GL_RGBA16F,
/*@}*/
/** Red component, float. */
R32F = GL_R32F,
/** Red and green component, each float. */
RG32F = GL_RG32F,
/**
* RGB, each component float.
* @requires_gl40 Extension @extension{ARB,texture_buffer_object_rgb32}
*/
RGB32F = GL_RGB32F,
/** RGBA, each component float. */
RGBA32F = GL_RGBA32F
};
inline BufferedTexture(): AbstractTexture(GL_TEXTURE_BUFFER) {}
@ -178,19 +223,6 @@ class MAGNUM_EXPORT BufferedTexture: private AbstractTexture {
static SetBufferImplementation setBufferImplementation;
};
/** @relates BufferedTexture
@brief Convertor of component count and data type to InternalFormat
*/
inline BufferedTexture::InternalFormat operator|(BufferedTexture::Components components, BufferedTexture::ComponentType type) {
return BufferedTexture::InternalFormat(components, type);
}
/** @relates BufferedTexture
* @overload
*/
inline BufferedTexture::InternalFormat operator|(BufferedTexture::ComponentType type, BufferedTexture::Components components) {
return BufferedTexture::InternalFormat(components, type);
}
}
#endif

57
src/Renderbuffer.cpp

@ -17,61 +17,4 @@
namespace Magnum {
#ifndef MAGNUM_TARGET_GLES2
Renderbuffer::InternalFormat::InternalFormat(Components components, ComponentType type) {
#ifndef MAGNUM_TARGET_GLES
#define internalFormatSwitch(c) switch(type) { \
case ComponentType::UnsignedByte: \
internalFormat = GL_##c##8UI; break; \
case ComponentType::Byte: \
internalFormat = GL_##c##8I; break; \
case ComponentType::UnsignedShort: \
internalFormat = GL_##c##16UI; break; \
case ComponentType::Short: \
internalFormat = GL_##c##16I; break; \
case ComponentType::UnsignedInt: \
internalFormat = GL_##c##32UI; break; \
case ComponentType::Int: \
internalFormat = GL_##c##32I; break; \
case ComponentType::Half: \
internalFormat = GL_##c##16F; break; \
case ComponentType::Float: \
internalFormat = GL_##c##32F; break; \
case ComponentType::NormalizedUnsignedByte: \
internalFormat = GL_##c##8; break; \
case ComponentType::NormalizedUnsignedShort: \
internalFormat = GL_##c##16; break; \
}
#else
#define internalFormatSwitch(c) switch(type) { \
case ComponentType::UnsignedByte: \
internalFormat = GL_##c##8UI; break; \
case ComponentType::Byte: \
internalFormat = GL_##c##8I; break; \
case ComponentType::UnsignedShort: \
internalFormat = GL_##c##16UI; break; \
case ComponentType::Short: \
internalFormat = GL_##c##16I; break; \
case ComponentType::UnsignedInt: \
internalFormat = GL_##c##32UI; break; \
case ComponentType::Int: \
internalFormat = GL_##c##32I; break; \
case ComponentType::Half: \
internalFormat = GL_##c##16F; break; \
case ComponentType::Float: \
internalFormat = GL_##c##32F; break; \
case ComponentType::NormalizedUnsignedByte: \
internalFormat = GL_##c##8; break; \
}
#endif
if(components == Components::Red)
internalFormatSwitch(R)
else if(components == Components::RedGreen)
internalFormatSwitch(RG)
else if(components == Components::RGBA)
internalFormatSwitch(RGBA)
#undef internalFormatSwitch
}
#endif
}

516
src/Renderbuffer.h

@ -40,156 +40,471 @@ class Renderbuffer {
Renderbuffer& operator=(Renderbuffer&& other) = delete;
public:
/** @{ @name Internal renderbuffer formats */
#ifndef MAGNUM_TARGET_GLES2
/**
* @copybrief AbstractTexture::Components
* @brief Internal format
*
* Like AbstractTexture::Components, without three-component RGB.
* @requires_gles30 (no extension providing this functionality)
* @see @ref Texture::setData() "setData()"
* @todo RGB, RGB8 ES only (ES3 + @es_extension{OES,rgb8_rgba8})
*/
enum class Components {
Red, RedGreen, RGBA
};
enum class InternalFormat: GLenum {
#ifndef MAGNUM_TARGET_GLES
/**
* Red component, normalized unsigned, size implementation-dependent.
* @deprecated Prefer to use the exactly specified version of this
* format, e.g. @ref Magnum::Renderbuffer::InternalFormat "InternalFormat::R8".
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gl Use exactly specified format in OpenGL ES instead.
*/
Red = GL_RED,
#endif
/**
* @copybrief AbstractTexture::ComponentType
*
* Like AbstractTexture::ComponentType, without normalized signed
* types.
* @requires_gles30 (no extension providing this functionality)
*/
enum class ComponentType {
UnsignedByte, Byte, UnsignedShort, Short, UnsignedInt, Int, Half,
Float, NormalizedUnsignedByte
/**
* Red component, normalized unsigned byte.
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gles30 %Extension @es_extension{EXT,texture_rg}
*/
#ifndef MAGNUM_TARGET_GLES2
R8 = GL_R8,
#else
R8 = GL_R8_EXT,
#endif
#ifndef MAGNUM_TARGET_GLES
, NormalizedUnsignedShort
/**
* Red and green component, normalized unsigned, size
* implementation-dependent.
* @deprecated Prefer to use the exactly specified version of this
* format, e.g. @ref Magnum::Renderbuffer::InternalFormat "InternalFormat::RG8".
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gl Use exactly specified format in OpenGL ES instead.
*/
RG = GL_RG,
#endif
};
#endif
/**
* @copybrief AbstractTexture::Format
*
* Like AbstractTexture::Format without
* AbstractTexture::Format::RGB9Intensity5, three-component and
* compressed formats, but with added separate stencil index.
*/
enum class Format: GLenum {
/**
* Red and green component, each normalized unsigned byte.
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gles30 %Extension @es_extension{EXT,texture_rg}
*/
#ifndef MAGNUM_TARGET_GLES2
Red = GL_RED, RedGreen = GL_RG,
RG8 = GL_RG8,
#else
RG8 = GL_RG8_EXT,
#endif
#ifndef MAGNUM_TARGET_GLES
/**
* RGBA, normalized unsigned, size implementation-dependent.
* @deprecated Prefer to use the exactly specified version of this
* format, e.g. @ref Magnum::Renderbuffer::InternalFormat "InternalFormat::RGBA8".
* @requires_gl Use exactly specified format in OpenGL ES 2.0
* instead.
*/
RGBA = GL_RGBA,
#endif
/**
* RGBA, each component normalized unsigned byte.
* @requires_gles30 %Extension @es_extension{ARM,rgba8} or
* @es_extension{OES,required_internalformat} and @es_extension{OES,rgb8_rgba8}
*/
#ifndef MAGNUM_TARGET_GLES2
RGBA8 = GL_RGBA8,
#else
RGBA8 = GL_RGBA8_OES,
#endif
#ifndef MAGNUM_TARGET_GLES
BGRA = GL_BGRA,
/**
* Red component, normalized unsigned short.
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gl Only byte-sized normalized formats are available
* in OpenGL ES.
*/
R16 = GL_R16,
/**
* Red and green component, each normalized unsigned short.
* @requires_gl30 %Extension @extension{ARB,texture_rg}
* @requires_gl Only byte-sized normalized formats are available
* in OpenGL ES.
*/
RG16 = GL_RG16,
/**
* RGB, each component normalized unsigned short.
* @requires_gl Only byte-sized normalized formats are available
* in OpenGL ES.
*/
RGB16 = GL_RGB16,
/**
* RGBA, each component normalized unsigned short.
* @requires_gl Only byte-sized normalized formats are available
* in OpenGL ES.
*/
RGBA16 = GL_RGBA16,
#endif
#ifndef MAGNUM_TARGET_GLES2
SRGBA = GL_SRGB8_ALPHA8, RGB10Alpha2 = GL_RGB10_A2,
RGB10AlphaUnsigned2 = GL_RGB10_A2UI,
/**
* Red component, non-normalized unsigned byte.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
R8UI = GL_R8UI,
/**
* Red and green component, each non-normalized unsigned byte.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RG8UI = GL_RG8UI,
/**
* RGBA, each component non-normalized unsigned byte.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RGBA8UI = GL_RGBA8UI,
/**
* Red component, non-normalized signed byte.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
R8I = GL_R8I,
/**
* Red and green component, each non-normalized signed byte.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RG8I = GL_RG8I,
/**
* RGBA, each component non-normalized signed byte.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RGBA8I = GL_RGBA8I,
/**
* Red component, non-normalized unsigned short.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
R16UI = GL_R16UI,
/**
* Red and green component, each non-normalized unsigned short.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RG16UI = GL_RG16UI,
/**
* RGBA, each component non-normalized unsigned short.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RGBA16UI = GL_RGBA16UI,
/**
* Red component, non-normalized signed short.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
R16I = GL_R16I,
/**
* Red and green component, each non-normalized signed short.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RG16I = GL_RG16I,
/**
* RGBA, each component non-normalized signed short.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RGBA16I = GL_RGBA16I,
/**
* Red component, non-normalized unsigned int.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
R32UI = GL_R32UI,
/**
* Red and green component, each non-normalized unsigned int.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RG32UI = GL_RG32UI,
/**
* RGBA, each component non-normalized unsigned int.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RGBA32UI = GL_RGBA32UI,
/**
* Red component, non-normalized signed int.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
R32I = GL_R32I,
/**
* Red and green component, each non-normalized signed int.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RG32I = GL_RG32I,
/**
* RGBA, each component non-normalized signed int.
* @requires_gl30 %Extension @extension{EXT,texture_integer}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RGBA32I = GL_RGBA32I,
#endif
RGB5Alpha1 = GL_RGB5_A1,
RGBA4 = GL_RGBA4,
#ifndef MAGNUM_TARGET_GLES
/**
* Red component, half float.
* @requires_gl30 %Extension @extension{ARB,texture_float}
* @requires_gl Only (non)normalized integral formats are
* available in OpenGL ES.
*/
R16F = GL_R16F,
/**
* Red and green component, each half float.
* @requires_gl30 %Extension @extension{ARB,texture_float}
* @requires_gl Only (non)normalized integral formats are
* available in OpenGL ES.
*/
RG16F = GL_RG16F,
/**
* RGBA, each component half float.
* @requires_gl30 %Extension @extension{ARB,texture_float}
* @requires_gl Only (non)normalized integral formats are
* available in OpenGL ES.
*/
RGBA16F = GL_RGBA16F,
/**
* Red component, float.
* @requires_gl30 %Extension @extension{ARB,texture_float}
* @requires_gl Only (non)normalized integral formats are
* available in OpenGL ES.
*/
R32F = GL_R32F,
/**
* Red and green component, each float.
* @requires_gl30 %Extension @extension{ARB,texture_float}
* @requires_gl Only (non)normalized integral formats are
* available in OpenGL ES.
*/
RG32F = GL_RG32F,
/**
* RGBA, each component float.
* @requires_gl30 %Extension @extension{ARB,texture_float}
* @requires_gl Only (non)normalized integral formats are
* available in OpenGL ES.
*/
RGBA32F = GL_RGBA32F,
#endif
#ifndef MAGNUM_TARGET_GLES2
RFloat11GFloat11BFloat10 = GL_R11F_G11F_B10F,
/**
* RGBA, normalized unsigned, each RGB component 10bit, alpha 2bit.
* @requires_gles30 Usable only as internal texture format in OpenGL
* ES 2.0, see @ref Magnum::AbstractTexture::InternalFormat "InternalFormat::RGB10A2".
*/
RGB10A2 = GL_RGB10_A2,
/**
* RGBA, non-normalized unsigned, each RGB component 10bit, alpha 2bit.
* @requires_gl33 %Extension @extension{ARB,texture_rgb10_a2ui}
* @requires_gles30 Only normalized integral formats are available
* in OpenGL ES 2.0.
*/
RGB10A2UI = GL_RGB10_A2UI,
#endif
/** RGBA, normalized unsigned, each RGB component 5bit, alpha 1bit. */
RGB5A1 = GL_RGB5_A1,
/** RGBA, normalized unsigned, each component 4bit. */
RGBA4 = GL_RGBA4,
#ifndef MAGNUM_TARGET_GLES
/**
* RGB, float, red and green 11bit, blue 10bit.
* @requires_gl30 %Extension @extension{EXT,packed_float}
* @requires_gl Usable only as internal texture format in OpenGL
* ES, see @ref Magnum::AbstractTexture::InternalFormat "InternalFormat::R11FG11FB10F".
*/
R11FG11FB10F = GL_R11F_G11F_B10F,
#endif
/* 1.5.6 <= GLEW < 1.8.0 doesn't have this, even if there is
GL_ARB_ES2_compatibility */
#if defined(GL_RGB565) || defined(DOXYGEN_GENERATING_OUTPUT)
/** RGB, normalized unsigned, red and blue 5bit, green 6bit. */
RGB565 = GL_RGB565,
#endif
#ifndef MAGNUM_TARGET_GLES
/**
* Depth component, at least 16bit.
*
* Prefer to use the exactly specified version of this format, in
* this case e.g. `Format::%Depth16`.
* @requires_gl Use exactly specified format <tt>Format::%Depth16</tt> instead.
* sRGBA, each component normalized unsigned byte.
* @requires_gles30 %Extension @es_extension{EXT,sRGB}
*/
Depth = GL_DEPTH_COMPONENT,
#ifndef MAGNUM_TARGET_GLES2
SRGB8Alpha8 = GL_SRGB8_ALPHA8,
#else
SRGB8Alpha8 = GL_SRGB8_ALPHA8_EXT,
#endif
DepthStencil = GL_DEPTH_STENCIL,
#ifndef MAGNUM_TARGET_GLES
/**
* Depth component, size implementation-dependent.
* @todo is this allowed in core?
* @deprecated Prefer to use exactly specified version of this
* format, e.g. @ref Magnum::Renderbuffer::InternalFormat "InternalFormat::DepthComponent16".
* @requires_gl Use exactly specified format in OpenGL ES instead.
*/
DepthComponent = GL_DEPTH_COMPONENT,
#endif
Depth16 = GL_DEPTH_COMPONENT16,
/** Depth component, 16bit. */
DepthComponent16 = GL_DEPTH_COMPONENT16,
/**
* Depth component, 24bit.
* @requires_gles30 %Extension @es_extension{OES,depth24}
*/
#ifndef MAGNUM_TARGET_GLES2
DepthComponent24 = GL_DEPTH_COMPONENT24,
#else
DepthComponent24 = GL_DEPTH_COMPONENT24_OES,
#endif
/**
* Depth component, 32bit.
* @requires_es_extension %Extension @es_extension{OES,depth32}
*/
#ifndef MAGNUM_TARGET_GLES
Depth24 = GL_DEPTH_COMPONENT24,
DepthFloat = GL_DEPTH_COMPONENT32F,
DepthComponent32 = GL_DEPTH_COMPONENT32,
#else
DepthComponent32 = GL_DEPTH_COMPONENT32_OES,
#endif
#ifndef MAGNUM_TARGET_GLES2
/**
* Stencil index (unspecified size).
*
* Prefer to use the exactly specified version of this format, in
* this case e.g. `Format::%Stencil8`.
* @requires_gl Use exactly specified format <tt>Format::%Stencil8</tt> instead.
* Depth component, 32bit float.
* @requires_gl30 %Extension @extension{ARB,depth_buffer_float}
* @requires_gles30 Only integral depth textures are available in
* OpenGL ES 2.0.
*/
Stencil = GL_STENCIL_INDEX,
DepthComponent32F = GL_DEPTH_COMPONENT32F,
#endif
#ifndef MAGNUM_TARGET_GLES
/**
* Stencil index, size implementation-dependent.
* @deprecated Prefer to use exactly specified version of this
* format, e.g. @ref Magnum::Renderbuffer::InternalFormat "InternalFormat::StencilIndex8".
* @requires_gl Use exactly specified format in OpenGL ES instead.
*/
StencilIndex = GL_STENCIL_INDEX,
#endif
/**
* 1-bit stencil index.
*
* @requires_gl Use <tt>Format::%Stencil8</tt> instead.
* @requires_es_extension %Extension @es_extension{OES,stencil1}
*/
Stencil1 = GL_STENCIL_INDEX1,
#ifndef MAGNUM_TARGET_GLES
StencilIndex1 = GL_STENCIL_INDEX1,
#else
StencilIndex1 = GL_STENCIL_INDEX1_OES,
#endif
/**
* 4-bit stencil index.
*
* @requires_gl Use <tt>Format::%Stencil8</tt> instead.
* @requires_es_extension %Extension @es_extension{OES,stencil4}
*/
Stencil4 = GL_STENCIL_INDEX4,
#ifndef MAGNUM_TARGET_GLES
StencilIndex4 = GL_STENCIL_INDEX4,
#else
StencilIndex4 = GL_STENCIL_INDEX4_OES,
#endif
/** 8-bit stencil index. */
Stencil8 = GL_STENCIL_INDEX8
StencilIndex8 = GL_STENCIL_INDEX8,
#ifndef MAGNUM_TARGET_GLES
,
/**
* 16-bit stencil index.
*
* @requires_gl Use <tt>Format::%Stencil8</tt> instead.
* @requires_gl At most 8bit stencil index is available in OpenGL
* ES.
*/
Stencil16 = GL_STENCIL_INDEX1,
StencilIndex16 = GL_STENCIL_INDEX16,
Depth24Stencil8 = GL_DEPTH24_STENCIL8,
DepthFloatStencil8 = GL_DEPTH32F_STENCIL8
/**
* Depth and stencil component, size implementation-dependent.
* @deprecated Prefer to use exactly specified version of this
* format, e.g. @ref Magnum::Renderbuffer::InternalFormat "InternalFormat::Depth24Stencil8".
* @requires_gl Use exactly specified format in OpenGL ES instead.
*/
DepthStencil = GL_DEPTH_STENCIL,
#endif
};
/** @copydoc AbstractTexture::InternalFormat */
class MAGNUM_EXPORT InternalFormat {
public:
#ifndef MAGNUM_TARGET_GLES2
/** @copydoc AbstractTexture::InternalFormat::InternalFormat(AbstractTexture::Components, AbstractTexture::ComponentType) */
InternalFormat(Components components, ComponentType type);
#endif
/** @copydoc AbstractTexture::InternalFormat::InternalFormat(AbstractTexture::Format) */
inline constexpr InternalFormat(Format format): internalFormat(static_cast<GLenum>(format)) {}
/**
* @brief OpenGL internal format ID
*
* @todoc Remove workaround when Doxygen supports \@copydoc for conversion operators
*/
inline constexpr operator GLenum() const { return internalFormat; }
private:
GLenum internalFormat;
};
/**
* 24bit depth and 8bit stencil component.
* @requires_gl30 %Extension @extension{EXT,packed_depth_stencil}
* @requires_gles30 %Extension @es_extension{OES,packed_depth_stencil}
*/
#ifdef MAGNUM_TARGET_GLES2
Depth24Stencil8 = GL_DEPTH24_STENCIL8_OES,
#else
Depth24Stencil8 = GL_DEPTH24_STENCIL8,
/*@}*/
/**
* 32bit float depth component and 8bit stencil component.
* @requires_gl30 %Extension @extension{ARB,depth_buffer_float}
* @requires_gles30 Only integral depth textures are available in
* OpenGL ES 2.0.
*/
Depth32FStencil8 = GL_DEPTH32F_STENCIL8,
#endif
};
/**
* @brief Constructor
@ -232,30 +547,13 @@ class Renderbuffer {
*/
inline void setStorage(InternalFormat internalFormat, const Vector2i& size) {
bind();
glRenderbufferStorage(GL_RENDERBUFFER, internalFormat, size.x(), size.y());
glRenderbufferStorage(GL_RENDERBUFFER, GLenum(internalFormat), size.x(), size.y());
}
private:
GLuint renderbuffer;
};
#ifndef MAGNUM_TARGET_GLES2
/** @relates Renderbuffer
@brief Convertor of component count and data type to InternalFormat
@requires_gles30 (no extension providing this functionality)
*/
inline Renderbuffer::InternalFormat operator|(Renderbuffer::Components components, Renderbuffer::ComponentType type) {
return Renderbuffer::InternalFormat(components, type);
}
/** @relates Renderbuffer
* @overload
*/
inline Renderbuffer::InternalFormat operator|(Renderbuffer::ComponentType type, Renderbuffer::Components components) {
return Renderbuffer::InternalFormat(components, type);
}
#endif
}
#endif

Loading…
Cancel
Save