diff --git a/src/amd/vulkan/radv_buffer.c b/src/amd/vulkan/radv_buffer.c index 88111750517..8ef575f8246 100644 --- a/src/amd/vulkan/radv_buffer.c +++ b/src/amd/vulkan/radv_buffer.c @@ -167,6 +167,7 @@ radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize siz VkBufferUsageFlags2 usage, VkMemoryRequirements2 *pMemoryRequirements) { const struct radv_physical_device *pdev = radv_device_physical(device); + const struct radv_instance *instance = radv_physical_device_instance(pdev); pMemoryRequirements->memoryRequirements.memoryTypeBits = ((1u << pdev->memory_properties.memoryTypeCount) - 1u) & ~pdev->memory_types_32bit; @@ -179,7 +180,10 @@ radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize siz pMemoryRequirements->memoryRequirements.memoryTypeBits = pdev->memory_types_32bit; if (flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) { - pMemoryRequirements->memoryRequirements.alignment = 4096; + if (instance->drirc.force_64k_sparse_alignment) + pMemoryRequirements->memoryRequirements.alignment = 65536; + else + pMemoryRequirements->memoryRequirements.alignment = 4096; } else { if (usage & VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT) pMemoryRequirements->memoryRequirements.alignment = radv_dgc_get_buffer_alignment(device); diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 4946a5aebd0..9fb1a64614b 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -195,6 +195,7 @@ static const driOptionDescription radv_dri_options[] = { DRI_CONF_RADV_APP_LAYER() DRI_CONF_RADV_EMULATE_RT(false) DRI_CONF_RADV_ENABLE_FLOAT16_GFX8(false) + DRI_CONF_RADV_FORCE_64K_SPARSE_ALIGNMENT(false) DRI_CONF_SECTION_END }; // clang-format on @@ -299,6 +300,8 @@ radv_init_dri_options(struct radv_instance *instance) instance->drirc.emulate_rt = driQueryOptionb(&instance->drirc.options, "radv_emulate_rt"); instance->drirc.expose_float16_gfx8 = driQueryOptionb(&instance->drirc.options, "radv_enable_float16_gfx8"); + + instance->drirc.force_64k_sparse_alignment = driQueryOptionb(&instance->drirc.options, "radv_force_64k_sparse_alignment"); } 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 d0f23404285..81c4921222e 100644 --- a/src/amd/vulkan/radv_instance.h +++ b/src/amd/vulkan/radv_instance.h @@ -74,6 +74,7 @@ struct radv_instance { bool lower_terminate_to_discard; bool emulate_rt; bool expose_float16_gfx8; + bool force_64k_sparse_alignment; char *app_layer; uint8_t override_graphics_shader_version; uint8_t override_compute_shader_version; diff --git a/src/util/driconf.h b/src/util/driconf.h index 3f94b28aee7..d046515ec69 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -841,6 +841,9 @@ DRI_CONF_OPT_B(radv_enable_float16_gfx8, def, \ "Expose float16 on GFX8, where it's supported but usually not beneficial.") +#define DRI_CONF_RADV_FORCE_64K_SPARSE_ALIGNMENT(def) \ + DRI_CONF_OPT_B(radv_force_64k_sparse_alignment, def, \ + "Force the alignment of sparse buffers to 64KiB") /** * \brief ANV specific configuration options */