mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 22:38:05 +02:00
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:
parent
7ad02416f6
commit
4a4251dc16
2 changed files with 12 additions and 19 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue