mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 02:10:11 +01:00
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:
parent
cbb0211c1e
commit
602843a881
8 changed files with 30 additions and 34 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 = ©,
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue