From 549e247aeb3f55507dcf21207c00172ea461787a Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 29 May 2020 20:26:00 +0200 Subject: [PATCH] radv: enable zero VRAM for all VKD3D (DX12->VK) games To fix rendering issues with Metro Exodus, RE2 and 3 and probably more titles. It seems the default behaviour of DX12 anyways. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3064 Cc: Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: (cherry picked from commit d3c937c0e4d1dd05072d9a7169532517ef7d0c7f) --- .pick_status.json | 2 +- src/amd/vulkan/radv_device.c | 77 ++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 44d00837709..7cbf41dfeae 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1705,7 +1705,7 @@ "description": "radv: enable zero VRAM for all VKD3D (DX12->VK) games", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 5682ff2c908..1d50e48c2da 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -598,48 +598,49 @@ radv_handle_per_app_options(struct radv_instance *instance, const VkApplicationInfo *info) { const char *name = info ? info->pApplicationName : NULL; + const char *engine_name = info ? info->pEngineName : NULL; - if (!name) - return; + if (name) { + if (!strcmp(name, "DOOM_VFR")) { + /* Work around a Doom VFR game bug */ + instance->debug_flags |= RADV_DEBUG_NO_DYNAMIC_BOUNDS; + } else if (!strcmp(name, "MonsterHunterWorld.exe")) { + /* Workaround for a WaW hazard when LLVM moves/merges + * load/store memory operations. + * See https://reviews.llvm.org/D61313 + */ + if (LLVM_VERSION_MAJOR < 9) + instance->debug_flags |= RADV_DEBUG_NO_LOAD_STORE_OPT; + } else if (!strcmp(name, "Wolfenstein: Youngblood")) { + if (!(instance->debug_flags & RADV_DEBUG_NO_SHADER_BALLOT) && + !(instance->perftest_flags & RADV_PERFTEST_ACO)) { + /* Force enable VK_AMD_shader_ballot because it looks + * safe and it gives a nice boost (+20% on Vega 56 at + * this time). It also prevents corruption on LLVM. + */ + instance->perftest_flags |= RADV_PERFTEST_SHADER_BALLOT; + } + } else if (!strcmp(name, "Fledge")) { + /* + * Zero VRAM for "The Surge 2" + * + * This avoid a hang when when rendering any level. Likely + * uninitialized data in an indirect draw. + */ + instance->debug_flags |= RADV_DEBUG_ZERO_VRAM; + } else if (!strcmp(name, "DOOMEternal")) { + /* Zero VRAM for Doom Eternal to fix rendering issues. */ + instance->debug_flags |= RADV_DEBUG_ZERO_VRAM; + } + } - if (!strcmp(name, "Talos - Linux - 32bit") || - !strcmp(name, "Talos - Linux - 64bit")) { - if (!(instance->debug_flags & RADV_DEBUG_NO_SISCHED)) { - /* Force enable LLVM sisched for Talos because it looks - * safe and it gives few more FPS. + if (engine_name) { + if (!strcmp(engine_name, "vkd3d")) { + /* Zero VRAM for all VKD3D (DX12->VK) games to fix + * rendering issues. */ - instance->perftest_flags |= RADV_PERFTEST_SISCHED; + instance->debug_flags |= RADV_DEBUG_ZERO_VRAM; } - } else if (!strcmp(name, "DOOM_VFR")) { - /* Work around a Doom VFR game bug */ - instance->debug_flags |= RADV_DEBUG_NO_DYNAMIC_BOUNDS; - } else if (!strcmp(name, "MonsterHunterWorld.exe")) { - /* Workaround for a WaW hazard when LLVM moves/merges - * load/store memory operations. - * See https://reviews.llvm.org/D61313 - */ - if (LLVM_VERSION_MAJOR < 9) - instance->debug_flags |= RADV_DEBUG_NO_LOAD_STORE_OPT; - } else if (!strcmp(name, "Wolfenstein: Youngblood")) { - if (!(instance->debug_flags & RADV_DEBUG_NO_SHADER_BALLOT) && - !(instance->perftest_flags & RADV_PERFTEST_ACO)) { - /* Force enable VK_AMD_shader_ballot because it looks - * safe and it gives a nice boost (+20% on Vega 56 at - * this time). It also prevents corruption on LLVM. - */ - instance->perftest_flags |= RADV_PERFTEST_SHADER_BALLOT; - } - } else if (!strcmp(name, "Fledge")) { - /* - * Zero VRAM for "The Surge 2" - * - * This avoid a hang when when rendering any level. Likely - * uninitialized data in an indirect draw. - */ - instance->debug_flags |= RADV_DEBUG_ZERO_VRAM; - } else if (!strcmp(name, "DOOMEternal")) { - /* Zero VRAM for Doom Eternal to fix rendering issues. */ - instance->debug_flags |= RADV_DEBUG_ZERO_VRAM; } }