Mesa (main): radv: Add acceleration structure descriptor set support.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jun 18 22:42:31 UTC 2021
Module: Mesa
Branch: main
Commit: a4b3ce5d56e7eb22a7d0f97b4709bef6e16af16e
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a4b3ce5d56e7eb22a7d0f97b4709bef6e16af16e
Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date: Mon Apr 5 01:23:43 2021 +0200
radv: Add acceleration structure descriptor set support.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11078>
---
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;
}
More information about the mesa-commit
mailing list