vulkan/runtime: rely on vk_buffer::device_address

With all the RT-enabled driver setting this field, we can now have the
runtime use it instead of calling into the driver's vfunc.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34026>
This commit is contained in:
Lionel Landwerlin 2025-03-12 15:23:48 +02:00 committed by Marge Bot
parent cbb0211c1e
commit 602843a881
8 changed files with 30 additions and 34 deletions

View file

@ -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 = &region,

View file

@ -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);

View file

@ -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 = &copy,

View file

@ -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 =

View file

@ -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

View file

@ -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));

View file

@ -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);
}

View file

@ -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)