radv: add a workaround for Monster Hunter World and LLVM 7&8
The load/store optimizer pass doesn't handle WaW hazards correctly and this is the root cause of the reflection issue with Monster Hunter World. AFAIK, it's the only game that are affected by this issue. This is fixed with LLVM r361008, but we need a workaround for older LLVM versions unfortunately. Cc: "19.0" "19.1" <mesa-stable@lists.freedesktop.org> Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
parent
47afc5eed7
commit
d7501834cd
|
@ -151,13 +151,14 @@ static LLVMTargetMachineRef ac_create_target_machine(enum radeon_family family,
|
|||
LLVMTargetRef target = ac_get_llvm_target(triple);
|
||||
|
||||
snprintf(features, sizeof(features),
|
||||
"+DumpCode,-fp32-denormals,+fp64-denormals%s%s%s%s%s",
|
||||
"+DumpCode,-fp32-denormals,+fp64-denormals%s%s%s%s%s%s",
|
||||
HAVE_LLVM >= 0x0800 ? "" : ",+vgpr-spilling",
|
||||
tm_options & AC_TM_SISCHED ? ",+si-scheduler" : "",
|
||||
tm_options & AC_TM_FORCE_ENABLE_XNACK ? ",+xnack" : "",
|
||||
tm_options & AC_TM_FORCE_DISABLE_XNACK ? ",-xnack" : "",
|
||||
tm_options & AC_TM_PROMOTE_ALLOCA_TO_SCRATCH ? ",-promote-alloca" : "");
|
||||
|
||||
tm_options & AC_TM_PROMOTE_ALLOCA_TO_SCRATCH ? ",-promote-alloca" : "",
|
||||
tm_options & AC_TM_NO_LOAD_STORE_OPT ? ",-load-store-opt" : "");
|
||||
|
||||
LLVMTargetMachineRef tm = LLVMCreateTargetMachine(
|
||||
target,
|
||||
triple,
|
||||
|
|
|
@ -65,6 +65,7 @@ enum ac_target_machine_options {
|
|||
AC_TM_CHECK_IR = (1 << 5),
|
||||
AC_TM_ENABLE_GLOBAL_ISEL = (1 << 6),
|
||||
AC_TM_CREATE_LOW_OPT = (1 << 7),
|
||||
AC_TM_NO_LOAD_STORE_OPT = (1 << 8),
|
||||
};
|
||||
|
||||
enum ac_float_mode {
|
||||
|
|
|
@ -51,6 +51,7 @@ enum {
|
|||
RADV_DEBUG_CHECKIR = 0x200000,
|
||||
RADV_DEBUG_NOTHREADLLVM = 0x400000,
|
||||
RADV_DEBUG_NOBINNING = 0x800000,
|
||||
RADV_DEBUG_NO_LOAD_STORE_OPT = 0x1000000,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
|
@ -464,6 +464,7 @@ static const struct debug_control radv_debug_options[] = {
|
|||
{"checkir", RADV_DEBUG_CHECKIR},
|
||||
{"nothreadllvm", RADV_DEBUG_NOTHREADLLVM},
|
||||
{"nobinning", RADV_DEBUG_NOBINNING},
|
||||
{"noloadstoreopt", RADV_DEBUG_NO_LOAD_STORE_OPT},
|
||||
{NULL, 0}
|
||||
};
|
||||
|
||||
|
@ -510,6 +511,13 @@ radv_handle_per_app_options(struct radv_instance *instance,
|
|||
} 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 (HAVE_LLVM < 0x900)
|
||||
instance->debug_flags |= RADV_DEBUG_NO_LOAD_STORE_OPT;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -649,6 +649,8 @@ shader_variant_create(struct radv_device *device,
|
|||
tm_options |= AC_TM_SISCHED;
|
||||
if (options->check_ir)
|
||||
tm_options |= AC_TM_CHECK_IR;
|
||||
if (device->instance->debug_flags & RADV_DEBUG_NO_LOAD_STORE_OPT)
|
||||
tm_options |= AC_TM_NO_LOAD_STORE_OPT;
|
||||
|
||||
thread_compiler = !(device->instance->debug_flags & RADV_DEBUG_NOTHREADLLVM);
|
||||
radv_init_llvm_once();
|
||||
|
|
Loading…
Reference in New Issue