Преглед изворни кода

Simplified code for choosing renderer.

Branimir Karadžić пре 9 година
родитељ
комит
ec5cb1b37c
2 измењених фајлова са 57 додато и 97 уклоњено
  1. 55 94
      src/bgfx.cpp
  2. 2 3
      src/renderer_d3d11.cpp

+ 55 - 94
src/bgfx.cpp

@@ -1755,122 +1755,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;
+		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;

+ 2 - 3
src/renderer_d3d11.cpp

@@ -912,7 +912,6 @@ namespace bgfx { namespace d3d11
 					D3D_FEATURE_LEVEL_10_0,
 					D3D_FEATURE_LEVEL_9_3,
 					D3D_FEATURE_LEVEL_9_2,
-					D3D_FEATURE_LEVEL_9_1,
 				};
 
 				for (;;)
@@ -1216,10 +1215,10 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 					| BGFX_CAPS_DRAW_INDIRECT
 					| BGFX_CAPS_TEXTURE_BLIT
 					| BGFX_CAPS_TEXTURE_READ_BACK
-					| BGFX_CAPS_OCCLUSION_QUERY
+					| ( (m_featureLevel >= D3D_FEATURE_LEVEL_9_2) ? BGFX_CAPS_OCCLUSION_QUERY : 0)
 					);
 
-				m_timerQuerySupport = m_featureLevel >= D3D_FEATURE_LEVEL_9_3;
+				m_timerQuerySupport = m_featureLevel >= D3D_FEATURE_LEVEL_10_0;
 
 				if (m_featureLevel <= D3D_FEATURE_LEVEL_9_2)
 				{