|
|
@@ -1300,6 +1300,9 @@ namespace bgfx
|
|
|
extern RendererContextI* rendererCreateD3D11();
|
|
|
extern void rendererDestroyD3D11();
|
|
|
|
|
|
+ extern RendererContextI* rendererCreateD3D12();
|
|
|
+ extern void rendererDestroyD3D12();
|
|
|
+
|
|
|
struct RendererCreator
|
|
|
{
|
|
|
RendererCreateFn createFn;
|
|
|
@@ -1308,35 +1311,37 @@ namespace bgfx
|
|
|
bool supported;
|
|
|
};
|
|
|
|
|
|
- static const RendererCreator s_rendererCreator[RendererType::Count] =
|
|
|
+ static const RendererCreator s_rendererCreator[] =
|
|
|
{
|
|
|
{ rendererCreateNULL, rendererDestroyNULL, BGFX_RENDERER_NULL_NAME, !!BGFX_CONFIG_RENDERER_NULL }, // Null
|
|
|
{ rendererCreateD3D9, rendererDestroyD3D9, BGFX_RENDERER_DIRECT3D9_NAME, !!BGFX_CONFIG_RENDERER_DIRECT3D9 }, // Direct3D9
|
|
|
{ rendererCreateD3D11, rendererDestroyD3D11, BGFX_RENDERER_DIRECT3D11_NAME, !!BGFX_CONFIG_RENDERER_DIRECT3D11 }, // Direct3D11
|
|
|
+ { rendererCreateD3D12, rendererDestroyD3D12, BGFX_RENDERER_DIRECT3D12_NAME, !!BGFX_CONFIG_RENDERER_DIRECT3D12 }, // Direct3D12
|
|
|
{ rendererCreateGL, rendererDestroyGL, BGFX_RENDERER_OPENGL_NAME, !!BGFX_CONFIG_RENDERER_OPENGLES }, // OpenGLES
|
|
|
{ rendererCreateGL, rendererDestroyGL, BGFX_RENDERER_OPENGL_NAME, !!BGFX_CONFIG_RENDERER_OPENGL }, // OpenGL
|
|
|
};
|
|
|
+ BX_STATIC_ASSERT(BX_COUNTOF(s_rendererCreator) == RendererType::Count);
|
|
|
+
|
|
|
+ static RendererDestroyFn s_rendererDestroyFn;
|
|
|
|
|
|
- uint32_t getWindowsVersion()
|
|
|
+ bool windowsVersionIsOrAbove(uint32_t _winver)
|
|
|
{
|
|
|
#if BX_PLATFORM_WINDOWS
|
|
|
OSVERSIONINFOEXA ovi;
|
|
|
memset(&ovi, 0, sizeof(ovi) );
|
|
|
ovi.dwOSVersionInfoSize = sizeof(ovi);
|
|
|
- if (!GetVersionExA( (LPOSVERSIONINFOA)&ovi) )
|
|
|
- {
|
|
|
- return 0x0501; // _WIN32_WINNT_WINXP
|
|
|
- }
|
|
|
-
|
|
|
- // _WIN32_WINNT_WINBLUE 0x0602
|
|
|
+ // _WIN32_WINNT_WINBLUE 0x0603
|
|
|
// _WIN32_WINNT_WIN8 0x0602
|
|
|
// _WIN32_WINNT_WIN7 0x0601
|
|
|
// _WIN32_WINNT_VISTA 0x0600
|
|
|
- return (ovi.dwMajorVersion<<8)
|
|
|
- | ovi.dwMinorVersion
|
|
|
- ;
|
|
|
+ ovi.dwMajorVersion = HIBYTE(_winver);
|
|
|
+ ovi.dwMinorVersion = LOBYTE(_winver);
|
|
|
+ DWORDLONG cond = 0;
|
|
|
+ VER_SET_CONDITION(cond, VER_MAJORVERSION, VER_GREATER_EQUAL);
|
|
|
+ VER_SET_CONDITION(cond, VER_MINORVERSION, VER_GREATER_EQUAL);
|
|
|
+ return !!VerifyVersionInfoA(&ovi, VER_MAJORVERSION | VER_MINORVERSION, cond);
|
|
|
#else
|
|
|
- return 0;
|
|
|
+ return false;
|
|
|
#endif // BX_PLATFORM_WINDOWS
|
|
|
}
|
|
|
|
|
|
@@ -1349,7 +1354,12 @@ again:
|
|
|
{
|
|
|
RendererType::Enum first = RendererType::Direct3D9;
|
|
|
RendererType::Enum second = RendererType::Direct3D11;
|
|
|
- if (0x601 <= getWindowsVersion() )
|
|
|
+ if (windowsVersionIsOrAbove(0x0603) )
|
|
|
+ {
|
|
|
+ first = RendererType::Direct3D11 /* Direct3D12 */;
|
|
|
+ second = RendererType::Direct3D11;
|
|
|
+ }
|
|
|
+ else if (windowsVersionIsOrAbove(0x0601) )
|
|
|
{
|
|
|
first = RendererType::Direct3D11;
|
|
|
second = RendererType::Direct3D9;
|
|
|
@@ -1400,13 +1410,14 @@ again:
|
|
|
goto again;
|
|
|
}
|
|
|
|
|
|
+ s_rendererDestroyFn = s_rendererCreator[_type].destroyFn;
|
|
|
+
|
|
|
return renderCtx;
|
|
|
}
|
|
|
|
|
|
void rendererDestroy()
|
|
|
{
|
|
|
- const RendererType::Enum type = getRendererType();
|
|
|
- s_rendererCreator[type].destroyFn();
|
|
|
+ s_rendererDestroyFn();
|
|
|
}
|
|
|
|
|
|
void Context::rendererExecCommands(CommandBuffer& _cmdbuf)
|