diff --git a/src/virtio/vulkan/vn_acceleration_structure.c b/src/virtio/vulkan/vn_acceleration_structure.c index 7dd1a25f06d..c1db183dee0 100644 --- a/src/virtio/vulkan/vn_acceleration_structure.c +++ b/src/virtio/vulkan/vn_acceleration_structure.c @@ -5,8 +5,100 @@ #include "vn_acceleration_structure.h" +#include "venus-protocol/vn_protocol_driver_acceleration_structure.h" + #include "vn_device.h" +VkResult +vn_CreateAccelerationStructureKHR( + VkDevice device, + const VkAccelerationStructureCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkAccelerationStructureKHR *pAccelerationStructure) +{ + struct vn_device *dev = vn_device_from_handle(device); + const VkAllocationCallbacks *alloc = + pAllocator ? pAllocator : &dev->base.base.alloc; + + struct vn_acceleration_structure *accel = + vk_zalloc(alloc, sizeof(*accel), VN_DEFAULT_ALIGN, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!accel) + return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY); + + vn_object_base_init(&accel->base, + VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR, &dev->base); + + VkAccelerationStructureKHR accel_handle = + vn_acceleration_structure_to_handle(accel); + vn_async_vkCreateAccelerationStructureKHR( + dev->primary_ring, device, pCreateInfo, NULL, &accel_handle); + + *pAccelerationStructure = accel_handle; + + return VK_SUCCESS; +} + +void +vn_DestroyAccelerationStructureKHR( + VkDevice device, + VkAccelerationStructureKHR accelerationStructure, + const VkAllocationCallbacks *pAllocator) +{ + struct vn_device *dev = vn_device_from_handle(device); + struct vn_acceleration_structure *accel = + vn_acceleration_structure_from_handle(accelerationStructure); + const VkAllocationCallbacks *alloc = + pAllocator ? pAllocator : &dev->base.base.alloc; + + if (!accel) + return; + + vn_async_vkDestroyAccelerationStructureKHR(dev->primary_ring, device, + accelerationStructure, NULL); + + vn_object_base_fini(&accel->base); + vk_free(alloc, accel); +} + +void +vn_GetAccelerationStructureBuildSizesKHR( + VkDevice device, + VkAccelerationStructureBuildTypeKHR buildType, + const VkAccelerationStructureBuildGeometryInfoKHR *pBuildInfo, + const uint32_t *pMaxPrimitiveCounts, + VkAccelerationStructureBuildSizesInfoKHR *pSizeInfo) +{ + struct vn_device *dev = vn_device_from_handle(device); + + vn_call_vkGetAccelerationStructureBuildSizesKHR( + dev->primary_ring, device, buildType, pBuildInfo, pMaxPrimitiveCounts, + pSizeInfo); +} + +VkDeviceAddress +vn_GetAccelerationStructureDeviceAddressKHR( + VkDevice device, const VkAccelerationStructureDeviceAddressInfoKHR *pInfo) +{ + struct vn_device *dev = vn_device_from_handle(device); + + return vn_call_vkGetAccelerationStructureDeviceAddressKHR( + dev->primary_ring, device, pInfo); +} + +void +vn_GetDeviceAccelerationStructureCompatibilityKHR( + VkDevice device, + const VkAccelerationStructureVersionInfoKHR *pVersionInfo, + VkAccelerationStructureCompatibilityKHR *pCompatibility) +{ + struct vn_device *dev = vn_device_from_handle(device); + + /* TODO per device cache */ + vn_call_vkGetDeviceAccelerationStructureCompatibilityKHR( + dev->primary_ring, device, pVersionInfo, pCompatibility); +} + VkResult vn_BuildAccelerationStructuresKHR( VkDevice device, diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 57a51e315b1..9530ceac211 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -2666,3 +2666,54 @@ vn_CmdSetRenderingInputAttachmentIndices( VN_CMD_ENQUEUE(vkCmdSetRenderingInputAttachmentIndices, commandBuffer, pInputAttachmentIndexInfo); } + +void +vn_CmdBuildAccelerationStructuresIndirectKHR( + VkCommandBuffer commandBuffer, + uint32_t infoCount, + const VkAccelerationStructureBuildGeometryInfoKHR *pInfos, + const VkDeviceAddress *pIndirectDeviceAddresses, + const uint32_t *pIndirectStrides, + const uint32_t *const *ppMaxPrimitiveCounts) +{ + VN_CMD_ENQUEUE(vkCmdBuildAccelerationStructuresIndirectKHR, commandBuffer, + infoCount, pInfos, pIndirectDeviceAddresses, + pIndirectStrides, ppMaxPrimitiveCounts); +} + +void +vn_CmdBuildAccelerationStructuresKHR( + VkCommandBuffer commandBuffer, + uint32_t infoCount, + const VkAccelerationStructureBuildGeometryInfoKHR *pInfos, + const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) +{ + VN_CMD_ENQUEUE(vkCmdBuildAccelerationStructuresKHR, commandBuffer, + infoCount, pInfos, ppBuildRangeInfos); +} + +void +vn_CmdCopyAccelerationStructureKHR( + VkCommandBuffer commandBuffer, + const VkCopyAccelerationStructureInfoKHR *pInfo) +{ + VN_CMD_ENQUEUE(vkCmdCopyAccelerationStructureKHR, commandBuffer, pInfo); +} + +void +vn_CmdCopyAccelerationStructureToMemoryKHR( + VkCommandBuffer commandBuffer, + const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo) +{ + VN_CMD_ENQUEUE(vkCmdCopyAccelerationStructureToMemoryKHR, commandBuffer, + pInfo); +} + +void +vn_CmdCopyMemoryToAccelerationStructureKHR( + VkCommandBuffer commandBuffer, + const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo) +{ + VN_CMD_ENQUEUE(vkCmdCopyMemoryToAccelerationStructureKHR, commandBuffer, + pInfo); +}