From b35b3fa2a7e0a65c7454de3626d2f8b74c83583d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Fri, 19 Aug 2022 09:51:23 -0700 Subject: [PATCH] Fixed dynamic buffer leak. Issue #2867. --- src/bgfx_p.h | 66 ++++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 46dc3d5e1..1967d9efa 100644 --- a/src/bgfx_p.h +++ b/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); }