Fixed dynamic buffer leak. Issue #2867.

This commit is contained in:
Branimir Karadžić
2022-08-19 09:51:23 -07:00
parent 8abb86801f
commit b35b3fa2a7

View File

@@ -3483,8 +3483,7 @@ namespace bgfx
if (dib.m_size < _mem->size
&& 0 != (dib.m_flags & BGFX_BUFFER_ALLOW_RESIZE) )
{
m_dynIndexBufferAllocator.free(uint64_t(dib.m_handle.idx)<<32 | dib.m_offset);
m_dynIndexBufferAllocator.compact();
destroy(dib);
const uint64_t ptr = (0 != (dib.m_flags & BGFX_BUFFER_COMPUTE_READ) )
? allocIndexBuffer(_mem->size, dib.m_flags)
@@ -3522,27 +3521,30 @@ namespace bgfx
m_freeDynamicIndexBufferHandle[m_numFreeDynamicIndexBufferHandles++] = _handle;
}
void destroyDynamicIndexBufferInternal(DynamicIndexBufferHandle _handle)
void destroy(const DynamicIndexBuffer& _dib)
{
DynamicIndexBuffer& dib = m_dynamicIndexBuffers[_handle.idx];
if (0 != (dib.m_flags & BGFX_BUFFER_COMPUTE_READ_WRITE) )
if (0 != (_dib.m_flags & BGFX_BUFFER_COMPUTE_READ_WRITE))
{
destroyIndexBuffer(dib.m_handle);
destroyIndexBuffer(_dib.m_handle);
}
else
{
m_dynIndexBufferAllocator.free(uint64_t(dib.m_handle.idx)<<32 | dib.m_offset);
if (m_dynIndexBufferAllocator.compact() )
m_dynIndexBufferAllocator.free(uint64_t(_dib.m_handle.idx) << 32 | _dib.m_offset);
if (m_dynIndexBufferAllocator.compact())
{
for (uint64_t ptr = m_dynIndexBufferAllocator.remove(); 0 != ptr; ptr = m_dynIndexBufferAllocator.remove() )
for (uint64_t ptr = m_dynIndexBufferAllocator.remove(); 0 != ptr; ptr = m_dynIndexBufferAllocator.remove())
{
IndexBufferHandle handle = { uint16_t(ptr>>32) };
IndexBufferHandle handle = { uint16_t(ptr >> 32) };
destroyIndexBuffer(handle);
}
}
}
}
void destroyDynamicIndexBufferInternal(DynamicIndexBufferHandle _handle)
{
DynamicIndexBuffer& dib = m_dynamicIndexBuffers[_handle.idx];
destroy(dib);
m_dynamicIndexBufferHandle.free(_handle.idx);
}
@@ -3675,8 +3677,7 @@ namespace bgfx
if (dvb.m_size < _mem->size
&& 0 != (dvb.m_flags & BGFX_BUFFER_ALLOW_RESIZE) )
{
m_dynVertexBufferAllocator.free(uint64_t(dvb.m_handle.idx)<<32 | dvb.m_offset);
m_dynVertexBufferAllocator.compact();
destroy(dvb);
const uint32_t size = bx::strideAlign<16>(_mem->size, dvb.m_stride)+dvb.m_stride;
@@ -3718,6 +3719,26 @@ namespace bgfx
m_freeDynamicVertexBufferHandle[m_numFreeDynamicVertexBufferHandles++] = _handle;
}
void destroy(const DynamicVertexBuffer& _dvb)
{
if (0 != (_dvb.m_flags & BGFX_BUFFER_COMPUTE_READ_WRITE))
{
destroyVertexBuffer(_dvb.m_handle);
}
else
{
m_dynVertexBufferAllocator.free(uint64_t(_dvb.m_handle.idx) << 32 | _dvb.m_offset);
if (m_dynVertexBufferAllocator.compact())
{
for (uint64_t ptr = m_dynVertexBufferAllocator.remove(); 0 != ptr; ptr = m_dynVertexBufferAllocator.remove())
{
VertexBufferHandle handle = { uint16_t(ptr >> 32) };
destroyVertexBuffer(handle);
}
}
}
}
void destroyDynamicVertexBufferInternal(DynamicVertexBufferHandle _handle)
{
VertexLayoutHandle layoutHandle = m_vertexLayoutRef.release(_handle);
@@ -3731,24 +3752,7 @@ namespace bgfx
}
DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[_handle.idx];
if (0 != (dvb.m_flags & BGFX_BUFFER_COMPUTE_READ_WRITE) )
{
destroyVertexBuffer(dvb.m_handle);
}
else
{
m_dynVertexBufferAllocator.free(uint64_t(dvb.m_handle.idx)<<32 | dvb.m_offset);
if (m_dynVertexBufferAllocator.compact() )
{
for (uint64_t ptr = m_dynVertexBufferAllocator.remove(); 0 != ptr; ptr = m_dynVertexBufferAllocator.remove() )
{
VertexBufferHandle handle = { uint16_t(ptr>>32) };
destroyVertexBuffer(handle);
}
}
}
destroy(dvb);
m_dynamicVertexBufferHandle.free(_handle.idx);
}