Fixed crash during initialization when platform data is not set correctly.

This commit is contained in:
Branimir Karadžić
2016-07-06 20:04:07 -07:00
parent 801f8ebc29
commit 1bd97b0d3d

View File

@@ -383,28 +383,38 @@ namespace bgfx
void fatal(Fatal::Enum _code, const char* _format, ...)
{
char temp[8192];
va_list argList;
va_start(argList, _format);
char* out = temp;
int32_t len = bx::vsnprintf(out, sizeof(temp), _format, argList);
if ( (int32_t)sizeof(temp) < len)
{
out = (char*)alloca(len+1);
len = bx::vsnprintf(out, len, _format, argList);
}
out[len] = '\0';
va_end(argList);
g_callback->fatal(_code, out);
if (BX_UNLIKELY(NULL == g_callback) )
{
dbgPrintfVargs(_format, argList);
abort();
}
else
{
char temp[8192];
char* out = temp;
int32_t len = bx::vsnprintf(out, sizeof(temp), _format, argList);
if ( (int32_t)sizeof(temp) < len)
{
out = (char*)alloca(len+1);
len = bx::vsnprintf(out, len, _format, argList);
}
out[len] = '\0';
g_callback->fatal(_code, out);
}
va_end(argList);
}
void trace(const char* _filePath, uint16_t _line, const char* _format, ...)
{
va_list argList;
va_start(argList, _format);
if (NULL == g_callback)
if (BX_UNLIKELY(NULL == g_callback) )
{
dbgPrintfVargs(_format, argList);
}
@@ -412,6 +422,7 @@ namespace bgfx
{
g_callback->traceVargs(_filePath, _line, _format, argList);
}
va_end(argList);
}
@@ -2393,27 +2404,20 @@ namespace bgfx
{
if (NULL != s_ctx)
{
BX_CHECK(false, "bgfx is already initialized.");
BX_TRACE("bgfx is already initialized.");
return false;
}
if (!BX_ENABLED(BX_PLATFORM_EMSCRIPTEN || BX_PLATFORM_NACL)
&& NULL == g_platformData.ndt
&& NULL == g_platformData.nwh
&& NULL == g_platformData.context
&& NULL == g_platformData.backBuffer
&& NULL == g_platformData.backBufferDS)
struct ErrorState
{
BX_CHECK(false, "bgfx platform data like window handle or backbuffer must be set.");
return false;
}
enum Enum
{
Default,
ContextAllocated,
};
};
memset(&g_caps, 0, sizeof(g_caps) );
g_caps.maxViews = BGFX_CONFIG_MAX_VIEWS;
g_caps.maxDrawCalls = BGFX_CONFIG_MAX_DRAW_CALLS;
g_caps.maxFBAttachments = 1;
g_caps.vendorId = _vendorId;
g_caps.deviceId = _deviceId;
ErrorState::Enum errorState = ErrorState::Default;
if (NULL != _allocator)
{
@@ -2436,16 +2440,45 @@ namespace bgfx
s_callbackStub = BX_NEW(g_allocator, CallbackStub);
}
if (!BX_ENABLED(BX_PLATFORM_EMSCRIPTEN || BX_PLATFORM_NACL)
&& NULL == g_platformData.ndt
&& NULL == g_platformData.nwh
&& NULL == g_platformData.context
&& NULL == g_platformData.backBuffer
&& NULL == g_platformData.backBufferDS)
{
BX_TRACE("bgfx platform data like window handle or backbuffer must be set.");
goto error;
}
memset(&g_caps, 0, sizeof(g_caps) );
g_caps.maxViews = BGFX_CONFIG_MAX_VIEWS;
g_caps.maxDrawCalls = BGFX_CONFIG_MAX_DRAW_CALLS;
g_caps.maxFBAttachments = 1;
g_caps.vendorId = _vendorId;
g_caps.deviceId = _deviceId;
BX_TRACE("Init...");
s_ctx = BX_ALIGNED_NEW(g_allocator, Context, 16);
if (!s_ctx->init(_type) )
{
BX_TRACE("Init failed.");
errorState = ErrorState::ContextAllocated;
s_ctx = BX_ALIGNED_NEW(g_allocator, Context, 16);
if (s_ctx->init(_type) )
{
BX_TRACE("Init complete.");
return true;
}
error:
BX_TRACE("Init failed.");
switch (errorState)
{
case ErrorState::ContextAllocated:
BX_ALIGNED_DELETE(g_allocator, s_ctx, 16);
s_ctx = NULL;
case ErrorState::Default:
if (NULL != s_callbackStub)
{
BX_DELETE(g_allocator, s_callbackStub);
@@ -2462,11 +2495,10 @@ namespace bgfx
s_threadIndex = 0;
g_callback = NULL;
g_allocator = NULL;
return false;
break;
}
BX_TRACE("Init complete.");
return true;
return false;
}
void shutdown()