diff --git a/src/amd/vulkan/layers/radv_rra_layer.c b/src/amd/vulkan/layers/radv_rra_layer.c index 3a2be9d1a9f..53a27f31ee5 100644 --- a/src/amd/vulkan/layers/radv_rra_layer.c +++ b/src/amd/vulkan/layers/radv_rra_layer.c @@ -236,7 +236,7 @@ handle_accel_struct_write(VkCommandBuffer commandBuffer, VkAccelerationStructure VkCopyBufferInfo2 copyInfo = { .sType = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2, - .srcBuffer = accel_struct->buffer, + .srcBuffer = vk_buffer_to_handle(accel_struct->buffer), .dstBuffer = data->buffer->buffer, .regionCount = 1, .pRegions = ®ion, diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c index b171b102c7a..8553148619d 100644 --- a/src/amd/vulkan/radv_acceleration_structure.c +++ b/src/amd/vulkan/radv_acceleration_structure.c @@ -532,7 +532,8 @@ radv_init_header(VkCommandBuffer commandBuffer, const VkAccelerationStructureBui geometry_infos[i].primitive_count = build_range_infos[i].primitiveCount; } - radv_CmdUpdateBuffer(commandBuffer, dst->buffer, dst->offset + layout.geometry_info_offset, geometry_infos_size, + radv_CmdUpdateBuffer(commandBuffer, vk_buffer_to_handle(dst->buffer), + dst->offset + layout.geometry_info_offset, geometry_infos_size, geometry_infos); free(geometry_infos); @@ -815,7 +816,7 @@ radv_CmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer, const VkCopy cmd_buffer->state.flush_bits |= radv_dst_access_flush(cmd_buffer, VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT, VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT, 0, NULL, NULL); - radv_CmdDispatchIndirect(commandBuffer, src->buffer, + radv_CmdDispatchIndirect(commandBuffer, vk_buffer_to_handle(src->buffer), src->offset + offsetof(struct radv_accel_struct_header, copy_dispatch_size)); radv_meta_restore(&saved_state, cmd_buffer); @@ -904,7 +905,7 @@ radv_CmdCopyAccelerationStructureToMemoryKHR(VkCommandBuffer commandBuffer, cmd_buffer->state.flush_bits |= radv_dst_access_flush(cmd_buffer, VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT, VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT, 0, NULL, NULL); - radv_CmdDispatchIndirect(commandBuffer, src->buffer, + radv_CmdDispatchIndirect(commandBuffer, vk_buffer_to_handle(src->buffer), src->offset + offsetof(struct radv_accel_struct_header, copy_dispatch_size)); radv_meta_restore(&saved_state, cmd_buffer); diff --git a/src/amd/vulkan/radv_rra.c b/src/amd/vulkan/radv_rra.c index 0de6f17ee33..26bcfcd89a1 100644 --- a/src/amd/vulkan/radv_rra.c +++ b/src/amd/vulkan/radv_rra.c @@ -1182,7 +1182,7 @@ rra_map_accel_struct_data(struct rra_copy_context *ctx, uint32_t i) VkCopyBufferInfo2 copy_info = { .sType = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2, - .srcBuffer = accel_struct->buffer, + .srcBuffer = vk_buffer_to_handle(accel_struct->buffer), .dstBuffer = ctx->buffer, .regionCount = 1, .pRegions = ©, diff --git a/src/freedreno/vulkan/tu_acceleration_structure.cc b/src/freedreno/vulkan/tu_acceleration_structure.cc index e417a4a7856..644a31d9c57 100644 --- a/src/freedreno/vulkan/tu_acceleration_structure.cc +++ b/src/freedreno/vulkan/tu_acceleration_structure.cc @@ -123,7 +123,7 @@ get_bvh_layout(VkGeometryTypeKHR geometry_type, uint32_t internal_count = MAX2(leaf_count, 2) - 1; uint64_t offset = sizeof(struct tu_accel_struct_header); - + /* Instance descriptors, one per instance. */ if (geometry_type == VK_GEOMETRY_TYPE_INSTANCES_KHR) { offset += leaf_count * sizeof(struct tu_instance_descriptor); @@ -491,7 +491,7 @@ tu_CmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer, const VkCopyAc &consts); TU_CALLX(cmd->device, tu_CmdDispatchIndirect)( - commandBuffer, src->buffer, + commandBuffer, vk_buffer_to_handle(src->buffer), src->offset + offsetof(struct tu_accel_struct_header, copy_dispatch_size)); tu_restore_compute_state(cmd, &state); @@ -567,7 +567,7 @@ tu_CmdCopyAccelerationStructureToMemoryKHR(VkCommandBuffer commandBuffer, &consts); TU_CALLX(cmd->device, tu_CmdDispatchIndirect)( - commandBuffer, src->buffer, + commandBuffer, vk_buffer_to_handle(src->buffer), src->offset + offsetof(struct tu_accel_struct_header, copy_dispatch_size)); tu_restore_compute_state(cmd, &state); @@ -708,11 +708,11 @@ dump_internal(struct tu_internal_node *node, uint32_t *max_child) static void dump_as(struct vk_acceleration_structure *as) { - VK_FROM_HANDLE(tu_buffer, buf, as->buffer); + VK_FROM_HANDLE(tu_buffer, buf, vk_buffer_to_handle(as->buffer)); struct tu_accel_struct_header *hdr = (struct tu_accel_struct_header *)((char *)buf->bo->map + as->offset); - + fprintf(stderr, "dumping AS at %" PRIx64 "\n", vk_buffer_address(&buf->vk, as->offset)); u_hexdump(stderr, (uint8_t *)hdr, sizeof(*hdr), false); @@ -742,7 +742,7 @@ dump_as(struct vk_acceleration_structure *as) static bool as_finished(struct tu_device *dev, struct vk_acceleration_structure *as) { - VK_FROM_HANDLE(tu_buffer, buf, as->buffer); + VK_FROM_HANDLE(tu_buffer, buf, vk_buffer_to_handle(as->buffer)); tu_bo_map(dev, buf->bo, NULL); struct tu_accel_struct_header *hdr = diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index db23dfb5485..ad80f4f3763 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -4446,9 +4446,12 @@ handle_copy_acceleration_structure(struct vk_cmd_queue_entry *cmd, struct render struct pipe_box box = { 0 }; u_box_1d(src->offset, MIN2(src->size, dst->size), &box); - state->pctx->resource_copy_region(state->pctx, lvp_buffer_from_handle(dst->buffer)->bo, 0, + state->pctx->resource_copy_region(state->pctx, + lvp_buffer_from_handle( + vk_buffer_to_handle(dst->buffer))->bo, 0, dst->offset, 0, 0, - lvp_buffer_from_handle(src->buffer)->bo, 0, &box); + lvp_buffer_from_handle( + vk_buffer_to_handle(src->buffer))->bo, 0, &box); } static void diff --git a/src/intel/vulkan/genX_acceleration_structure.c b/src/intel/vulkan/genX_acceleration_structure.c index 6255246b45c..8cd28686a7e 100644 --- a/src/intel/vulkan/genX_acceleration_structure.c +++ b/src/intel/vulkan/genX_acceleration_structure.c @@ -757,7 +757,7 @@ genX(CmdCopyAccelerationStructureKHR)( } anv_genX(cmd_buffer->device->info, CmdDispatchIndirect)( - commandBuffer, src->buffer, + commandBuffer, vk_buffer_to_handle(src->buffer), src->offset + offsetof(struct anv_accel_struct_header, copy_dispatch_size)); @@ -828,7 +828,7 @@ genX(CmdCopyAccelerationStructureToMemoryKHR)( } anv_genX(device->info, CmdDispatchIndirect)( - commandBuffer, src->buffer, + commandBuffer, vk_buffer_to_handle(src->buffer), src->offset + offsetof(struct anv_accel_struct_header, copy_dispatch_size)); diff --git a/src/vulkan/runtime/vk_acceleration_structure.c b/src/vulkan/runtime/vk_acceleration_structure.c index 2533f47887d..4ba84347148 100644 --- a/src/vulkan/runtime/vk_acceleration_structure.c +++ b/src/vulkan/runtime/vk_acceleration_structure.c @@ -63,21 +63,6 @@ static const uint32_t ploc_spv[] = { #include "bvh/ploc_internal.spv.h" }; -VkDeviceAddress -vk_acceleration_structure_get_va(const 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, @@ -85,6 +70,7 @@ vk_common_CreateAccelerationStructureKHR(VkDevice _device, VkAccelerationStructureKHR *pAccelerationStructure) { VK_FROM_HANDLE(vk_device, device, _device); + VK_FROM_HANDLE(vk_buffer, buffer, pCreateInfo->buffer); struct vk_acceleration_structure *accel_struct = vk_object_alloc( device, pAllocator, sizeof(struct vk_acceleration_structure), @@ -93,7 +79,7 @@ vk_common_CreateAccelerationStructureKHR(VkDevice _device, if (!accel_struct) return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - accel_struct->buffer = pCreateInfo->buffer; + accel_struct->buffer = buffer; accel_struct->offset = pCreateInfo->offset; accel_struct->size = pCreateInfo->size; @@ -1376,4 +1362,3 @@ vk_common_CopyAccelerationStructureToMemoryKHR(VkDevice _device, unreachable("Unimplemented"); return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT); } - diff --git a/src/vulkan/runtime/vk_acceleration_structure.h b/src/vulkan/runtime/vk_acceleration_structure.h index 93ac8ea4b27..c14cd6ee3b5 100644 --- a/src/vulkan/runtime/vk_acceleration_structure.h +++ b/src/vulkan/runtime/vk_acceleration_structure.h @@ -25,6 +25,7 @@ #ifndef VK_ACCELERATION_STRUCTURE_H #define VK_ACCELERATION_STRUCTURE_H +#include "vk_buffer.h" #include "vk_object.h" #include "radix_sort/radix_sort_vk.h" @@ -47,12 +48,18 @@ enum vk_acceleration_structure_build_step { struct vk_acceleration_structure { struct vk_object_base base; - VkBuffer buffer; + struct vk_buffer *buffer; + uint64_t offset; uint64_t size; }; -VkDeviceAddress vk_acceleration_structure_get_va(const struct vk_acceleration_structure *accel_struct); +static inline VkDeviceAddress +vk_acceleration_structure_get_va(const struct vk_acceleration_structure *accel_struct) +{ + assert(accel_struct->buffer != NULL); + return vk_buffer_address(accel_struct->buffer, accel_struct->offset); +} VK_DEFINE_NONDISP_HANDLE_CASTS(vk_acceleration_structure, base, VkAccelerationStructureKHR, VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR)