diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 8898eaa1..371e4ffd 100755 --- a/src/bgfx.cpp +++ b/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(); diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 5187f927..79d38767 100755 --- a/src/bgfx_p.h +++ b/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; }