diff --git a/.pick_status.json b/.pick_status.json index 474fea1cb63..b904752f3e3 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3044,7 +3044,7 @@ "description": "radv,driconf: Add radv_force_64k_sparse_alignment config", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null 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 7aebf073dfd..15a3f710502 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -194,6 +194,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 @@ -298,6 +299,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 8e1fbb1bf15..52605a44280 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -837,6 +837,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 */