Mesa (main): radv: Add CPU serialization of acceleration structures.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Oct 1 14:13:37 UTC 2021
Module: Mesa
Branch: main
Commit: 5a45e2e04de317b3ea513d1031a01ec6f5186321
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5a45e2e04de317b3ea513d1031a01ec6f5186321
Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date: Fri Sep 10 00:59:04 2021 +0200
radv: Add CPU serialization of acceleration structures.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12840>
---
src/amd/vulkan/radv_acceleration_structure.c | 83 ++++++++++++++++++++++++++++
1 file changed, 83 insertions(+)
diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c
index 853740f33fc..0c2db936191 100644
--- a/src/amd/vulkan/radv_acceleration_structure.c
+++ b/src/amd/vulkan/radv_acceleration_structure.c
@@ -1951,3 +1951,86 @@ radv_CmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
src_addr + offsetof(struct radv_accel_struct_header, copy_dispatch_size));
radv_meta_restore(&saved_state, cmd_buffer);
}
+
+void
+radv_GetDeviceAccelerationStructureCompatibilityKHR(
+ VkDevice _device, const VkAccelerationStructureVersionInfoKHR *pVersionInfo,
+ VkAccelerationStructureCompatibilityKHR *pCompatibility)
+{
+ RADV_FROM_HANDLE(radv_device, device, _device);
+ uint8_t zero[VK_UUID_SIZE] = {
+ 0,
+ };
+ bool compat =
+ memcmp(pVersionInfo->pVersionData, device->physical_device->driver_uuid, VK_UUID_SIZE) == 0 &&
+ memcmp(pVersionInfo->pVersionData + VK_UUID_SIZE, zero, VK_UUID_SIZE) == 0;
+ *pCompatibility = compat ? VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR
+ : VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR;
+}
+
+VkResult
+radv_CopyMemoryToAccelerationStructureKHR(VkDevice _device,
+ VkDeferredOperationKHR deferredOperation,
+ const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo)
+{
+ RADV_FROM_HANDLE(radv_device, device, _device);
+ RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct, pInfo->dst);
+
+ char *base = device->ws->buffer_map(accel_struct->bo);
+ if (!base)
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+
+ base += accel_struct->mem_offset;
+ const struct radv_accel_struct_header *header = (const struct radv_accel_struct_header *)base;
+
+ const char *src = pInfo->src.hostAddress;
+ struct radv_accel_struct_serialization_header *src_header = (void *)src;
+ src += sizeof(*src_header) + sizeof(uint64_t) * src_header->instance_count;
+
+ memcpy(base, src, src_header->compacted_size);
+
+ for (unsigned i = 0; i < src_header->instance_count; ++i) {
+ uint64_t *p = (uint64_t *)(base + i * 128 + header->instance_offset);
+ *p = (*p & 63) | src_header->instances[i];
+ }
+
+ device->ws->buffer_unmap(accel_struct->bo);
+ return VK_SUCCESS;
+}
+
+VkResult
+radv_CopyAccelerationStructureToMemoryKHR(VkDevice _device,
+ VkDeferredOperationKHR deferredOperation,
+ const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo)
+{
+ RADV_FROM_HANDLE(radv_device, device, _device);
+ RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct, pInfo->src);
+
+ const char *base = device->ws->buffer_map(accel_struct->bo);
+ if (!base)
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+
+ base += accel_struct->mem_offset;
+ const struct radv_accel_struct_header *header = (const struct radv_accel_struct_header *)base;
+
+ char *dst = pInfo->dst.hostAddress;
+ struct radv_accel_struct_serialization_header *dst_header = (void *)dst;
+ dst += sizeof(*dst_header) + sizeof(uint64_t) * header->instance_count;
+
+ memcpy(dst_header->driver_uuid, device->physical_device->driver_uuid, VK_UUID_SIZE);
+ memset(dst_header->accel_struct_compat, 0, VK_UUID_SIZE);
+
+ dst_header->serialization_size = header->serialization_size;
+ dst_header->compacted_size = header->compacted_size;
+ dst_header->instance_count = header->instance_count;
+
+ memcpy(dst, base, header->compacted_size);
+
+ for (unsigned i = 0; i < header->instance_count; ++i) {
+ dst_header->instances[i] =
+ *(const uint64_t *)(base + i * 128 + header->instance_offset) & ~63ull;
+ }
+
+ device->ws->buffer_unmap(accel_struct->bo);
+ return VK_SUCCESS;
+}
More information about the mesa-commit
mailing list