From 07c1b23022133e9ba5b226a6479b44af75fa33a1 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Fri, 20 Jan 2023 19:29:05 +0100 Subject: [PATCH] radv/bvh: Implement compact encoding Part-of: --- src/amd/vulkan/bvh/bvh.h | 1 + src/amd/vulkan/bvh/encode.comp | 4 ++++ src/amd/vulkan/bvh/meson.build | 7 ++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/bvh/bvh.h b/src/amd/vulkan/bvh/bvh.h index 0778db2..56fe378 100644 --- a/src/amd/vulkan/bvh/bvh.h +++ b/src/amd/vulkan/bvh/bvh.h @@ -165,6 +165,7 @@ struct radv_ir_header { uint32_t dispatch_size_y; uint32_t dispatch_size_z; radv_global_sync_data sync_data; + uint32_t dst_node_offset; }; struct radv_bvh_triangle_node { diff --git a/src/amd/vulkan/bvh/encode.comp b/src/amd/vulkan/bvh/encode.comp index 8145c86..609c9c1 100644 --- a/src/amd/vulkan/bvh/encode.comp +++ b/src/amd/vulkan/bvh/encode.comp @@ -233,9 +233,13 @@ main() uint32_t dst_offset; if (type == radv_ir_node_internal) { +#if COMPACT + dst_offset = atomicAdd(DEREF(args.header).dst_node_offset, SIZEOF(radv_bvh_box32_node)); +#else uint32_t offset_in_internal_nodes = offset - intermediate_leaf_nodes_size; uint32_t child_index = offset_in_internal_nodes / SIZEOF(radv_ir_box_node); dst_offset = dst_internal_offset + child_index * SIZEOF(radv_bvh_box32_node); +#endif REF(radv_ir_box_node) child_node = REF(radv_ir_box_node)OFFSET(args.intermediate_bvh, offset); DEREF(child_node).bvh_offset = dst_offset; diff --git a/src/amd/vulkan/bvh/meson.build b/src/amd/vulkan/bvh/meson.build index bcd8bb6..ba5a757 100644 --- a/src/amd/vulkan/bvh/meson.build +++ b/src/amd/vulkan/bvh/meson.build @@ -28,7 +28,12 @@ bvh_shaders = [ [ 'encode.comp', 'encode', - [], + ['COMPACT=0'], + ], + [ + 'encode.comp', + 'encode_compact', + ['COMPACT=1'], ], [ 'lbvh_generate_ir.comp', -- 2.7.4