From 0bb8384c76ffa12683f0ea09392576cd08ad0bd0 Mon Sep 17 00:00:00 2001 From: Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com> Date: Thu, 5 Nov 2026 14:53:15 -0500 Subject: [PATCH] fix: avoid unsupported ray tracing on Stellar Blade startup --- .../overlay/usr/local/bin/droiddeck-game-env | 9 +++++++ tools/tests/test_game_environment.py | 25 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/tools/linuxfs/overlay/usr/local/bin/droiddeck-game-env b/tools/linuxfs/overlay/usr/local/bin/droiddeck-game-env index ac7cd5189..d85b1bc51 100755 --- a/tools/linuxfs/overlay/usr/local/bin/droiddeck-game-env +++ b/tools/linuxfs/overlay/usr/local/bin/droiddeck-game-env @@ -171,6 +171,15 @@ def reskate_feature_level(game): return {"VKD3D_FEATURE_LEVEL": "12_1"}, [], "ReSkate (skate.): D3D12 feature level 12_1" +@fix +def stellar_blade_feature_level(game): + if game.stem == "sb-win64-shipping" or ( + "sb.exe" in game.files + and os.path.isfile(os.path.join(os.path.dirname(game.exe), "SB", "Binaries", "Win64", "SB-Win64-Shipping.exe")) + ): + return {"VKD3D_FEATURE_LEVEL": None}, [], "Stellar Blade: use the driver's D3D12 feature level (12_2 advertises unsupported ray tracing)" + + @fix def cyberpunk_feature_level(game): if game.stem == "cyberpunk2077" or ( diff --git a/tools/tests/test_game_environment.py b/tools/tests/test_game_environment.py index c48e5ab1b..093c5e843 100644 --- a/tools/tests/test_game_environment.py +++ b/tools/tests/test_game_environment.py @@ -1190,6 +1190,31 @@ class GameEnvironmentTest(unittest.TestCase): (skate / name).touch() self.assertEqual(MODULE["engine_fixes"](str(skate / "EAAntiCheat.GameServiceLauncher.exe"), [])[:2], ({}, [])) + def test_stellar_blade_uses_detected_feature_level_without_overriding_game_settings(self): + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) / "StellarBlade" + shipping = root / "SB/Binaries/Win64/SB-Win64-Shipping.exe" + shipping.parent.mkdir(parents=True) + shipping.touch() + (root / "SB.exe").touch() + config = {"version": 1, "shared": {"VKD3D_FEATURE_LEVEL": "12_2"}} + for exe in (root / "SB.exe", root / ".droiddeck-launch.bat", shipping): + env, extra, notes = MODULE["engine_fixes"](str(exe), []) + self.assertEqual((env, extra), ({"VKD3D_FEATURE_LEVEL": None}, []), exe) + self.assertTrue(notes) + inherited = {"VKD3D_FEATURE_LEVEL": "12_2", "KEEP": "unchanged"} + effective = MODULE["apply_config"](inherited, config, "3489700", env) + self.assertNotIn("VKD3D_FEATURE_LEVEL", effective) + self.assertEqual(effective["KEEP"], "unchanged") + for value in ("12_1", "12_2", None): + explicit = dict(config, games={"3489700": {"VKD3D_FEATURE_LEVEL": value}}) + actual = MODULE["apply_config"](inherited, explicit, "3489700", env) + self.assertEqual(actual.get("VKD3D_FEATURE_LEVEL"), value) + other = Path(tmp) / "Other" + other.mkdir() + (other / "SB.exe").touch() + self.assertEqual(MODULE["engine_fixes"](str(other / "SB.exe"), []), ({}, [], [])) + def test_caravan_sandwitch_robocop_and_cyberpunk_run_at_feature_level_12_1(self): with tempfile.TemporaryDirectory() as tmp: caravan = Path(tmp) / "Caravan SandWitch"