From 2f13723c0aad358778d87ca7e844f438ca5fcfaf Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 18 Nov 2024 16:00:36 +0100 Subject: [PATCH] radv: add a new drirc option to disable DCC for mips and enable it for RDR2 The game aliases two images. It binds a memory object to two different images, the first one being an image with 4 mips and the second with only one mip but the bind offset is incorrect. It's like it queried the first image size with different usage flags, so that DCC was disabled. Force disabling DCC for mips fixes the incorrect rendering and doesn't hurt performance. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10200 Cc: mesa-stable Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_image.c | 4 ++++ src/amd/vulkan/radv_instance.c | 3 +++ src/amd/vulkan/radv_instance.h | 1 + src/util/00-radv-defaults.conf | 3 +++ src/util/driconf.h | 4 ++++ 5 files changed, 15 insertions(+) diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index 8670dea74c2..8746675a8cc 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -291,6 +291,10 @@ radv_use_dcc_for_image_early(struct radv_device *device, struct radv_image *imag return false; } + /* Force disable DCC for mips to workaround game bugs. */ + if (instance->drirc.disable_dcc_mips && pCreateInfo->mipLevels > 1) + return false; + /* DCC MSAA can't work on GFX10.3 and earlier without FMASK. */ if (pCreateInfo->samples > 1 && pdev->info.gfx_level < GFX11 && (instance->debug_flags & RADV_DEBUG_NO_FMASK)) return false; diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index d7d09b4e1a5..884c7347e44 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -154,6 +154,7 @@ static const driOptionDescription radv_dri_options[] = { DRI_CONF_RADV_SPLIT_FMA(false) DRI_CONF_RADV_DISABLE_TC_COMPAT_HTILE_GENERAL(false) DRI_CONF_RADV_DISABLE_DCC(false) + DRI_CONF_RADV_DISABLE_DCC_MIPS(false) DRI_CONF_RADV_DISABLE_ANISO_SINGLE_LEVEL(false) DRI_CONF_RADV_DISABLE_TRUNC_COORD(false) DRI_CONF_RADV_DISABLE_SINKING_LOAD_INPUT_FS(false) @@ -264,6 +265,8 @@ radv_init_dri_options(struct radv_instance *instance) instance->drirc.vk_require_etc2 = driQueryOptionb(&instance->drirc.options, "vk_require_etc2"); instance->drirc.vk_require_astc = driQueryOptionb(&instance->drirc.options, "vk_require_astc"); + + instance->drirc.disable_dcc_mips = driQueryOptionb(&instance->drirc.options, "radv_disable_dcc_mips"); } static const struct vk_instance_extension_table radv_instance_extensions_supported = { diff --git a/src/amd/vulkan/radv_instance.h b/src/amd/vulkan/radv_instance.h index f43b211444d..876461b642b 100644 --- a/src/amd/vulkan/radv_instance.h +++ b/src/amd/vulkan/radv_instance.h @@ -71,6 +71,7 @@ struct radv_instance { bool report_llvm9_version_string; bool vk_require_etc2; bool vk_require_astc; + bool disable_dcc_mips; char *app_layer; uint8_t override_graphics_shader_version; uint8_t override_compute_shader_version; diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index 371f9c8a7ca..5bf2bedc960 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -132,6 +132,9 @@ Application bugs worked around in this file: diff --git a/src/util/driconf.h b/src/util/driconf.h index 2160f7b33de..769d2dfd7d5 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -692,6 +692,10 @@ DRI_CONF_OPT_B(radv_disable_dcc, def, \ "Disable DCC for color images") +#define DRI_CONF_RADV_DISABLE_DCC_MIPS(def) \ + DRI_CONF_OPT_B(radv_disable_dcc_mips, def, \ + "Disable DCC for color images with mips") + #define DRI_CONF_RADV_DISABLE_ANISO_SINGLE_LEVEL(def) \ DRI_CONF_OPT_B(radv_disable_aniso_single_level, def, \ "Disable anisotropic filtering for single level images")