radv: Deduplicate push constant structs

This patch adds a header that is shared between the accel struct build
kernels and the dispatch code.

Signed-off-by: Konstantin Seurer <konstantin.seurer@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18376>
This commit is contained in:
Konstantin Seurer 2022-09-01 21:21:19 +02:00 committed by Marge Bot
parent 69d123d88e
commit 9cbc609db3
6 changed files with 110 additions and 95 deletions

View file

@ -0,0 +1,68 @@
/*
* Copyright © 2022 Konstantin Seurer
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef BVH_BUILD_INTERFACE_H
#define BVH_BUILD_INTERFACE_H
#ifdef VULKAN
#include "build_helpers.h"
#else
#include <stdint.h>
#define REF(type) uint64_t
#define VOID_REF uint64_t
#endif
struct leaf_args {
VOID_REF bvh;
REF(AABB) bounds;
REF(key_id_pair) ids;
VOID_REF data;
VOID_REF indices;
VOID_REF transform;
uint32_t dst_offset;
uint32_t first_id;
uint32_t geometry_type;
uint32_t geometry_id;
uint32_t stride;
uint32_t vertex_format;
uint32_t index_format;
};
struct morton_args {
VOID_REF bvh;
REF(AABB) bounds;
REF(key_id_pair) ids;
};
struct internal_args {
VOID_REF bvh;
REF(key_id_pair) src_ids;
REF(key_id_pair) dst_ids;
uint32_t dst_offset;
uint32_t fill_count;
};
#endif

View file

@ -35,15 +35,11 @@
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
#include "build_helpers.h"
#include "build_interface.h"
layout(push_constant) uniform CONSTS {
VOID_REF bvh;
REF(key_id_pair) src_ids;
REF(key_id_pair) dst_ids;
uint32_t dst_offset;
uint32_t fill_count;
} args;
internal_args args;
};
void
main(void)

View file

@ -36,26 +36,11 @@
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
#include "build_helpers.h"
#include "build_interface.h"
layout(push_constant) uniform CONSTS {
VOID_REF bvh;
REF(AABB) bounds;
REF(key_id_pair) ids;
VOID_REF data;
VOID_REF indices;
VOID_REF transform;
uint32_t dst_offset;
uint32_t first_id;
uint32_t geometry_type;
uint32_t geometry_id;
uint32_t stride;
uint32_t vertex_format;
uint32_t index_format;
} args;
leaf_args args;
};
/* Just a wrapper for 3 uints. */
struct triangle_indices {

View file

@ -28,6 +28,7 @@ bvh_include_dir = meson.source_root() + '/src/amd/vulkan/bvh'
bvh_includes = files(
'build_helpers.h',
'build_interface.h',
'bvh.h',
)

View file

@ -35,13 +35,11 @@
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
#include "build_helpers.h"
#include "build_interface.h"
layout(push_constant) uniform CONSTS {
VOID_REF bvh;
REF(AABB) bounds;
REF(key_id_pair) ids;
} args;
morton_args args;
};
uint32_t
morton_component(uint32_t x)

View file

@ -29,6 +29,8 @@
#include "radix_sort/radv_radix_sort.h"
#include "bvh/build_interface.h"
static const uint32_t leaf_spv[] = {
#include "bvh/leaf.comp.spv.h"
};
@ -206,39 +208,6 @@ create_accel_build_shader(struct radv_device *device, const char *name)
return b;
}
struct leaf_constants {
uint64_t bvh_addr;
uint64_t bounds_addr;
uint64_t ids_addr;
uint64_t data_addr;
uint64_t indices_addr;
uint64_t transform_addr;
uint32_t dst_offset;
uint32_t first_id;
uint32_t geometry_type;
uint32_t geometry_id;
uint32_t stride;
uint32_t vertex_format;
uint32_t index_format;
};
struct morton_constants {
uint64_t bvh_addr;
uint64_t bounds_addr;
uint64_t ids_addr;
};
struct internal_constants {
uint64_t bvh_addr;
uint64_t src_ids_addr;
uint64_t dst_ids_addr;
uint32_t dst_offset;
uint32_t fill_count;
};
enum copy_mode {
COPY_MODE_COPY,
COPY_MODE_SERIALIZE,
@ -609,15 +578,14 @@ radv_device_init_accel_struct_build_state(struct radv_device *device)
VkResult result;
nir_shader *copy_cs = build_copy_shader(device);
result =
create_build_pipeline_spv(device, leaf_spv, sizeof(leaf_spv), sizeof(struct leaf_constants),
&device->meta_state.accel_struct_build.leaf_pipeline,
&device->meta_state.accel_struct_build.leaf_p_layout);
result = create_build_pipeline_spv(device, leaf_spv, sizeof(leaf_spv), sizeof(struct leaf_args),
&device->meta_state.accel_struct_build.leaf_pipeline,
&device->meta_state.accel_struct_build.leaf_p_layout);
if (result != VK_SUCCESS)
return result;
result = create_build_pipeline_spv(device, internal_spv, sizeof(internal_spv),
sizeof(struct internal_constants),
sizeof(struct internal_args),
&device->meta_state.accel_struct_build.internal_pipeline,
&device->meta_state.accel_struct_build.internal_p_layout);
if (result != VK_SUCCESS)
@ -630,10 +598,10 @@ radv_device_init_accel_struct_build_state(struct radv_device *device)
if (result != VK_SUCCESS)
return result;
result = create_build_pipeline_spv(device, morton_spv, sizeof(morton_spv),
sizeof(struct morton_constants),
&device->meta_state.accel_struct_build.morton_pipeline,
&device->meta_state.accel_struct_build.morton_p_layout);
result =
create_build_pipeline_spv(device, morton_spv, sizeof(morton_spv), sizeof(struct morton_args),
&device->meta_state.accel_struct_build.morton_pipeline,
&device->meta_state.accel_struct_build.morton_p_layout);
if (result != VK_SUCCESS)
return result;
@ -700,10 +668,10 @@ radv_CmdBuildAccelerationStructuresKHR(
RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct,
pInfos[i].dstAccelerationStructure);
struct leaf_constants leaf_consts = {
.bvh_addr = radv_accel_struct_get_va(accel_struct),
.bounds_addr = pInfos[i].scratchData.deviceAddress,
.ids_addr = pInfos[i].scratchData.deviceAddress + SCRATCH_TOTAL_BOUNDS_SIZE,
struct leaf_args leaf_consts = {
.bvh = radv_accel_struct_get_va(accel_struct),
.bounds = pInfos[i].scratchData.deviceAddress,
.ids = pInfos[i].scratchData.deviceAddress + SCRATCH_TOTAL_BOUNDS_SIZE,
.dst_offset =
ALIGN(sizeof(struct radv_accel_struct_header), 64) + sizeof(struct radv_bvh_box32_node),
};
@ -725,19 +693,18 @@ radv_CmdBuildAccelerationStructuresKHR(
case VK_GEOMETRY_TYPE_TRIANGLES_KHR:
assert(pInfos[i].type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR);
leaf_consts.data_addr =
geom->geometry.triangles.vertexData.deviceAddress +
buildRangeInfo->firstVertex * geom->geometry.triangles.vertexStride;
leaf_consts.indices_addr = geom->geometry.triangles.indexData.deviceAddress;
leaf_consts.data = geom->geometry.triangles.vertexData.deviceAddress +
buildRangeInfo->firstVertex * geom->geometry.triangles.vertexStride;
leaf_consts.indices = geom->geometry.triangles.indexData.deviceAddress;
if (geom->geometry.triangles.indexType == VK_INDEX_TYPE_NONE_KHR)
leaf_consts.data_addr += buildRangeInfo->primitiveOffset;
leaf_consts.data += buildRangeInfo->primitiveOffset;
else
leaf_consts.indices_addr += buildRangeInfo->primitiveOffset;
leaf_consts.indices += buildRangeInfo->primitiveOffset;
leaf_consts.transform_addr = geom->geometry.triangles.transformData.deviceAddress;
if (leaf_consts.transform_addr)
leaf_consts.transform_addr += buildRangeInfo->transformOffset;
leaf_consts.transform = geom->geometry.triangles.transformData.deviceAddress;
if (leaf_consts.transform)
leaf_consts.transform += buildRangeInfo->transformOffset;
leaf_consts.stride = geom->geometry.triangles.vertexStride;
leaf_consts.vertex_format = geom->geometry.triangles.vertexFormat;
@ -748,7 +715,7 @@ radv_CmdBuildAccelerationStructuresKHR(
case VK_GEOMETRY_TYPE_AABBS_KHR:
assert(pInfos[i].type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR);
leaf_consts.data_addr =
leaf_consts.data =
geom->geometry.aabbs.data.deviceAddress + buildRangeInfo->primitiveOffset;
leaf_consts.stride = geom->geometry.aabbs.stride;
@ -757,7 +724,7 @@ radv_CmdBuildAccelerationStructuresKHR(
case VK_GEOMETRY_TYPE_INSTANCES_KHR:
assert(pInfos[i].type == VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR);
leaf_consts.data_addr =
leaf_consts.data =
geom->geometry.instances.data.deviceAddress + buildRangeInfo->primitiveOffset;
if (geom->geometry.instances.arrayOfPointers)
@ -793,10 +760,10 @@ radv_CmdBuildAccelerationStructuresKHR(
RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct,
pInfos[i].dstAccelerationStructure);
const struct morton_constants consts = {
.bvh_addr = radv_accel_struct_get_va(accel_struct),
.bounds_addr = pInfos[i].scratchData.deviceAddress,
.ids_addr = pInfos[i].scratchData.deviceAddress + SCRATCH_TOTAL_BOUNDS_SIZE,
const struct morton_args consts = {
.bvh = radv_accel_struct_get_va(accel_struct),
.bounds = pInfos[i].scratchData.deviceAddress,
.ids = pInfos[i].scratchData.deviceAddress + SCRATCH_TOTAL_BOUNDS_SIZE,
};
radv_CmdPushConstants(commandBuffer,
@ -878,10 +845,10 @@ radv_CmdBuildAccelerationStructuresKHR(
if (final_iter)
dst_node_offset = ALIGN(sizeof(struct radv_accel_struct_header), 64);
const struct internal_constants consts = {
.bvh_addr = radv_accel_struct_get_va(accel_struct),
.src_ids_addr = pInfos[i].scratchData.deviceAddress + src_scratch_offset,
.dst_ids_addr = pInfos[i].scratchData.deviceAddress + dst_scratch_offset,
const struct internal_args consts = {
.bvh = radv_accel_struct_get_va(accel_struct),
.src_ids = pInfos[i].scratchData.deviceAddress + src_scratch_offset,
.dst_ids = pInfos[i].scratchData.deviceAddress + dst_scratch_offset,
.dst_offset = dst_node_offset,
.fill_count = bvh_states[i].node_count | (final_iter ? 0x80000000U : 0),
};