Procházet zdrojové kódy

Fixed init/shutdown code, so it can be called multiple time from the same app.

bkaradzic před 12 roky
rodič
revize
ed0055caad
2 změnil soubory, kde provedl 36 přidání a 1 odebrání
  1. 14 1
      src/bgfx.cpp
  2. 22 0
      src/bgfx_p.h

+ 14 - 1
src/bgfx.cpp

@@ -681,8 +681,15 @@ namespace bgfx
 
 	void Context::init(bool _createRenderThread)
 	{
+		BX_CHECK(!m_rendererInitialized, "Already initialized?");
 		BX_TRACE("init");
 
+		m_exit = false;
+		m_frames = 0;
+		m_render = &m_frame[0];
+		m_submit = &m_frame[1];
+		m_debug = BGFX_DEBUG_NONE;
+
 		m_submit->create();
 		m_render->create();
 
@@ -707,7 +714,9 @@ namespace bgfx
 			m_rect[ii].m_height = 1;
 		}
 
-		gameSemPost();
+		m_declRef.init();
+
+		frameNoRenderWait();
 
 		getCommandBuffer(CommandBuffer::RendererInit);
 
@@ -742,6 +751,8 @@ namespace bgfx
 		getCommandBuffer(CommandBuffer::RendererShutdownEnd);
 		frame();
 
+		m_declRef.shutdown(m_vertexDeclHandle);
+
 #if BGFX_CONFIG_MULTITHREADED
 		if (m_thread.isRunning() )
 		{
@@ -749,6 +760,8 @@ namespace bgfx
 		}
 #endif // BGFX_CONFIG_MULTITHREADED
 
+		renderSemWait();
+
 		m_submit->destroy();
 		m_render->destroy();
 

+ 22 - 0
src/bgfx_p.h

@@ -945,6 +945,7 @@ namespace bgfx
 		{
 			m_constantBuffer = ConstantBuffer::create(BGFX_CONFIG_MAX_CONSTANT_BUFFER_SIZE);
 			reset();
+			finish();
 			m_textVideoMem = new TextVideoMem;
 		}
 
@@ -1309,11 +1310,25 @@ namespace bgfx
 	struct VertexDeclRef
 	{
 		VertexDeclRef()
+		{
+		}
+
+		void init()
 		{
 			memset(m_vertexDeclRef, 0, sizeof(m_vertexDeclRef) );
 			memset(m_vertexBufferRef, 0xff, sizeof(m_vertexBufferRef) );
 		}
 
+		void shutdown(HandleAlloc& _handleAlloc)
+		{
+			for (VertexDeclMap::iterator it = m_vertexDeclMap.begin(), itEnd = m_vertexDeclMap.end(); it != itEnd; ++it)
+			{
+				_handleAlloc.free(it->second.idx);
+			}
+
+			m_vertexDeclMap.clear();
+		}
+
 		VertexDeclHandle find(uint32_t _hash)
 		{
 			VertexDeclMap::const_iterator it = m_vertexDeclMap.find(_hash);
@@ -1502,7 +1517,11 @@ namespace bgfx
 		{
 			// wait for render thread to finish
 			renderSemWait();
+			frameNoRenderWait();
+		}
 
+		void frameNoRenderWait()
+		{
 			swap();
 
 			// release render thread
@@ -2523,6 +2542,7 @@ namespace bgfx
 				{
 				case CommandBuffer::RendererInit:
 					{
+						BX_CHECK(!m_rendererInitialized, "This shouldn't happen! Bad synchronization?");
 						rendererInit();
 						m_rendererInitialized = true;
 					}
@@ -2530,12 +2550,14 @@ namespace bgfx
 
 				case CommandBuffer::RendererShutdownBegin:
 					{
+						BX_CHECK(m_rendererInitialized, "This shouldn't happen! Bad synchronization?");
 						m_rendererInitialized = false;
 					}
 					break;
 
 				case CommandBuffer::RendererShutdownEnd:
 					{
+						BX_CHECK(!m_rendererInitialized && !m_exit, "This shouldn't happen! Bad synchronization?");
 						rendererShutdown();
 						m_exit = true;
 					}