From eb33a1adb048b05c1692f8018fdcd058996a1c06 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Wed, 1 Feb 2023 10:59:46 +0100 Subject: [PATCH] vulkan: Add vk_acceleration_structure Reviewed-by: Samuel Pitoiset Reviewed-by: Lionel Landwerlin Part-of: --- src/vulkan/runtime/meson.build | 2 + .../runtime/vk_acceleration_structure.c | 94 +++++++++++++++++++ .../runtime/vk_acceleration_structure.h | 43 +++++++++ 3 files changed, 139 insertions(+) create mode 100644 src/vulkan/runtime/vk_acceleration_structure.c create mode 100644 src/vulkan/runtime/vk_acceleration_structure.h 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