radv/bvh: Use a fixed indices midpoint on GFX12

This saves a couple of loads inside the update shader.

Reviewed-by: Natalie Vock <natalie.vock@gmx.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35445>
This commit is contained in:
Konstantin Seurer 2025-06-05 08:32:36 +02:00 committed by Marge Bot
parent 7ad02416f6
commit 4a4251dc16
2 changed files with 12 additions and 19 deletions

View file

@ -131,6 +131,8 @@ bit_writer_finish(inout bit_writer writer)
writer.total_count = 0;
}
#define RADV_GFX12_UPDATABLE_PRIMITIVE_NODE_INDICES_OFFSET (align(RADV_GFX12_PRIMITIVE_NODE_HEADER_SIZE, 32) / 8 + 9 * 4)
void
radv_encode_triangle_gfx12(VOID_REF dst, vk_ir_triangle_node src)
{
@ -147,8 +149,7 @@ radv_encode_triangle_gfx12(VOID_REF dst, vk_ir_triangle_node src)
bit_writer_write(child_writer, 0, 1); /* vertex_type */
bit_writer_write(child_writer, 28, 5); /* primitive_index_base_bits */
bit_writer_write(child_writer, 28, 5); /* primitive_index_bits */
/* header + 9 floats + geometry_id */
bit_writer_write(child_writer, RADV_GFX12_PRIMITIVE_NODE_HEADER_SIZE + 9 * 32 + 28, 10);
bit_writer_write(child_writer, RADV_GFX12_UPDATABLE_PRIMITIVE_NODE_INDICES_OFFSET * 8 + 32, 10);
bit_writer_write(child_writer, floatBitsToUint(src.coords[0][0]), 32);
bit_writer_write(child_writer, floatBitsToUint(src.coords[0][1]), 32);
@ -160,6 +161,8 @@ radv_encode_triangle_gfx12(VOID_REF dst, vk_ir_triangle_node src)
bit_writer_write(child_writer, floatBitsToUint(src.coords[2][1]), 32);
bit_writer_write(child_writer, floatBitsToUint(src.coords[2][2]), 32);
bit_writer_write(child_writer, 0, 64 - RADV_GFX12_PRIMITIVE_NODE_HEADER_SIZE + 4);
bit_writer_write(child_writer, src.geometry_id_and_flags & 0xfffffff, 28);
bit_writer_write(child_writer, src.triangle_id, 28);
@ -198,8 +201,7 @@ radv_encode_aabb_gfx12(VOID_REF dst, vk_ir_aabb_node src)
bit_writer_write(child_writer, 0, 1); /* vertex_type */
bit_writer_write(child_writer, 28, 5); /* primitive_index_base_bits */
bit_writer_write(child_writer, 28, 5); /* primitive_index_bits */
/* header + 6 floats + geometry_id */
bit_writer_write(child_writer, RADV_GFX12_PRIMITIVE_NODE_HEADER_SIZE + 6 * 32 + 28, 10);
bit_writer_write(child_writer, RADV_GFX12_UPDATABLE_PRIMITIVE_NODE_INDICES_OFFSET * 8 + 32, 10);
bit_writer_write(child_writer, floatBitsToUint(src.base.aabb.min.x), 32);
bit_writer_write(child_writer, floatBitsToUint(src.base.aabb.min.y), 32);
@ -208,6 +210,8 @@ radv_encode_aabb_gfx12(VOID_REF dst, vk_ir_aabb_node src)
bit_writer_write(child_writer, floatBitsToUint(src.base.aabb.max.y), 32);
bit_writer_write(child_writer, floatBitsToUint(src.base.aabb.max.z), 32);
bit_writer_skip_to(child_writer, RADV_GFX12_UPDATABLE_PRIMITIVE_NODE_INDICES_OFFSET * 8 + 4);
bit_writer_write(child_writer, src.geometry_id_and_flags & 0xfffffff, 28);
bit_writer_write(child_writer, src.primitive_id, 28);

View file

@ -33,18 +33,6 @@ layout(push_constant) uniform CONSTS
update_gfx12_args args;
};
uint32_t
read_bits(VOID_REF data, uint32_t start, uint32_t count)
{
uint32_t shift = start % 32;
uint32_t lower = DEREF(INDEX(uint32_t, data, start / 32)) >> shift;
uint32_t upper = 0;
if (shift != 0 && shift + count > 32)
upper = DEREF(INDEX(uint32_t, data, start / 32 + 1)) << (32 - shift);
uint32_t total = lower | upper;
return count != 32 ? total & ((1u << count) - 1u) : total;
}
void
main()
{
@ -109,9 +97,10 @@ main()
if (is_leaf) {
VOID_REF src_leaf_node = OFFSET(src_bvh, child_offset);
uint32_t indices_midpoint = read_bits(src_leaf_node, 42, 10);
uint32_t geometry_index = read_bits(src_leaf_node, indices_midpoint - 28, 28);
uint32_t primitive_index = read_bits(src_leaf_node, indices_midpoint, 28);
uint32_t geometry_index =
DEREF(REF(uint32_t)(src_leaf_node + RADV_GFX12_UPDATABLE_PRIMITIVE_NODE_INDICES_OFFSET)) >> 4;
uint32_t primitive_index =
DEREF(REF(uint32_t)(src_leaf_node + RADV_GFX12_UPDATABLE_PRIMITIVE_NODE_INDICES_OFFSET + 4)) & 0xfffffff;
vk_bvh_geometry_data geom_data = DEREF(INDEX(vk_bvh_geometry_data, args.geom_data, geometry_index));