venus: implement VK_KHR_acceleration_structure - Part I
Implement all cmds except query updates. Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33907>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user