From 04a62cba1f9b360d451a4791922c666a5ffafde0 Mon Sep 17 00:00:00 2001
From: Ethan Lee <[EMAIL REDACTED]>
Date: Wed, 12 Nov 2025 11:18:52 -0500
Subject: [PATCH] gpu: Set up D3D12 device checks to avoid unnecessary queries
---
src/gpu/d3d12/SDL_gpu_d3d12.c | 57 ++++++++++++++++++++---------------
1 file changed, 33 insertions(+), 24 deletions(-)
diff --git a/src/gpu/d3d12/SDL_gpu_d3d12.c b/src/gpu/d3d12/SDL_gpu_d3d12.c
index ce0edc0b7fce6..2c51f05831d2f 100644
--- a/src/gpu/d3d12/SDL_gpu_d3d12.c
+++ b/src/gpu/d3d12/SDL_gpu_d3d12.c
@@ -8374,6 +8374,7 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
IDXGIFactory6 *factory6;
IDXGIAdapter1 *adapter;
bool supports_64UAVs = false;
+ bool needs_64UAVs = !SDL_GetBooleanProperty(props, SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN, false);
// Early check to see if the app has _any_ D3D12 formats, if not we don't
// have to fuss with loading D3D in the first place.
@@ -8475,23 +8476,29 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
SDL_COMPILE_TIME_ASSERT(featurelevel, D3D_FEATURE_LEVEL_CHOICE < D3D_FEATURE_LEVEL_11_1);
- // Check feature level 11_1 first, guarantees 64+ UAVs unlike 11_0 Tier1
+ /* FIXME: If Windows 11 is running and the app has neither DXIL nor TIER2
+ * requirements, we can skip doing any device checks entirely
+ */
+#if 0
+ if (!needs_64UAVs && !has_dxil && WIN_IsWindows11OrGreater()) {
+ IDXGIAdapter1_Release(adapter);
+ IDXGIFactory1_Release(factory);
+
+ SDL_UnloadObject(d3d12Dll);
+ SDL_UnloadObject(dxgiDll);
+
+ return true;
+ }
+#endif
+
res = pD3D12CreateDevice(
(IUnknown *)adapter,
- D3D_FEATURE_LEVEL_11_1,
+ D3D_FEATURE_LEVEL_CHOICE,
D3D_GUID(D3D_IID_ID3D12Device),
(void **)&device);
-
if (SUCCEEDED(res)) {
- supports_64UAVs = true;
- } else {
- res = pD3D12CreateDevice(
- (IUnknown *)adapter,
- D3D_FEATURE_LEVEL_CHOICE,
- D3D_GUID(D3D_IID_ID3D12Device),
- (void **)&device);
-
- if (SUCCEEDED(res)) {
+ // Only check for Tier 2 resource binding if the app needs it
+ if (needs_64UAVs) {
D3D12_FEATURE_DATA_D3D12_OPTIONS featureOptions;
SDL_zero(featureOptions);
@@ -8504,30 +8511,32 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this, SDL_PropertiesID props)
supports_64UAVs = true;
}
}
- }
- if (SUCCEEDED(res)) {
- D3D12_FEATURE_DATA_SHADER_MODEL shaderModel;
- shaderModel.HighestShaderModel = D3D_SHADER_MODEL_6_0;
+ // Only check for SM6 support if DXIL is provided
+ if (has_dxil) {
+ D3D12_FEATURE_DATA_SHADER_MODEL shaderModel;
+ shaderModel.HighestShaderModel = D3D_SHADER_MODEL_6_0;
- res = ID3D12Device_CheckFeatureSupport(
- device,
- D3D12_FEATURE_SHADER_MODEL,
- &shaderModel,
- sizeof(shaderModel));
- if (SUCCEEDED(res) && shaderModel.HighestShaderModel >= D3D_SHADER_MODEL_6_0) {
- supports_dxil = true;
+ res = ID3D12Device_CheckFeatureSupport(
+ device,
+ D3D12_FEATURE_SHADER_MODEL,
+ &shaderModel,
+ sizeof(shaderModel));
+ if (SUCCEEDED(res) && shaderModel.HighestShaderModel >= D3D_SHADER_MODEL_6_0) {
+ supports_dxil = true;
+ }
}
ID3D12Device_Release(device);
}
+
IDXGIAdapter1_Release(adapter);
IDXGIFactory1_Release(factory);
SDL_UnloadObject(d3d12Dll);
SDL_UnloadObject(dxgiDll);
- if (!supports_64UAVs && !SDL_GetBooleanProperty(props, SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN, false)) {
+ if (!supports_64UAVs && needs_64UAVs) {
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "D3D12: Tier 2 Resource Binding is not supported");
return false;
}