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

This commit is contained in:
bkaradzic 2013-03-09 14:57:53 -08:00
parent a165353896
commit ed0055caad
2 changed files with 36 additions and 1 deletions

View file

@ -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();

View file

@ -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;
}