Skip to content

Commit 9a8f18b

Browse files
committed
Merge pull request #94796 from kus04e4ek/backfall
Windows: Fall back to D3D12 if Vulkan is not supported and vice versa
2 parents f9474f0 + d30c1e6 commit 9a8f18b

File tree

3 files changed

+42
-4
lines changed

3 files changed

+42
-4
lines changed

doc/classes/ProjectSettings.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2765,6 +2765,14 @@
27652765
<member name="rendering/rendering_device/driver.windows" type="String" setter="" getter="">
27662766
Windows override for [member rendering/rendering_device/driver].
27672767
</member>
2768+
<member name="rendering/rendering_device/fallback_to_d3d12" type="bool" setter="" getter="" default="true">
2769+
If [code]true[/code], the forward renderer will fall back to Direct3D 12 if Vulkan is not supported.
2770+
[b]Note:[/b] This setting is implemented only on Windows.
2771+
</member>
2772+
<member name="rendering/rendering_device/fallback_to_vulkan" type="bool" setter="" getter="" default="true">
2773+
If [code]true[/code], the forward renderer will fall back to Vulkan if Direct3D 12 is not supported.
2774+
[b]Note:[/b] This setting is implemented only on Windows.
2775+
</member>
27682776
<member name="rendering/rendering_device/pipeline_cache/enable" type="bool" setter="" getter="" default="true">
27692777
Enable the pipeline cache that is saved to disk if the graphics API supports it.
27702778
[b]Note:[/b] This property is unable to control the pipeline caching the GPU driver itself does. Only turn this off along with deleting the contents of the driver's cache if you wish to simulate the experience a user will get when starting the game for the first time.

main/main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1956,6 +1956,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
19561956
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.android", PROPERTY_HINT_ENUM, driver_hints), default_driver);
19571957
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.ios", PROPERTY_HINT_ENUM, driver_hints), default_driver);
19581958
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "rendering/rendering_device/driver.macos", PROPERTY_HINT_ENUM, driver_hints), default_driver);
1959+
1960+
GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_vulkan", true);
1961+
GLOBAL_DEF_RST("rendering/rendering_device/fallback_to_d3d12", true);
19591962
}
19601963

19611964
{

platform/windows/display_server_windows.cpp

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5947,10 +5947,37 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
59475947

59485948
if (rendering_context) {
59495949
if (rendering_context->initialize() != OK) {
5950-
memdelete(rendering_context);
5951-
rendering_context = nullptr;
5952-
r_error = ERR_UNAVAILABLE;
5953-
return;
5950+
bool failed = true;
5951+
#if defined(VULKAN_ENABLED)
5952+
bool fallback_to_vulkan = GLOBAL_GET("rendering/rendering_device/fallback_to_vulkan");
5953+
if (failed && fallback_to_vulkan && rendering_driver != "vulkan") {
5954+
memdelete(rendering_context);
5955+
rendering_context = memnew(RenderingContextDriverVulkanWindows);
5956+
if (rendering_context->initialize() == OK) {
5957+
WARN_PRINT("Your video card drivers seem not to support Direct3D 12, switching to Vulkan.");
5958+
rendering_driver = "vulkan";
5959+
failed = false;
5960+
}
5961+
}
5962+
#endif
5963+
#if defined(D3D12_ENABLED)
5964+
bool fallback_to_d3d12 = GLOBAL_GET("rendering/rendering_device/fallback_to_d3d12");
5965+
if (failed && fallback_to_d3d12 && rendering_driver != "d3d12") {
5966+
memdelete(rendering_context);
5967+
rendering_context = memnew(RenderingContextDriverD3D12);
5968+
if (rendering_context->initialize() == OK) {
5969+
WARN_PRINT("Your video card drivers seem not to support Vulkan, switching to Direct3D 12.");
5970+
rendering_driver = "d3d12";
5971+
failed = false;
5972+
}
5973+
}
5974+
#endif
5975+
if (failed) {
5976+
memdelete(rendering_context);
5977+
rendering_context = nullptr;
5978+
r_error = ERR_UNAVAILABLE;
5979+
return;
5980+
}
59545981
}
59555982
}
59565983
#endif

0 commit comments

Comments
 (0)