summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/renderer_gl.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/renderer_gl.cpp')
-rw-r--r--3rdparty/bgfx/src/renderer_gl.cpp164
1 files changed, 118 insertions, 46 deletions
diff --git a/3rdparty/bgfx/src/renderer_gl.cpp b/3rdparty/bgfx/src/renderer_gl.cpp
index 9527346aed1..557614ef960 100644
--- a/3rdparty/bgfx/src/renderer_gl.cpp
+++ b/3rdparty/bgfx/src/renderer_gl.cpp
@@ -232,6 +232,7 @@ namespace bgfx { namespace gl
{ GL_RG32I, GL_ZERO, GL_RG, GL_INT, false }, // RG32I
{ GL_RG32UI, GL_ZERO, GL_RG, GL_UNSIGNED_INT, false }, // RG32U
{ GL_RG32F, GL_ZERO, GL_RG, GL_FLOAT, false }, // RG32F
+ { GL_RGB9_E5, GL_ZERO, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, false }, // RGB9E5F
{ GL_RGBA8, GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE, false }, // BGRA8
{ GL_RGBA8, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, false }, // RGBA8
{ GL_RGBA8I, GL_ZERO, GL_RGBA, GL_BYTE, false }, // RGBA8I
@@ -310,6 +311,7 @@ namespace bgfx { namespace gl
GL_RG32I, // RG32I
GL_RG32UI, // RG32U
GL_RG32F, // RG32F
+ GL_RGB9_E5, // RGB9E5F
GL_RGBA8, // BGRA8
GL_RGBA8, // RGBA8
GL_RGBA8I, // RGBA8I
@@ -386,6 +388,7 @@ namespace bgfx { namespace gl
GL_RG32I, // RG32I
GL_RG32UI, // RG32U
GL_RG32F, // RG32F
+ GL_RGB9_E5, // RGB9E5F
GL_RGBA8, // BGRA8
GL_RGBA8, // RGBA8
GL_RGBA8I, // RGBA8I
@@ -522,6 +525,7 @@ namespace bgfx { namespace gl
EXT_texture_filter_anisotropic,
EXT_texture_format_BGRA8888,
EXT_texture_rg,
+ EXT_texture_shared_exponent,
EXT_texture_snorm,
EXT_texture_sRGB,
EXT_texture_storage,
@@ -720,6 +724,7 @@ namespace bgfx { namespace gl
{ "EXT_texture_filter_anisotropic", false, true },
{ "EXT_texture_format_BGRA8888", false, true },
{ "EXT_texture_rg", false, true }, // GLES2 extension.
+ { "EXT_texture_shared_exponent", false, true },
{ "EXT_texture_snorm", BGFX_CONFIG_RENDERER_OPENGL >= 30, true },
{ "EXT_texture_sRGB", false, true },
{ "EXT_texture_storage", false, true },
@@ -1034,7 +1039,7 @@ namespace bgfx { namespace gl
;
GLsizei size = (16*16*getBitsPerPixel(_format) )/8;
- void* data = alloca(size);
+ void* data = bx::alignPtr(alloca(size+16), 0, 16);
if (isCompressed(_format) )
{
@@ -1053,8 +1058,7 @@ namespace bgfx { namespace gl
? tfi.m_internalFmtSrgb
: tfi.m_internalFmt
;
- if (!s_textureFormat[_format].m_supported
- || GL_ZERO == internalFmt)
+ if (GL_ZERO == internalFmt)
{
return false;
}
@@ -1194,6 +1198,7 @@ namespace bgfx { namespace gl
, m_vaoSupport(false)
, m_samplerObjectSupport(false)
, m_shadowSamplersSupport(false)
+ , m_borderColorSupport(BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) )
, m_programBinarySupport(false)
, m_textureSwizzleSupport(false)
, m_depthTextureSupport(false)
@@ -1372,13 +1377,6 @@ namespace bgfx { namespace gl
// Allow all texture filters.
memset(s_textureFilter, true, BX_COUNTOF(s_textureFilter) );
- for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
- {
- s_textureFormat[ii].m_supported = true
- && TextureFormat::Unknown != ii
- && TextureFormat::UnknownDepth != ii
- ;
- }
bool bc123Supported = 0
|| s_extension[Extension::EXT_texture_compression_s3tc ].m_supported
@@ -1556,7 +1554,10 @@ namespace bgfx { namespace gl
s_textureFormat[TextureFormat::R8].m_fmt = GL_LUMINANCE;
}
- for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
+ for (uint32_t ii = BX_ENABLED(BX_PLATFORM_IOS) ? TextureFormat::Unknown : 0 // skip test on iOS!
+ ; ii < TextureFormat::Count
+ ; ++ii
+ )
{
if (TextureFormat::Unknown != ii
&& TextureFormat::UnknownDepth != ii)
@@ -1782,6 +1783,7 @@ namespace bgfx { namespace gl
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) )
{
+ m_borderColorSupport = s_extension[Extension::NV_texture_border_clamp].m_supported;
s_textureAddress[BGFX_TEXTURE_U_BORDER>>BGFX_TEXTURE_U_SHIFT] = s_extension[Extension::NV_texture_border_clamp].m_supported
? GL_CLAMP_TO_BORDER
: GL_CLAMP_TO_EDGE
@@ -2517,21 +2519,53 @@ namespace bgfx { namespace gl
}
}
- void setSamplerState(uint32_t _stage, uint32_t _numMips, uint32_t _flags)
+ void setSamplerState(uint32_t _stage, uint32_t _numMips, uint32_t _flags, const float _rgba[4])
{
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
|| BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30) )
{
if (0 == (BGFX_SAMPLER_DEFAULT_FLAGS & _flags) )
{
+ const uint32_t index = (_flags & BGFX_TEXTURE_BORDER_COLOR_MASK) >> BGFX_TEXTURE_BORDER_COLOR_SHIFT;
+
_flags &= ~BGFX_TEXTURE_RESERVED_MASK;
_flags &= BGFX_TEXTURE_SAMPLER_BITS_MASK;
_flags |= _numMips<<BGFX_TEXTURE_RESERVED_SHIFT;
- GLuint sampler = m_samplerStateCache.find(_flags);
+
+ GLuint sampler;
+
+ bool hasBorderColor = false;
+ bx::HashMurmur2A murmur;
+ uint32_t hash;
+
+ murmur.begin();
+ murmur.add(_flags);
+ if (!needBorderColor(_flags) )
+ {
+ murmur.add(-1);
+ hash = murmur.end();
+
+ sampler = m_samplerStateCache.find(hash);
+ }
+ else
+ {
+ murmur.add(index);
+ hash = murmur.end();
+
+ if (NULL != _rgba)
+ {
+ hasBorderColor = true;
+ sampler = UINT32_MAX;
+ }
+ else
+ {
+ sampler = m_samplerStateCache.find(hash);
+ }
+ }
if (UINT32_MAX == sampler)
{
- sampler = m_samplerStateCache.add(_flags);
+ sampler = m_samplerStateCache.add(hash);
GL_CHECK(glSamplerParameteri(sampler
, GL_TEXTURE_WRAP_S
@@ -2552,8 +2586,14 @@ namespace bgfx { namespace gl
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, magFilter) );
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, minFilter) );
- const float color[] = { 0.0f, 0.0f, 0.0f, 0.0f };
- GL_CHECK(glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, color) );
+ if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
+ || m_borderColorSupport)
+ {
+ if (hasBorderColor)
+ {
+ GL_CHECK(glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, _rgba) );
+ }
+ }
if (0 != (_flags & (BGFX_TEXTURE_MIN_ANISOTROPIC|BGFX_TEXTURE_MAG_ANISOTROPIC) )
&& 0.0f < m_maxAnisotropy)
@@ -2767,13 +2807,13 @@ namespace bgfx { namespace gl
}
}
- void commit(ConstantBuffer& _constantBuffer)
+ void commit(UniformBuffer& _uniformBuffer)
{
- _constantBuffer.reset();
+ _uniformBuffer.reset();
for (;;)
{
- uint32_t opcode = _constantBuffer.read();
+ uint32_t opcode = _uniformBuffer.read();
if (UniformType::End == opcode)
{
@@ -2784,21 +2824,21 @@ namespace bgfx { namespace gl
uint16_t ignore;
uint16_t num;
uint16_t copy;
- ConstantBuffer::decodeOpcode(opcode, type, ignore, num, copy);
+ UniformBuffer::decodeOpcode(opcode, type, ignore, num, copy);
const char* data;
if (copy)
{
- data = _constantBuffer.read(g_uniformTypeSize[type]*num);
+ data = _uniformBuffer.read(g_uniformTypeSize[type]*num);
}
else
{
UniformHandle handle;
- memcpy(&handle, _constantBuffer.read(sizeof(UniformHandle) ), sizeof(UniformHandle) );
+ memcpy(&handle, _uniformBuffer.read(sizeof(UniformHandle) ), sizeof(UniformHandle) );
data = (const char*)m_uniforms[handle.idx];
}
- uint32_t loc = _constantBuffer.read();
+ uint32_t loc = _uniformBuffer.read();
#define CASE_IMPLEMENT_UNIFORM(_uniform, _glsuffix, _dxsuffix, _type) \
case UniformType::_uniform: \
@@ -2835,7 +2875,7 @@ namespace bgfx { namespace gl
break;
default:
- BX_TRACE("%4d: INVALID 0x%08x, t %d, l %d, n %d, c %d", _constantBuffer.getPos(), opcode, type, loc, num, copy);
+ BX_TRACE("%4d: INVALID 0x%08x, t %d, l %d, n %d, c %d", _uniformBuffer.getPos(), opcode, type, loc, num, copy);
break;
}
@@ -2862,7 +2902,7 @@ namespace bgfx { namespace gl
{
if (BGFX_CLEAR_COLOR_USE_PALETTE & _clear.m_flags)
{
- uint8_t index = (uint8_t)bx::uint32_min(BGFX_CONFIG_MAX_CLEAR_COLOR_PALETTE-1, _clear.m_index[0]);
+ uint8_t index = (uint8_t)bx::uint32_min(BGFX_CONFIG_MAX_COLOR_PALETTE-1, _clear.m_index[0]);
const float* rgba = _palette[index];
const float rr = rgba[0];
const float gg = rgba[1];
@@ -2987,7 +3027,7 @@ namespace bgfx { namespace gl
float mrtClear[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS][4];
for (uint32_t ii = 0; ii < numMrt; ++ii)
{
- uint8_t index = (uint8_t)bx::uint32_min(BGFX_CONFIG_MAX_CLEAR_COLOR_PALETTE-1, _clear.m_index[ii]);
+ uint8_t index = (uint8_t)bx::uint32_min(BGFX_CONFIG_MAX_COLOR_PALETTE-1, _clear.m_index[ii]);
memcpy(mrtClear[ii], _palette[index], 16);
}
@@ -3047,6 +3087,7 @@ namespace bgfx { namespace gl
bool m_vaoSupport;
bool m_samplerObjectSupport;
bool m_shadowSamplersSupport;
+ bool m_borderColorSupport;
bool m_programBinarySupport;
bool m_textureSwizzleSupport;
bool m_depthTextureSupport;
@@ -3295,7 +3336,7 @@ namespace bgfx { namespace gl
{
if (NULL != m_constantBuffer)
{
- ConstantBuffer::destroy(m_constantBuffer);
+ UniformBuffer::destroy(m_constantBuffer);
m_constantBuffer = NULL;
}
m_numPredefined = 0;
@@ -3476,11 +3517,13 @@ namespace bgfx { namespace gl
else
{
const UniformInfo* info = s_renderGL->m_uniformReg.find(name);
+ BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
+
if (NULL != info)
{
if (NULL == m_constantBuffer)
{
- m_constantBuffer = ConstantBuffer::create(1024);
+ m_constantBuffer = UniformBuffer::create(1024);
}
UniformType::Enum type = convertGlType(gltype);
@@ -3719,7 +3762,7 @@ namespace bgfx { namespace gl
m_width = _width;
m_height = _height;
m_depth = _depth;
- m_currentFlags = UINT32_MAX;
+ m_currentSamplerHash = UINT32_MAX;
m_requestedFormat = _format;
m_textureFormat = _format;
@@ -3779,7 +3822,7 @@ namespace bgfx { namespace gl
}
}
- setSamplerState(_flags);
+ setSamplerState(_flags, NULL);
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
&& TextureFormat::BGRA8 == m_requestedFormat
@@ -4156,7 +4199,7 @@ namespace bgfx { namespace gl
}
}
- void TextureGL::setSamplerState(uint32_t _flags)
+ void TextureGL::setSamplerState(uint32_t _flags, const float _rgba[4])
{
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES < 30)
&& !s_textureFilter[m_textureFormat])
@@ -4175,9 +4218,26 @@ namespace bgfx { namespace gl
}
const uint32_t flags = (0 != (BGFX_SAMPLER_DEFAULT_FLAGS & _flags) ? m_flags : _flags) & BGFX_TEXTURE_SAMPLER_BITS_MASK;
- if (flags != m_currentFlags)
+
+ bool hasBorderColor = false;
+ bx::HashMurmur2A murmur;
+ murmur.begin();
+ murmur.add(flags);
+ if (NULL != _rgba)
{
- const GLenum target = m_target;
+ if (BGFX_TEXTURE_U_BORDER == (flags & BGFX_TEXTURE_U_BORDER)
+ || BGFX_TEXTURE_V_BORDER == (flags & BGFX_TEXTURE_V_BORDER)
+ || BGFX_TEXTURE_W_BORDER == (flags & BGFX_TEXTURE_W_BORDER) )
+ {
+ murmur.add(_rgba, 16);
+ hasBorderColor = true;
+ }
+ }
+ uint32_t hash = murmur.end();
+
+ if (hash != m_currentSamplerHash)
+ {
+ const GLenum target = m_target;
const uint8_t numMips = m_numMips;
GL_CHECK(glTexParameteri(target, GL_TEXTURE_WRAP_S, s_textureAddress[(flags&BGFX_TEXTURE_U_MASK)>>BGFX_TEXTURE_U_SHIFT]) );
@@ -4200,8 +4260,14 @@ namespace bgfx { namespace gl
GL_CHECK(glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magFilter) );
GL_CHECK(glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minFilter) );
- const float color[] = { 0.0f, 0.0f, 0.0f, 0.0f };
- GL_CHECK(glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, color) );
+ if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
+ || s_renderGL->m_borderColorSupport)
+ {
+ if (hasBorderColor)
+ {
+ GL_CHECK(glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, _rgba) );
+ }
+ }
if (0 != (flags & (BGFX_TEXTURE_MIN_ANISOTROPIC|BGFX_TEXTURE_MAG_ANISOTROPIC) )
&& 0.0f < s_renderGL->m_maxAnisotropy)
@@ -4224,12 +4290,18 @@ namespace bgfx { namespace gl
}
}
- m_currentFlags = flags;
+ m_currentSamplerHash = hash;
}
}
- void TextureGL::commit(uint32_t _stage, uint32_t _flags)
+ void TextureGL::commit(uint32_t _stage, uint32_t _flags, const float _palette[][4])
{
+ const uint32_t flags = 0 == (BGFX_SAMPLER_DEFAULT_FLAGS & _flags)
+ ? _flags
+ : m_flags
+ ;
+ const uint32_t index = (flags & BGFX_TEXTURE_BORDER_COLOR_MASK) >> BGFX_TEXTURE_BORDER_COLOR_SHIFT;
+
GL_CHECK(glActiveTexture(GL_TEXTURE0+_stage) );
GL_CHECK(glBindTexture(m_target, m_id) );
@@ -4237,7 +4309,7 @@ namespace bgfx { namespace gl
&& BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES < 30) )
{
// GLES2 doesn't have support for sampler object.
- setSamplerState(_flags);
+ setSamplerState(flags, _palette[index]);
}
else if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
&& BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL < 31) )
@@ -4245,17 +4317,17 @@ namespace bgfx { namespace gl
// In case that GL 2.1 sampler object is supported via extension.
if (s_renderGL->m_samplerObjectSupport)
{
- s_renderGL->setSamplerState(_stage, m_numMips, _flags);
+ s_renderGL->setSamplerState(_stage, m_numMips, flags, _palette[index]);
}
else
{
- setSamplerState(_flags);
+ setSamplerState(flags, _palette[index]);
}
}
else
{
// Everything else has sampler object.
- s_renderGL->setSamplerState(_stage, m_numMips, _flags);
+ s_renderGL->setSamplerState(_stage, m_numMips, flags, _palette[index]);
}
}
@@ -5177,7 +5249,7 @@ namespace bgfx { namespace gl
if (BGFX_CLEAR_NONE != (clear.m_flags & BGFX_CLEAR_MASK) )
{
- clearQuad(_clearQuad, viewState.m_rect, clear, height, _render->m_clearColor);
+ clearQuad(_clearQuad, viewState.m_rect, clear, height, _render->m_colorPalette);
}
GL_CHECK(glDisable(GL_STENCIL_TEST) );
@@ -5253,7 +5325,7 @@ namespace bgfx { namespace gl
if (0 != barrier)
{
bool constantsChanged = compute.m_constBegin < compute.m_constEnd;
- rendererUpdateUniforms(this, _render->m_constantBuffer, compute.m_constBegin, compute.m_constEnd);
+ rendererUpdateUniforms(this, _render->m_uniformBuffer, compute.m_constBegin, compute.m_constEnd);
if (constantsChanged
&& NULL != program.m_constantBuffer)
@@ -5609,7 +5681,7 @@ namespace bgfx { namespace gl
bool programChanged = false;
bool constantsChanged = draw.m_constBegin < draw.m_constEnd;
bool bindAttribs = false;
- rendererUpdateUniforms(this, _render->m_constantBuffer, draw.m_constBegin, draw.m_constEnd);
+ rendererUpdateUniforms(this, _render->m_uniformBuffer, draw.m_constBegin, draw.m_constEnd);
if (key.m_program != programIdx)
{
@@ -5649,7 +5721,7 @@ namespace bgfx { namespace gl
if (invalidHandle != bind.m_idx)
{
TextureGL& texture = m_textures[bind.m_idx];
- texture.commit(stage, bind.m_un.m_draw.m_flags);
+ texture.commit(stage, bind.m_un.m_draw.m_flags, _render->m_colorPalette);
}
}
@@ -6072,7 +6144,7 @@ namespace bgfx { namespace gl
}
tvm.printf(10, pos++, 0x8e, " Indices: %7d ", statsNumIndices);
- tvm.printf(10, pos++, 0x8e, " Uniform size: %7d ", _render->m_constEnd);
+ tvm.printf(10, pos++, 0x8e, " Uniform size: %7d, Max: %7d ", _render->m_uniformEnd, _render->m_uniformMax);
tvm.printf(10, pos++, 0x8e, " DVB size: %7d ", _render->m_vboffset);
tvm.printf(10, pos++, 0x8e, " DIB size: %7d ", _render->m_iboffset);