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