From 0fa3be44aab611c1fd350ac7023e8ca590c05d0d Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Thu, 21 Nov 2024 20:34:29 +0200 Subject: [PATCH] anv: add a workaround for X4 Foundations This title incorrectly tries to allocate descriptor sets larger than the number of sampler items in the descriptor pool. Workaround by taking other largest item count in the descriptor pool and use that for samplers. Signed-off-by: Lionel Landwerlin Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11795 Reviewed-by: Ivan Briano Reviewed-by: Lina Versace Part-of: --- src/intel/vulkan/anv_descriptor_set.c | 12 +++++++++++- src/intel/vulkan/anv_instance.c | 4 ++++ src/intel/vulkan/anv_private.h | 1 + src/util/00-mesa-defaults.conf | 3 +++ src/util/driconf.h | 4 ++++ 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c index 7b592d8b90c..d89049807d0 100644 --- a/src/intel/vulkan/anv_descriptor_set.c +++ b/src/intel/vulkan/anv_descriptor_set.c @@ -1423,6 +1423,15 @@ VkResult anv_CreateDescriptorPool( ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_INDIRECT : ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_DIRECT; + uint32_t max_descriptor_count = 0; + if (device->physical->instance->anv_upper_bound_descriptor_pool_sampler && + !device->physical->indirect_descriptors) { + for (uint32_t i = 0; i < pCreateInfo->poolSizeCount; i++) { + max_descriptor_count = MAX2(pCreateInfo->pPoolSizes[i].descriptorCount, + max_descriptor_count); + } + } + for (uint32_t i = 0; i < pCreateInfo->poolSizeCount; i++) { enum anv_descriptor_data desc_data = pCreateInfo->pPoolSizes[i].type == VK_DESCRIPTOR_TYPE_MUTABLE_EXT ? @@ -1449,7 +1458,8 @@ VkResult anv_CreateDescriptorPool( uint32_t desc_data_surface_size = desc_surface_size * pCreateInfo->pPoolSizes[i].descriptorCount; uint32_t desc_data_sampler_size = - desc_sampler_size * pCreateInfo->pPoolSizes[i].descriptorCount; + desc_sampler_size * MAX2(max_descriptor_count, + pCreateInfo->pPoolSizes[i].descriptorCount); /* Combined image sampler descriptors can take up to 3 slots if they * hold a YCbCr image. diff --git a/src/intel/vulkan/anv_instance.c b/src/intel/vulkan/anv_instance.c index 1205b6311ae..e63aa9e873f 100644 --- a/src/intel/vulkan/anv_instance.c +++ b/src/intel/vulkan/anv_instance.c @@ -41,6 +41,7 @@ static const driOptionDescription anv_dri_options[] = { DRI_CONF_ENUM(512, "512 stackids") DRI_CONF_ENUM(1024, "1024 stackids") DRI_CONF_ENUM(2048, "2048 stackids")) + DRI_CONF_ANV_UPPER_BOUND_DESCRIPTOR_POOL_SAMPLER(false) DRI_CONF_SECTION_END DRI_CONF_SECTION_DEBUG @@ -178,6 +179,9 @@ anv_init_dri_options(struct anv_instance *instance) driQueryOptionb(&instance->dri_options, "compression_control_enabled"); instance->anv_fake_nonlocal_memory = driQueryOptionb(&instance->dri_options, "anv_fake_nonlocal_memory"); + instance->anv_upper_bound_descriptor_pool_sampler = + driQueryOptionb(&instance->dri_options, + "anv_upper_bound_descriptor_pool_sampler"); instance->stack_ids = driQueryOptioni(&instance->dri_options, "intel_stack_id"); switch (instance->stack_ids) { diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 90c97d3cc9d..2a065651828 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1306,6 +1306,7 @@ struct anv_instance { bool disable_xe2_ccs; bool compression_control_enabled; bool anv_fake_nonlocal_memory; + bool anv_upper_bound_descriptor_pool_sampler; /* HW workarounds */ bool no_16bit; diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf index 39712cef38b..635b2193bc1 100644 --- a/src/util/00-mesa-defaults.conf +++ b/src/util/00-mesa-defaults.conf @@ -1272,6 +1272,9 @@ TODO: document the other workarounds. + + diff --git a/src/util/driconf.h b/src/util/driconf.h index 769d2dfd7d5..0c85305d171 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -841,6 +841,10 @@ DRI_CONF_OPT_B(anv_fake_nonlocal_memory, def, \ "Present host-visible device-local memory types as non device-local") +#define DRI_CONF_ANV_UPPER_BOUND_DESCRIPTOR_POOL_SAMPLER(def) \ + DRI_CONF_OPT_B(anv_upper_bound_descriptor_pool_sampler, def, \ + "Overallocate samplers in descriptor pools to workaround app bug") + /** * \brief HASVK specific configuration options */