diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 4e48dd10..60a64d73 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -752,15 +752,9 @@ namespace bgfx #endif // BX_PLATFORM_ #if BGFX_CONFIG_MULTITHREADED - m_renderThread = 0; - if (_createRenderThread) { -# if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360 - m_renderThread = CreateThread(NULL, 16<<10, renderThread, NULL, 0, NULL); -# elif BX_PLATFORM_POSIX - pthread_create(&m_renderThread, NULL, renderThread, NULL); -# endif // BX_PLATFORM_ + m_thread.init(); } #else BX_UNUSED(_createRenderThread); @@ -801,15 +795,9 @@ namespace bgfx frame(); #if BGFX_CONFIG_MULTITHREADED - if (0 != m_renderThread) + if (m_thread.isRunning() ) { -# if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360 - WaitForSingleObject(m_renderThread, INFINITE); - m_renderThread = NULL; -# elif BX_PLATFORM_POSIX - pthread_join(m_renderThread, NULL); - m_renderThread = 0; -# endif // BX_PLATFORM_* + m_thread.shutdown(); } #endif // BGFX_CONFIG_MULTITHREADED @@ -817,16 +805,6 @@ namespace bgfx m_render->destroy(); } -#if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360 - DWORD WINAPI renderThread(LPVOID) -#else - void* renderThread(void*) -#endif // BX_PLATFORM_WINDOWS - { - while (!renderFrame() ); - return EXIT_SUCCESS; - } - const Memory* alloc(uint32_t _size) { Memory* mem = (Memory*)g_realloc(NULL, sizeof(Memory) + _size); diff --git a/src/bgfx_p.h b/src/bgfx_p.h index a463df24..15da254c 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -72,8 +72,6 @@ extern HWND g_bgfxHwnd; #elif BX_PLATFORM_XBOX360 # include # include -#elif BX_PLATFORM_POSIX -# include #endif // BX_PLATFORM_* #include "dds.h" @@ -107,11 +105,8 @@ namespace stl = std; #include "config.h" -#if BGFX_CONFIG_MULTITHREADED -# include -#endif // BGFX_CONFIG_MULTITHREADED - #include +#include #include #define BGFX_DRAW_WHOLE_INDEX_BUFFER 0xffffffff @@ -1414,16 +1409,11 @@ namespace bgfx UsedList m_used; }; -#if BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 - DWORD WINAPI renderThread(LPVOID _arg); -#elif BX_PLATFORM_POSIX - void* renderThread(void*); -#endif // BX_PLATFORM_ - struct Context { Context() - : m_render(&m_frame[0]) + : m_thread(renderThread, thisSuppressC4355() ) + , m_render(&m_frame[0]) , m_submit(&m_frame[1]) , m_dynamicIndexBufferHandle(BGFX_CONFIG_MAX_DYNAMIC_INDEX_BUFFERS) , m_dynamicVertexBufferHandle(BGFX_CONFIG_MAX_DYNAMIC_VERTEX_BUFFERS) @@ -1447,6 +1437,18 @@ namespace bgfx { } + Context* thisSuppressC4355() + { + return this; + } + + static int32_t renderThread(void* _userData) + { + Context* ctx = (Context*)_userData; + while (!ctx->renderFrame() ); + return EXIT_SUCCESS; + } + // game thread void init(bool _createRenderThread); void shutdown(); @@ -2736,13 +2738,6 @@ namespace bgfx Semaphore m_renderSem; Semaphore m_gameSem; - -# if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360 - HANDLE m_renderThread; -# else - pthread_t m_renderThread; -# endif // BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360 - #else void gameSemPost() { @@ -2761,6 +2756,7 @@ namespace bgfx } #endif // BGFX_CONFIG_MULTITHREADED + Thread m_thread; Frame m_frame[2]; Frame* m_render; Frame* m_submit;