Module: Mesa
Branch: main
Commit: eb33a1adb048b05c1692f8018fdcd058996a1c06
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=eb33a1adb048b05c1692f8018fdcd058996a1c06

Author: Konstantin Seurer <[email protected]>
Date:   Wed Feb  1 10:59:46 2023 +0100

vulkan: Add vk_acceleration_structure

Reviewed-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21047>

---

 src/vulkan/runtime/meson.build                 |  2 +
 src/vulkan/runtime/vk_acceleration_structure.c | 94 ++++++++++++++++++++++++++
 src/vulkan/runtime/vk_acceleration_structure.h | 43 ++++++++++++
 3 files changed, 139 insertions(+)

diff --git a/src/vulkan/runtime/meson.build b/src/vulkan/runtime/meson.build
index b594e4e50b1..46d9fda3048 100644
--- a/src/vulkan/runtime/meson.build
+++ b/src/vulkan/runtime/meson.build
@@ -22,6 +22,8 @@
 # dependency tracking.
 
 vulkan_runtime_files = files(
+  'vk_acceleration_structure.c',
+  'vk_acceleration_structure.h',
   'vk_buffer.c',
   'vk_buffer.h',
   'vk_cmd_copy.c',
diff --git a/src/vulkan/runtime/vk_acceleration_structure.c 
b/src/vulkan/runtime/vk_acceleration_structure.c
new file mode 100644
index 00000000000..077e3669f4c
--- /dev/null
+++ b/src/vulkan/runtime/vk_acceleration_structure.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright © 2021 Bas Nieuwenhuizen
+ * Copyright © 2023 Valve Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "vk_acceleration_structure.h"
+
+#include "vk_alloc.h"
+#include "vk_common_entrypoints.h"
+#include "vk_device.h"
+#include "vk_log.h"
+
+VkDeviceAddress
+vk_acceleration_structure_get_va(struct vk_acceleration_structure 
*accel_struct)
+{
+   VkBufferDeviceAddressInfo info = {
+      .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
+      .buffer = accel_struct->buffer,
+   };
+
+   VkDeviceAddress base_addr = 
accel_struct->base.device->dispatch_table.GetBufferDeviceAddress(
+      vk_device_to_handle(accel_struct->base.device), &info);
+
+   return base_addr + accel_struct->offset;
+}
+
+
+VKAPI_ATTR VkResult VKAPI_CALL
+vk_common_CreateAccelerationStructureKHR(VkDevice _device,
+                                         const 
VkAccelerationStructureCreateInfoKHR *pCreateInfo,
+                                         const VkAllocationCallbacks 
*pAllocator,
+                                         VkAccelerationStructureKHR 
*pAccelerationStructure)
+{
+   VK_FROM_HANDLE(vk_device, device, _device);
+
+   struct vk_acceleration_structure *accel_struct = vk_object_alloc(
+      device, pAllocator, sizeof(struct vk_acceleration_structure),
+      VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR);
+
+   if (!accel_struct)
+      return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
+
+   accel_struct->buffer = pCreateInfo->buffer;
+   accel_struct->offset = pCreateInfo->offset;
+   accel_struct->size = pCreateInfo->size;
+
+   if (pCreateInfo->deviceAddress &&
+       vk_acceleration_structure_get_va(accel_struct) != 
pCreateInfo->deviceAddress)
+      return vk_error(device, VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR);
+
+   *pAccelerationStructure = vk_acceleration_structure_to_handle(accel_struct);
+   return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL
+vk_common_DestroyAccelerationStructureKHR(VkDevice _device,
+                                     VkAccelerationStructureKHR 
accelerationStructure,
+                                     const VkAllocationCallbacks *pAllocator)
+{
+   VK_FROM_HANDLE(vk_device, device, _device);
+   VK_FROM_HANDLE(vk_acceleration_structure, accel_struct, 
accelerationStructure);
+
+   if (!accel_struct)
+      return;
+
+   vk_object_free(device, pAllocator, accel_struct);
+}
+
+VKAPI_ATTR VkDeviceAddress VKAPI_CALL
+vk_common_GetAccelerationStructureDeviceAddressKHR(
+   VkDevice _device, const VkAccelerationStructureDeviceAddressInfoKHR *pInfo)
+{
+   VK_FROM_HANDLE(vk_acceleration_structure, accel_struct, 
pInfo->accelerationStructure);
+   return vk_acceleration_structure_get_va(accel_struct);
+}
diff --git a/src/vulkan/runtime/vk_acceleration_structure.h 
b/src/vulkan/runtime/vk_acceleration_structure.h
new file mode 100644
index 00000000000..bcc2eff4660
--- /dev/null
+++ b/src/vulkan/runtime/vk_acceleration_structure.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2021 Bas Nieuwenhuizen
+ * Copyright © 2023 Valve Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#ifndef VK_ACCELERATION_STRUCTURE_H
+#define VK_ACCELERATION_STRUCTURE_H
+
+#include "vk_object.h"
+
+struct vk_acceleration_structure {
+   struct vk_object_base base;
+
+   VkBuffer buffer;
+   uint64_t offset;
+   uint64_t size;
+};
+
+VkDeviceAddress vk_acceleration_structure_get_va(struct 
vk_acceleration_structure *accel_struct);
+
+VK_DEFINE_NONDISP_HANDLE_CASTS(vk_acceleration_structure, base, 
VkAccelerationStructureKHR,
+                               VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR)
+
+#endif

Reply via email to