Просмотр исходного кода

Delay VertexDecl release until VertexBuffer is released.

bkaradzic 12 лет назад
Родитель
Сommit
557c175e61
2 измененных файлов с 19 добавлено и 9 удалено
  1. 2 0
      src/bgfx.cpp
  2. 17 9
      src/bgfx_p.h

+ 2 - 0
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();
 

+ 17 - 9
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)