Skip to content

Instantly share code, notes, and snippets.

@attilaz
Last active June 22, 2016 13:03
Show Gist options
  • Save attilaz/7cf6ad8d075cb406cc07aeb6f6bd058b to your computer and use it in GitHub Desktop.
Save attilaz/7cf6ad8d075cb406cc07aeb6f6bd058b to your computer and use it in GitHub Desktop.
Index: renderer_gl.cpp
===================================================================
--- renderer_gl.cpp (revision 972)
+++ renderer_gl.cpp (revision 973)
@@ -2756,6 +2756,16 @@
, name
, glGetAttribLocation(m_id, name)
);
+
+ bool found = false;
+ for (int32_t jj = 0; jj < Attrib::Count; ++jj)
+ if ( !strcmp(s_attribName[jj], name) )
+ {
+ found = true;
+ break;
+ }
+
+ BX_CHECK(found, "Invalid attrib name:%s", name);
}
m_numPredefined = 0;
------------------------------------------------------------------------------------------------------
Index: renderer_gl.cpp
===================================================================
--- renderer_gl.cpp (revision 1085)
+++ renderer_gl.cpp (revision 1086)
@@ -4886,7 +4886,6 @@
bool viewHasScissor = false;
Rect viewScissorRect;
viewScissorRect.clear();
- uint16_t discardFlags = BGFX_CLEAR_NONE;
const bool blendIndependentSupported = s_extension[Extension::ARB_draw_buffers_blend].m_supported;
const bool computeSupported = (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) && s_extension[Extension::ARB_compute_shader].m_supported)
@@ -4943,6 +4942,8 @@
? _render->m_hmd.height
: _render->m_resolution.m_height
;
+
+ uint16_t discardFlags = _render->m_clear[view].m_flags & BGFX_CLEAR_DISCARD_MASK;
height = setFrameBuffer(fbh, height, discardFlags);
}
@@ -5007,7 +5008,6 @@
) );
Clear& clear = _render->m_clear[view];
- discardFlags = clear.m_flags & BGFX_CLEAR_DISCARD_MASK;
if (BGFX_CLEAR_NONE != (clear.m_flags & BGFX_CLEAR_MASK) )
{
------------------------------------------------------------------------------------------------------
Index: bgfx.cpp
===================================================================
--- bgfx.cpp (revision 1232)
+++ bgfx.cpp (revision 1233)
@@ -659,6 +659,7 @@
}
if (BGFX_CONFIG_MAX_DRAW_CALLS-1 <= m_num
+ || m_matrixCache.m_num == BGFX_CONFIG_MAX_MATRIX_CACHE
|| (0 == m_draw.m_numVertices && 0 == m_draw.m_numIndices) )
{
++m_numDropped;
------------------------------------------------------------------------------------------------------
Index: bgfx_p.h
===================================================================
--- bgfx_p.h (revision 1308)
+++ bgfx_p.h (revision 1309)
@@ -1284,8 +1284,9 @@
void setState(uint64_t _state, uint32_t _rgba)
{
uint8_t blend = ( (_state&BGFX_STATE_BLEND_MASK)>>BGFX_STATE_BLEND_SHIFT)&0xff;
+ uint8_t alphaRef = ( (_state&BGFX_STATE_ALPHA_REF_MASK)>>BGFX_STATE_ALPHA_REF_SHIFT)&0xff;
// transparency sort order table
- m_key.m_trans = "\x0\x1\x1\x2\x2\x1\x2\x1\x2\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1"[( (blend)&0xf) + (!!blend)];
+ m_key.m_trans = "\x0\x2\x2\x3\x3\x2\x3\x2\x3\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2"[( (blend)&0xf) + (!!blend)] + !!alphaRef;
m_draw.m_flags = _state;
m_draw.m_rgba = _rgba;
}
------------------------------------------------------------------------------------------------------
Index: renderer_gl.cpp
===================================================================
--- renderer_gl.cpp (revision 1386)
+++ renderer_gl.cpp (revision 1387)
@@ -15,6 +15,8 @@
{
static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
+ static int s_prevAttributeArrayMask = 0;
+
struct PrimInfo
{
GLenum m_type;
@@ -3298,6 +3306,7 @@
BX_TRACE("attr %s: %d", s_attribName[ii], loc);
m_attributes[ii] = loc;
m_used[used++] = ii;
+ m_attributeArrayMask = 1 << loc;
}
}
m_used[used] = Attrib::Count;
@@ -3317,6 +3326,18 @@
void ProgramGL::bindAttributes(const VertexDecl& _vertexDecl, uint32_t _baseVertex) const
{
+ int disableMask = s_prevAttributeArrayMask & (~m_attributeArrayMask);
+ if ( disableMask != 0 )
+ {
+ for(int i=0;disableMask!=0;++i)
+ if ( (disableMask & (1<<i)) != 0 )
+ {
+ glDisableVertexAttribArray(i);
+ disableMask &= ~(1<<i);
+ }
+ }
+ s_prevAttributeArrayMask = m_attributeArrayMask;
+
for (uint32_t ii = 0; Attrib::Count != m_used[ii]; ++ii)
{
Attrib::Enum attr = Attrib::Enum(m_used[ii]);
Index: renderer_gl.h
===================================================================
--- renderer_gl.h (revision 1386)
+++ renderer_gl.h (revision 1387)
@@ -1070,6 +1070,7 @@
GLuint m_id;
+ uint32_t m_attributeArrayMask;
uint8_t m_used[Attrib::Count+1]; // dense
GLint m_attributes[Attrib::Count]; // sparse
GLint m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT];
Index: renderer_gl.cpp
===================================================================
--- renderer_gl.cpp (revision 1387)
+++ renderer_gl.cpp (revision 1388)
@@ -3297,6 +3297,7 @@
}
memset(m_attributes, 0xff, sizeof(m_attributes) );
+ m_attributeArrayMask = 0;
uint32_t used = 0;
for (uint8_t ii = 0; ii < Attrib::Count; ++ii)
{
@@ -3306,7 +3307,7 @@
BX_TRACE("attr %s: %d", s_attribName[ii], loc);
m_attributes[ii] = loc;
m_used[used++] = ii;
- m_attributeArrayMask = 1 << loc;
+ m_attributeArrayMask |= 1 << loc;
}
}
m_used[used] = Attrib::Count;
------------------------------------------------------------------------------------------------------
Index: renderer.h
===================================================================
--- renderer.h (revision 1317)
+++ renderer.h (revision 1318)
@@ -73,12 +73,17 @@
}
template<uint16_t mtxRegs, typename RendererContext, typename Program, typename Draw>
- void setPredefined(RendererContext* _renderer, uint8_t view, uint8_t eye, Program& _program, Frame* _render, const Draw& _draw)
+ void setPredefined(RendererContext* _renderer, uint8_t view, uint8_t eye, Program& _program, Frame* _render, const Draw& _draw, bool viewOrProgramChanged)
{
+#if 0
for (uint32_t ii = 0, num = _program.m_numPredefined; ii < num; ++ii)
+#else
+ for (uint32_t ii = viewOrProgramChanged ? 0 : _program.m_firstPerObjectPredefined, num = _program.m_numPredefined; ii < num; ++ii)
+#endif
{
PredefinedUniform& predefined = _program.m_predefined[ii];
uint8_t flags = predefined.m_type&BGFX_UNIFORM_FRAGMENTBIT;
+
switch (predefined.m_type&(~BGFX_UNIFORM_FRAGMENTBIT) )
{
case PredefinedUniform::ViewRect:
Index: renderer_gl.cpp
===================================================================
--- renderer_gl.cpp (revision 1317)
+++ renderer_gl.cpp (revision 1318)
@@ -2475,9 +2475,9 @@
}
}
- void commit(ConstantBuffer& _constantBuffer)
+ void commit(ConstantBuffer& _constantBuffer, uint32_t offset)
{
- _constantBuffer.reset();
+ _constantBuffer.reset(offset);
for (;;)
{
@@ -3079,143 +3079,162 @@
const bool piqSupported = s_extension[Extension::ARB_program_interface_query].m_supported;
BX_TRACE("Uniforms (%d):", activeUniforms);
- for (int32_t ii = 0; ii < activeUniforms; ++ii)
+ for(int32_t freqType = 0; freqType < 2; ++freqType)
{
- struct VariableInfo
+ for (int32_t ii = 0; ii < activeUniforms; ++ii)
{
- GLenum type;
- GLint loc;
- GLint num;
- };
- VariableInfo vi;
- GLenum props[] ={ GL_TYPE, GL_LOCATION, GL_ARRAY_SIZE };
+ struct VariableInfo
+ {
+ GLenum type;
+ GLint loc;
+ GLint num;
+ };
+ VariableInfo vi;
+ GLenum props[] ={ GL_TYPE, GL_LOCATION, GL_ARRAY_SIZE };
- GLenum gltype;
- GLint num;
- GLint loc;
+ GLenum gltype;
+ GLint num;
+ GLint loc;
- if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 31)
- || piqSupported)
- {
- GL_CHECK(glGetProgramResourceiv(m_id
- , GL_UNIFORM
- , ii
- , BX_COUNTOF(props)
- , props
- , BX_COUNTOF(props)
- , NULL
- , (GLint*)&vi
- ) );
+ if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 31)
+ || piqSupported)
+ {
+ GL_CHECK(glGetProgramResourceiv(m_id
+ , GL_UNIFORM
+ , ii
+ , BX_COUNTOF(props)
+ , props
+ , BX_COUNTOF(props)
+ , NULL
+ , (GLint*)&vi
+ ) );
- GL_CHECK(glGetProgramResourceName(m_id
- , GL_UNIFORM
- , ii
- , maxLength + 1
- , NULL
- , name
- ) );
+ GL_CHECK(glGetProgramResourceName(m_id
+ , GL_UNIFORM
+ , ii
+ , maxLength + 1
+ , NULL
+ , name
+ ) );
- gltype = vi.type;
- loc = vi.loc;
- num = vi.num;
- }
- else
- {
- GL_CHECK(glGetActiveUniform(m_id, ii, maxLength + 1, NULL, &num, &gltype, name) );
- loc = glGetUniformLocation(m_id, name);
- }
+ gltype = vi.type;
+ loc = vi.loc;
+ num = vi.num;
+ }
+ else
+ {
+ GL_CHECK(glGetActiveUniform(m_id, ii, maxLength + 1, NULL, &num, &gltype, name) );
+ loc = glGetUniformLocation(m_id, name);
+ }
- num = bx::uint32_max(num, 1);
+ num = bx::uint32_max(num, 1);
- int offset = 0;
- char* array = strchr(name, '[');
- if (NULL != array)
- {
- BX_TRACE("--- %s", name);
- *array = '\0';
- array++;
- char* end = strchr(array, ']');
- if (NULL != end)
- { // Some devices (Amazon Fire) might not return terminating brace.
- *end = '\0';
- offset = atoi(array);
+ int offset = 0;
+ char* array = strchr(name, '[');
+ if (NULL != array)
+ {
+ BX_TRACE("--- %s", name);
+ *array = '\0';
+ array++;
+ char* end = strchr(array, ']');
+ if (NULL != end)
+ { // Some devices (Amazon Fire) might not return terminating brace.
+ *end = '\0';
+ offset = atoi(array);
+ }
}
- }
- switch (gltype)
- {
- case GL_SAMPLER_2D:
- case GL_INT_SAMPLER_2D:
- case GL_UNSIGNED_INT_SAMPLER_2D:
+ switch (gltype)
+ {
+ case GL_SAMPLER_2D:
+ case GL_INT_SAMPLER_2D:
+ case GL_UNSIGNED_INT_SAMPLER_2D:
- case GL_SAMPLER_3D:
- case GL_INT_SAMPLER_3D:
- case GL_UNSIGNED_INT_SAMPLER_3D:
+ case GL_SAMPLER_3D:
+ case GL_INT_SAMPLER_3D:
+ case GL_UNSIGNED_INT_SAMPLER_3D:
- case GL_SAMPLER_CUBE:
- case GL_INT_SAMPLER_CUBE:
- case GL_UNSIGNED_INT_SAMPLER_CUBE:
+ case GL_SAMPLER_CUBE:
+ case GL_INT_SAMPLER_CUBE:
+ case GL_UNSIGNED_INT_SAMPLER_CUBE:
- case GL_SAMPLER_2D_SHADOW:
+ case GL_SAMPLER_2D_SHADOW:
- case GL_IMAGE_1D:
- case GL_INT_IMAGE_1D:
- case GL_UNSIGNED_INT_IMAGE_1D:
+ case GL_IMAGE_1D:
+ case GL_INT_IMAGE_1D:
+ case GL_UNSIGNED_INT_IMAGE_1D:
- case GL_IMAGE_2D:
- case GL_INT_IMAGE_2D:
- case GL_UNSIGNED_INT_IMAGE_2D:
+ case GL_IMAGE_2D:
+ case GL_INT_IMAGE_2D:
+ case GL_UNSIGNED_INT_IMAGE_2D:
- case GL_IMAGE_3D:
- case GL_INT_IMAGE_3D:
- case GL_UNSIGNED_INT_IMAGE_3D:
+ case GL_IMAGE_3D:
+ case GL_INT_IMAGE_3D:
+ case GL_UNSIGNED_INT_IMAGE_3D:
- case GL_IMAGE_CUBE:
- case GL_INT_IMAGE_CUBE:
- case GL_UNSIGNED_INT_IMAGE_CUBE:
- BX_TRACE("Sampler #%d at location %d.", m_numSamplers, loc);
- m_sampler[m_numSamplers] = loc;
- m_numSamplers++;
- break;
+ case GL_IMAGE_CUBE:
+ case GL_INT_IMAGE_CUBE:
+ case GL_UNSIGNED_INT_IMAGE_CUBE:
+ BX_TRACE("Sampler #%d at location %d.", m_numSamplers, loc);
+ m_sampler[m_numSamplers] = loc;
+ m_numSamplers++;
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
- PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name);
- if (PredefinedUniform::Count != predefined)
- {
- m_predefined[m_numPredefined].m_loc = loc;
- m_predefined[m_numPredefined].m_count = uint16_t(num);
- m_predefined[m_numPredefined].m_type = uint8_t(predefined);
- m_numPredefined++;
- }
- else
- {
- const UniformInfo* info = s_renderGL->m_uniformReg.find(name);
- if (NULL != info)
+ PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name);
+ if (PredefinedUniform::Count != predefined)
{
- if (NULL == m_constantBuffer)
+ if ( (freqType == 0 && predefined > PredefinedUniform::InvViewProj) ||
+ (freqType == 1 && predefined <= PredefinedUniform::InvViewProj) )
+ continue;
+
+ m_predefined[m_numPredefined].m_loc = loc;
+ m_predefined[m_numPredefined].m_count = uint16_t(num);
+ m_predefined[m_numPredefined].m_type = uint8_t(predefined);
+ m_numPredefined++;
+ }
+ else
+ {
+ bool viewUniform = (name[0] == 'u' && name[1] == 'v' && name[2] == 'i' && name[3] == 'e' &&
+ name[4] == 'w' && name[5] == '_' );
+
+ if ( (freqType == 0 && !viewUniform) || (freqType == 1 && viewUniform) )
+ continue;
+
+ const UniformInfo* info = s_renderGL->m_uniformReg.find(name);
+ if (NULL != info)
{
- m_constantBuffer = ConstantBuffer::create(1024);
+ if (NULL == m_constantBuffer)
+ {
+ m_constantBuffer = ConstantBuffer::create(1024);
+ }
+
+ UniformType::Enum type = convertGlType(gltype);
+ m_constantBuffer->writeUniformHandle(type, 0, info->m_handle, uint16_t(num) );
+ m_constantBuffer->write(loc);
+ BX_TRACE("store %s %d", name, info->m_handle);
}
+ }
- UniformType::Enum type = convertGlType(gltype);
- m_constantBuffer->writeUniformHandle(type, 0, info->m_handle, uint16_t(num) );
- m_constantBuffer->write(loc);
- BX_TRACE("store %s %d", name, info->m_handle);
- }
+ BX_TRACE("\tuniform %s %s%s is at location %d, size %d, offset %d"
+ , glslTypeName(gltype)
+ , name
+ , PredefinedUniform::Count != predefined ? "*" : ""
+ , loc
+ , num
+ , offset
+ );
+ BX_UNUSED(offset);
}
- BX_TRACE("\tuniform %s %s%s is at location %d, size %d, offset %d"
- , glslTypeName(gltype)
- , name
- , PredefinedUniform::Count != predefined ? "*" : ""
- , loc
- , num
- , offset
- );
- BX_UNUSED(offset);
+ if ( freqType == 0)
+ {
+ m_constantBufferOffsetFirstPerObject = (NULL == m_constantBuffer) ? 0 : m_constantBuffer->getPos();
+ m_firstPerObjectPredefined = m_numPredefined;
+ }
}
if (NULL != m_constantBuffer)
@@ -4944,10 +4963,10 @@
if (constantsChanged
&& NULL != program.m_constantBuffer)
{
- commit(*program.m_constantBuffer);
+ commit(*program.m_constantBuffer, true);
}
- viewState.setPredefined<1>(this, view, eye, program, _render, compute);
+ viewState.setPredefined<1>(this, view, eye, program, _render, compute, true);
if (isValid(compute.m_indirectBuffer) )
{
@@ -5318,10 +5337,14 @@
if (constantsChanged
&& NULL != program.m_constantBuffer)
{
+ commit(*program.m_constantBuffer, (programChanged||viewChanged) ? 0 : program.m_constantBufferOffsetFirstPerObject);
}
- viewState.setPredefined<1>(this, view, eye, program, _render, draw);
+ viewState.setPredefined<1>(this, view, eye, program, _render, draw, programChanged||viewChanged);
{
for (uint32_t stage = 0; stage < BGFX_CONFIG_MAX_TEXTURE_SAMPLERS; ++stage)
Index: renderer_gl.h
===================================================================
--- renderer_gl.h (revision 1317)
+++ renderer_gl.h (revision 1318)
@@ -1042,7 +1042,9 @@
ProgramGL()
: m_id(0)
, m_constantBuffer(NULL)
+ , m_constantBufferOffsetFirstPerObject(0)
, m_numPredefined(0)
+ , m_firstPerObjectPredefined(0)
{
}
@@ -1067,8 +1069,10 @@
uint8_t m_numSamplers;
ConstantBuffer* m_constantBuffer;
+ uint32_t m_constantBufferOffsetFirstPerObject;
PredefinedUniform m_predefined[PredefinedUniform::Count];
uint8_t m_numPredefined;
+ uint8_t m_firstPerObjectPredefined;
VaoCacheRef m_vcref;
};
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment