diff --git a/src/bgfx.cpp b/src/bgfx.cpp index cdb1e873e..5546dc1d0 100755 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -807,6 +807,8 @@ namespace bgfx destroyTransientIndexBuffer(m_submit->m_transientIb); frame(); + frame(); // If any VertexDecls needs to be destroyed. + getCommandBuffer(CommandBuffer::RendererShutdownEnd); frame(); diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 09958eb42..37ea288b4 100755 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -1404,12 +1404,15 @@ namespace bgfx VertexDeclHandle release(VertexBufferHandle _handle) { VertexDeclHandle declHandle = m_vertexBufferRef[_handle.idx]; - m_vertexDeclRef[declHandle.idx]--; - - if (0 != m_vertexDeclRef[declHandle.idx]) + if (isValid(declHandle) ) { - VertexDeclHandle invalid = BGFX_INVALID_HANDLE; - return invalid; + m_vertexDeclRef[declHandle.idx]--; + + if (0 != m_vertexDeclRef[declHandle.idx]) + { + VertexDeclHandle invalid = BGFX_INVALID_HANDLE; + return invalid; + } } return declHandle; @@ -1665,6 +1668,13 @@ namespace bgfx } void destroyVertexBuffer(VertexBufferHandle _handle) + { + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexBuffer); + cmdbuf.write(_handle); + m_submit->free(_handle); + } + + void destroyVertexBufferInternal(VertexBufferHandle _handle) { VertexDeclHandle declHandle = m_declRef.release(_handle); if (isValid(declHandle) ) @@ -1673,9 +1683,7 @@ namespace bgfx cmdbuf.write(declHandle); } - CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexBuffer); - cmdbuf.write(_handle); - m_submit->free(_handle); + m_vertexBufferHandle.free(_handle.idx); } DynamicIndexBufferHandle createDynamicIndexBuffer(uint16_t _num) @@ -2450,7 +2458,7 @@ namespace bgfx for (uint16_t ii = 0, num = _frame->m_numFreeVertexBufferHandles; ii < num; ++ii) { - m_vertexBufferHandle.free(_frame->m_freeVertexBufferHandle[ii].idx); + destroyVertexBufferInternal(_frame->m_freeVertexBufferHandle[ii]); } for (uint16_t ii = 0, num = _frame->m_numFreeVertexShaderHandles; ii < num; ++ii)