From e39a5f2b9f66a5ae692b273512da7960f20aca0e Mon Sep 17 00:00:00 2001 From: Viktoriia Palianytsia Date: Tue, 17 May 2022 09:36:26 +0300 Subject: [PATCH] anv: Add workaround for sample mask with multisampling The game Batman: Arkham Knight expects OpenGL behavior with sample mask and multisampling which is different from the Vulkan one. This workaround fix changes key->ignore_sample_mask_out value that is used for prog_data->uses_omask definition in brv_fs.cpp(9740) In that way prog_data->uses_omask also changes it value and the cloak stops flickering. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6078 Signed-off-by: Viktoriia Palianytsia Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/anv_device.c | 3 +++ src/intel/vulkan/anv_pipeline.c | 3 +++ src/intel/vulkan/anv_private.h | 1 + src/util/00-mesa-defaults.conf | 3 +++ src/util/driconf.h | 4 ++++ 5 files changed, 14 insertions(+) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 45c2e2b7a34..da907456ec7 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -69,6 +69,7 @@ static const driOptionDescription anv_dri_options[] = { DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) DRI_CONF_VK_XWAYLAND_WAIT_READY(true) DRI_CONF_ANV_ASSUME_FULL_SUBGROUPS(false) + DRI_CONF_ANV_SAMPLE_MASK_OUT_OPENGL_BEHAVIOUR(false) DRI_CONF_SECTION_END DRI_CONF_SECTION_DEBUG @@ -1107,6 +1108,8 @@ anv_init_dri_options(struct anv_instance *instance) driQueryOptionb(&instance->dri_options, "anv_assume_full_subgroups"); instance->limit_trig_input_range = driQueryOptionb(&instance->dri_options, "limit_trig_input_range"); + instance->sample_mask_out_opengl_behaviour = + driQueryOptionb(&instance->dri_options, "anv_sample_mask_out_opengl_behaviour"); } VkResult anv_CreateInstance( diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index 8d4238f8bec..42e536c80a0 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -508,6 +508,9 @@ populate_wm_prog_key(const struct anv_graphics_pipeline *pipeline, (ms_info->minSampleShading * ms_info->rasterizationSamples) > 1; key->multisample_fbo = true; } + + if (device->physical->instance->sample_mask_out_opengl_behaviour) + key->ignore_sample_mask_out = !key->multisample_fbo; } key->coarse_pixel = diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 5bb91ea8701..d486fa6cfc8 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1086,6 +1086,7 @@ struct anv_instance { */ bool assume_full_subgroups; bool limit_trig_input_range; + bool sample_mask_out_opengl_behaviour; }; VkResult anv_init_wsi(struct anv_physical_device *physical_device); diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf index ea6f116ba32..354042aad13 100644 --- a/src/util/00-mesa-defaults.conf +++ b/src/util/00-mesa-defaults.conf @@ -926,6 +926,9 @@ TODO: document the other workarounds. + + diff --git a/src/util/driconf.h b/src/util/driconf.h index 068ed227af0..2eb02fdd914 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -584,4 +584,8 @@ DRI_CONF_OPT_B(anv_assume_full_subgroups, def, \ "Allow assuming full subgroups requirement even when it's not specified explicitly") +#define DRI_CONF_ANV_SAMPLE_MASK_OUT_OPENGL_BEHAVIOUR(def) \ + DRI_CONF_OPT_B(anv_sample_mask_out_opengl_behaviour, def, \ + "Ignore sample mask out when having single sampled target") + #endif