Last active
June 22, 2016 13:03
-
-
Save attilaz/7cf6ad8d075cb406cc07aeb6f6bd058b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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