From a4b3ce5d56e7eb22a7d0f97b4709bef6e16af16e Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Mon, 5 Apr 2021 01:23:43 +0200 Subject: [PATCH] radv: Add acceleration structure descriptor set support. Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_debug.c | 1 + src/amd/vulkan/radv_descriptor_set.c | 30 +++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c index 8a9b7768593..ba3328ca101 100644 --- a/src/amd/vulkan/radv_debug.c +++ b/src/amd/vulkan/radv_debug.c @@ -225,6 +225,7 @@ radv_dump_descriptor_set(struct radv_device *device, struct radv_descriptor_set case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_MUTABLE_VALVE: + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: /* todo */ break; default: diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index 2b9073ab83d..f2a999d6a17 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -251,6 +251,10 @@ radv_CreateDescriptorSetLayout(VkDevice _device, const VkDescriptorSetLayoutCrea set_layout->binding[b].size = descriptor_count; descriptor_count = 1; break; + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: + set_layout->binding[b].size = 16; + alignment = 16; + break; default: break; } @@ -412,6 +416,10 @@ radv_GetDescriptorSetLayoutSupport(VkDevice device, supported = false; } break; + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: + descriptor_size = 16; + descriptor_alignment = 16; + break; default: break; } @@ -731,6 +739,7 @@ radv_CreateDescriptorPool(VkDevice _device, const VkDescriptorPoolCreateInfo *pC case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_SAMPLER: + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: /* 32 as we may need to align for images */ bo_size += 32 * pCreateInfo->pPoolSizes[i].descriptorCount; break; @@ -1089,6 +1098,14 @@ write_sampler_descriptor(struct radv_device *device, unsigned *dst, memcpy(dst, sampler->state, 16); } +static void +write_accel_struct(void *ptr, VkAccelerationStructureKHR _accel_struct) +{ + RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct, _accel_struct); + uint64_t va = radv_accel_struct_get_va(accel_struct); + memcpy(ptr, &va, sizeof(va)); +} + void radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer, VkDescriptorSet dstSetOverride, uint32_t descriptorWriteCount, @@ -1113,6 +1130,7 @@ radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer * binding_layout->immutable_samplers_offset && !binding_layout->immutable_samplers_equal; const uint32_t *samplers = radv_immutable_samplers(set->header.layout, binding_layout); + const VkWriteDescriptorSetAccelerationStructureKHR *accel_structs = NULL; ptr += binding_layout->offset / 4; @@ -1120,6 +1138,9 @@ radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer * write_block_descriptor(device, cmd_buffer, (uint8_t *)ptr + writeset->dstArrayElement, writeset); continue; + } else if (writeset->descriptorType == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) { + accel_structs = + vk_find_struct_const(writeset->pNext, WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR); } ptr += binding_layout->size * writeset->dstArrayElement / 4; @@ -1172,6 +1193,9 @@ radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer * memcpy(ptr, samplers + 4 * idx, 16); } break; + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: + write_accel_struct(ptr, accel_structs->pAccelerationStructures[j]); + break; default: break; } @@ -1238,7 +1262,8 @@ radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer * src_ptr += src_binding_layout->size / 4; dst_ptr += dst_binding_layout->size / 4; - if (src_binding_layout->type != VK_DESCRIPTOR_TYPE_SAMPLER) { + if (src_binding_layout->type != VK_DESCRIPTOR_TYPE_SAMPLER && + src_binding_layout->type != VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) { /* Sampler descriptors don't have a buffer list. */ dst_buffer_list[j] = src_buffer_list[j]; } @@ -1433,6 +1458,9 @@ radv_update_descriptor_set_with_template(struct radv_device *device, else if (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); + break; default: break; }