From a59be04ea5520efb7baaf94d327eaa30b2993526 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 29 Sep 2022 14:11:18 +0200 Subject: [PATCH] radv: rework writing image/buffer/accel_struct descriptors slightly Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/radv_descriptor_set.c | 131 +++++++++++++++++---------- 1 file changed, 81 insertions(+), 50 deletions(-) diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index a59c67e4c54..a150cceb1a9 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -1042,32 +1042,13 @@ write_texel_buffer_descriptor(struct radv_device *device, struct radv_cmd_buffer } static ALWAYS_INLINE void -write_buffer_descriptor(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer, - unsigned *dst, struct radeon_winsys_bo **buffer_list, - const VkDescriptorBufferInfo *buffer_info) +write_buffer_descriptor(struct radv_device *device, unsigned *dst, uint64_t va, uint64_t range) { - RADV_FROM_HANDLE(radv_buffer, buffer, buffer_info->buffer); - - if (!buffer) { + if (!va) { memset(dst, 0, 4 * 4); - if (!cmd_buffer) - *buffer_list = NULL; return; } - uint64_t va = radv_buffer_get_va(buffer->bo); - - uint32_t range = vk_buffer_range(&buffer->vk, buffer_info->offset, buffer_info->range); - assert(buffer->vk.size > 0 && range > 0); - - /* robustBufferAccess is relaxed enough to allow this (in combination - * with the alignment/size we return from vkGetBufferMemoryRequirements) - * and this allows the shader compiler to create more efficient 8/16-bit - * buffer accesses. */ - range = align(range, 4); - - va += buffer_info->offset + buffer->offset; - uint32_t rsrc_word3 = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) | S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) | S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) | S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W); @@ -1087,6 +1068,36 @@ write_buffer_descriptor(struct radv_device *device, struct radv_cmd_buffer *cmd_ dst[1] = S_008F04_BASE_ADDRESS_HI(va >> 32); dst[2] = range; dst[3] = rsrc_word3; +} + +static ALWAYS_INLINE void +write_buffer_descriptor_impl(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer, + unsigned *dst, struct radeon_winsys_bo **buffer_list, + const VkDescriptorBufferInfo *buffer_info) +{ + RADV_FROM_HANDLE(radv_buffer, buffer, buffer_info->buffer); + uint64_t va = 0, range = 0; + + if (buffer) { + va = radv_buffer_get_va(buffer->bo) + buffer_info->offset + buffer->offset; + + range = vk_buffer_range(&buffer->vk, buffer_info->offset, buffer_info->range); + assert(buffer->vk.size > 0 && range > 0); + + /* robustBufferAccess is relaxed enough to allow this (in combination with the alignment/size + * we return from vkGetBufferMemoryRequirements) and this allows the shader compiler to create + * more efficient 8/16-bit buffer accesses. + */ + range = align(range, 4); + } + + write_buffer_descriptor(device, dst, va, range); + + if (!buffer) { + if (!cmd_buffer) + *buffer_list = NULL; + return; + } if (cmd_buffer) radv_cs_add_buffer(device->ws, cmd_buffer->cs, buffer->bo); @@ -1138,17 +1149,17 @@ write_dynamic_buffer_descriptor(struct radv_device *device, struct radv_descript } static ALWAYS_INLINE void -write_image_descriptor(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer, - unsigned size, unsigned *dst, struct radeon_winsys_bo **buffer_list, - VkDescriptorType descriptor_type, const VkDescriptorImageInfo *image_info) +write_image_descriptor(unsigned *dst, unsigned size, VkDescriptorType descriptor_type, + const VkDescriptorImageInfo *image_info) { - RADV_FROM_HANDLE(radv_image_view, iview, image_info->imageView); + struct radv_image_view *iview = NULL; union radv_descriptor *descriptor; + if (image_info) + iview = radv_image_view_from_handle(image_info->imageView); + if (!iview) { memset(dst, 0, size); - if (!cmd_buffer) - *buffer_list = NULL; return; } @@ -1160,6 +1171,22 @@ write_image_descriptor(struct radv_device *device, struct radv_cmd_buffer *cmd_b assert(size > 0); memcpy(dst, descriptor, size); +} + +static ALWAYS_INLINE void +write_image_descriptor_impl(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer, + unsigned size, unsigned *dst, struct radeon_winsys_bo **buffer_list, + VkDescriptorType descriptor_type, const VkDescriptorImageInfo *image_info) +{ + RADV_FROM_HANDLE(radv_image_view, iview, image_info->imageView); + + write_image_descriptor(dst, size, descriptor_type, image_info); + + if (!iview) { + if (!cmd_buffer) + *buffer_list = NULL; + return; + } const uint32_t max_bindings = sizeof(iview->image->bindings) / sizeof(iview->image->bindings[0]); @@ -1181,8 +1208,8 @@ write_combined_image_sampler_descriptor(struct radv_device *device, VkDescriptorType descriptor_type, const VkDescriptorImageInfo *image_info, bool has_sampler) { - write_image_descriptor(device, cmd_buffer, sampler_offset, dst, buffer_list, descriptor_type, - image_info); + write_image_descriptor_impl(device, cmd_buffer, sampler_offset, dst, buffer_list, descriptor_type, + image_info); /* copy over sampler state */ if (has_sampler) { RADV_FROM_HANDLE(radv_sampler, sampler, image_info->sampler); @@ -1198,10 +1225,8 @@ write_sampler_descriptor(unsigned *dst, VkSampler _sampler) } static ALWAYS_INLINE void -write_accel_struct(void *ptr, VkAccelerationStructureKHR _accel_struct) +write_accel_struct(void *ptr, VkDeviceAddress va) { - RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct, _accel_struct); - uint64_t va = accel_struct ? accel_struct->va : 0; memcpy(ptr, &va, sizeof(va)); } @@ -1259,8 +1284,8 @@ radv_update_descriptor_sets_impl(struct radv_device *device, struct radv_cmd_buf } case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - write_buffer_descriptor(device, cmd_buffer, ptr, buffer_list, - writeset->pBufferInfo + j); + write_buffer_descriptor_impl(device, cmd_buffer, ptr, buffer_list, + writeset->pBufferInfo + j); break; case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: @@ -1268,13 +1293,13 @@ radv_update_descriptor_sets_impl(struct radv_device *device, struct radv_cmd_buf writeset->pTexelBufferView[j]); break; case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - write_image_descriptor(device, cmd_buffer, 32, ptr, buffer_list, - writeset->descriptorType, writeset->pImageInfo + j); + write_image_descriptor_impl(device, cmd_buffer, 32, ptr, buffer_list, + writeset->descriptorType, writeset->pImageInfo + j); break; case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: - write_image_descriptor(device, cmd_buffer, 64, ptr, buffer_list, - writeset->descriptorType, writeset->pImageInfo + j); + write_image_descriptor_impl(device, cmd_buffer, 64, ptr, buffer_list, + writeset->descriptorType, writeset->pImageInfo + j); break; case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { unsigned sampler_offset = radv_combined_image_descriptor_sampler_offset(binding_layout); @@ -1296,9 +1321,12 @@ radv_update_descriptor_sets_impl(struct radv_device *device, struct radv_cmd_buf memcpy(ptr, samplers + 4 * idx, 16); } break; - case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: - write_accel_struct(ptr, accel_structs->pAccelerationStructures[j]); + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: { + RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct, + accel_structs->pAccelerationStructures[j]); + write_accel_struct(ptr, accel_struct ? accel_struct->va : 0); break; + } default: break; } @@ -1552,8 +1580,8 @@ radv_update_descriptor_set_with_template_impl(struct radv_device *device, } case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - write_buffer_descriptor(device, cmd_buffer, pDst, buffer_list, - (struct VkDescriptorBufferInfo *)pSrc); + write_buffer_descriptor_impl(device, cmd_buffer, pDst, buffer_list, + (struct VkDescriptorBufferInfo *)pSrc); break; case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: @@ -1561,15 +1589,15 @@ radv_update_descriptor_set_with_template_impl(struct radv_device *device, *(VkBufferView *)pSrc); break; case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - write_image_descriptor(device, cmd_buffer, 32, pDst, buffer_list, - templ->entry[i].descriptor_type, - (struct VkDescriptorImageInfo *)pSrc); + write_image_descriptor_impl(device, cmd_buffer, 32, pDst, buffer_list, + templ->entry[i].descriptor_type, + (struct VkDescriptorImageInfo *)pSrc); break; case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: - write_image_descriptor(device, cmd_buffer, 64, pDst, buffer_list, - templ->entry[i].descriptor_type, - (struct VkDescriptorImageInfo *)pSrc); + write_image_descriptor_impl(device, cmd_buffer, 64, pDst, buffer_list, + templ->entry[i].descriptor_type, + (struct VkDescriptorImageInfo *)pSrc); break; case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: write_combined_image_sampler_descriptor( @@ -1589,9 +1617,12 @@ radv_update_descriptor_set_with_template_impl(struct radv_device *device, else if (cmd_buffer && templ->entry[i].immutable_samplers) memcpy(pDst, templ->entry[i].immutable_samplers + 4 * j, 16); break; - case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: - write_accel_struct(pDst, *(const VkAccelerationStructureKHR *)pSrc); + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: { + RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct, + *(const VkAccelerationStructureKHR *)pSrc); + write_accel_struct(pDst, accel_struct ? accel_struct->va : 0); break; + } default: break; }