diff options
Diffstat (limited to '3rdparty/bgfx/src/bgfx.cpp')
-rw-r--r-- | 3rdparty/bgfx/src/bgfx.cpp | 178 |
1 files changed, 79 insertions, 99 deletions
diff --git a/3rdparty/bgfx/src/bgfx.cpp b/3rdparty/bgfx/src/bgfx.cpp index 0e9a558903c..3a839c82815 100644 --- a/3rdparty/bgfx/src/bgfx.cpp +++ b/3rdparty/bgfx/src/bgfx.cpp @@ -348,7 +348,6 @@ namespace bgfx bx::write(&writer, magic); TextureCreate tc; - tc.m_flags = _flags; tc.m_width = _width; tc.m_height = _height; tc.m_sides = 0; @@ -1085,6 +1084,8 @@ namespace bgfx CAPS_FLAGS(BGFX_CAPS_TEXTURE_BLIT), CAPS_FLAGS(BGFX_CAPS_TEXTURE_READ_BACK), CAPS_FLAGS(BGFX_CAPS_OCCLUSION_QUERY), + CAPS_FLAGS(BGFX_CAPS_ALPHA_TO_COVERAGE), + CAPS_FLAGS(BGFX_CAPS_CONSERVATIVE_RASTER), #undef CAPS_FLAGS }; @@ -1350,6 +1351,12 @@ namespace bgfx m_dynVertexBufferAllocator.compact(); m_dynIndexBufferAllocator.compact(); + BX_CHECK(m_vertexDeclHandle.getNumHandles() == uint16_t(m_declRef.m_vertexDeclMap.size() ) + , "VertexDeclRef mismatch, num handles %d, handles in hash map %d." + , m_vertexDeclHandle.getNumHandles() + , m_declRef.m_vertexDeclMap.size() + ); + m_declRef.shutdown(m_vertexDeclHandle); #if BGFX_CONFIG_MULTITHREADED @@ -1755,122 +1762,83 @@ namespace bgfx #endif // BX_PLATFORM_WINDOWS } + static int32_t compareDescending(const void* _lhs, const void* _rhs) + { + return *(const int32_t*)_rhs - *(const int32_t*)_lhs; + } + RendererContextI* rendererCreate(RendererType::Enum _type) { - RendererType::Enum last = RendererType::Count; + int32_t scores[RendererType::Count]; + uint32_t numScores = 0; - if (RendererType::Count == _type) + for (uint32_t ii = 0; ii < RendererType::Count; ++ii) { -again: - if (BX_ENABLED(BX_PLATFORM_WINDOWS) ) + RendererType::Enum renderer = RendererType::Enum(ii); + if (s_rendererCreator[ii].supported) { - RendererType::Enum first = RendererType::Direct3D9; - RendererType::Enum second = RendererType::Direct3D11; - - if (windowsVersionIs(Condition::GreaterEqual, 0x0602) ) + int32_t score = 0; + if (_type == renderer) { - first = RendererType::Direct3D11; - second = RendererType::Direct3D12; - if (!s_rendererCreator[second].supported) - { - second = RendererType::Direct3D9; - } - } - else if (windowsVersionIs(Condition::GreaterEqual, 0x0601) ) - { - first = RendererType::Direct3D11; - second = RendererType::Direct3D9; + score += 1000; } - if (s_rendererCreator[first].supported) - { - _type = first; - } - else if (s_rendererCreator[second].supported) - { - _type = second; - } - else if (s_rendererCreator[RendererType::OpenGL].supported) - { - _type = RendererType::OpenGL; - } - else if (s_rendererCreator[RendererType::OpenGLES].supported) - { - _type = RendererType::OpenGLES; - } - else if (s_rendererCreator[RendererType::Direct3D12].supported) - { - _type = RendererType::Direct3D12; - } - else if (s_rendererCreator[RendererType::Vulkan].supported) - { - _type = RendererType::Vulkan; - } - else - { - _type = RendererType::Null; - } - } - else if (BX_ENABLED(BX_PLATFORM_IOS) ) - { - if (s_rendererCreator[RendererType::Metal].supported) - { - _type = RendererType::Metal; - } - else if (s_rendererCreator[RendererType::OpenGLES].supported) - { - _type = RendererType::OpenGLES; - } - } - else if (BX_ENABLED(0 - || BX_PLATFORM_ANDROID - || BX_PLATFORM_EMSCRIPTEN - || BX_PLATFORM_NACL - || BX_PLATFORM_RPI - ) ) - { - _type = RendererType::OpenGLES; - } - else if (BX_ENABLED(BX_PLATFORM_XBOXONE || BX_PLATFORM_WINRT) ) - { - _type = RendererType::Direct3D11; - } - else - { -#if 0 - if (s_rendererCreator[RendererType::Metal].supported) + score += RendererType::Null != renderer ? 1 : 0; + + if (BX_ENABLED(BX_PLATFORM_WINDOWS) ) { - _type = RendererType::Metal; + if (windowsVersionIs(Condition::GreaterEqual, 0x0602) ) + { + score += RendererType::Direct3D11 == renderer ? 20 : 0; + score += RendererType::Direct3D12 == renderer ? 10 : 0; + } + else if (windowsVersionIs(Condition::GreaterEqual, 0x0601) ) + { + score += RendererType::Direct3D11 == renderer ? 20 : 0; + score += RendererType::Direct3D9 == renderer ? 10 : 0; + score += RendererType::Direct3D12 == renderer ? -100 : 0; + } + else + { + score += RendererType::Direct3D12 == renderer ? -100 : 0; + } } - else -#endif // 0 - if (s_rendererCreator[RendererType::OpenGL].supported) + else if (BX_ENABLED(0 + || BX_PLATFORM_ANDROID + || BX_PLATFORM_EMSCRIPTEN + || BX_PLATFORM_IOS + || BX_PLATFORM_NACL + || BX_PLATFORM_RPI + ) ) { - _type = RendererType::OpenGL; + score += RendererType::OpenGLES == renderer ? 20 : 0; } - else if (s_rendererCreator[RendererType::OpenGLES].supported) + else if (BX_ENABLED(0 + || BX_PLATFORM_XBOXONE + || BX_PLATFORM_WINRT + ) ) { - _type = RendererType::OpenGLES; + score += RendererType::Direct3D11 == renderer ? 20 : 0; } - } - if (!s_rendererCreator[_type].supported) - { - _type = RendererType::Null; + scores[numScores++] = (score<<8) | uint8_t(renderer); } } - RendererContextI* renderCtx = s_rendererCreator[_type].createFn(); - if (last != _type) + qsort(scores, numScores, sizeof(int32_t), compareDescending); + + RendererContextI* renderCtx = NULL; + for (uint32_t ii = 0; ii < numScores; ++ii) { - if (NULL == renderCtx) + RendererType::Enum renderer = RendererType::Enum(scores[ii] & 0xff); + renderCtx = s_rendererCreator[renderer].createFn(); + if (NULL != renderCtx) { - s_rendererCreator[_type].supported = false; - last = _type; - goto again; + s_rendererDestroyFn = s_rendererCreator[renderer].destroyFn; + break; } - s_rendererDestroyFn = s_rendererCreator[_type].destroyFn; + s_rendererCreator[renderer].supported = false; } return renderCtx; @@ -2413,7 +2381,22 @@ again: bool init(RendererType::Enum _type, uint16_t _vendorId, uint16_t _deviceId, CallbackI* _callback, bx::AllocatorI* _allocator) { - BX_CHECK(NULL == s_ctx, "bgfx is already initialized."); + if (NULL != s_ctx) + { + BX_CHECK(false, "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) + { + BX_CHECK(false, "bgfx platform data like window handle or backbuffer must be set."); + return false; + } memset(&g_caps, 0, sizeof(g_caps) ); g_caps.maxViews = BGFX_CONFIG_MAX_VIEWS; @@ -2952,7 +2935,6 @@ again: bx::write(&writer, magic); TextureCreate tc; - tc.m_flags = _flags; tc.m_width = _width; tc.m_height = _height; tc.m_sides = 0; @@ -3009,7 +2991,6 @@ again: bx::write(&writer, magic); TextureCreate tc; - tc.m_flags = _flags; tc.m_width = _width; tc.m_height = _height; tc.m_sides = 0; @@ -3053,7 +3034,6 @@ again: bx::write(&writer, magic); TextureCreate tc; - tc.m_flags = _flags; tc.m_width = _size; tc.m_height = _size; tc.m_sides = 6; |