mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
Fixed dynamic buffer leak. Issue #2867.
This commit is contained in:
66
src/bgfx_p.h
66
src/bgfx_p.h
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user