summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/bgfx.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/bgfx.cpp')
-rw-r--r--3rdparty/bgfx/src/bgfx.cpp178
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;