Module: Mesa Branch: staging/22.3 Commit: 572f103b81cbdcffd9743afaa5a2975c7cdb4b47 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=572f103b81cbdcffd9743afaa5a2975c7cdb4b47
Author: Bas Nieuwenhuizen <[email protected]> Date: Tue Nov 29 02:28:08 2022 +0100 radv: Handle nodes with 2 invalid children in internal node converter. Fixes: 682dc5c28e4 ("radv: Add conversion shader for internal nodes") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19891> (cherry picked from commit f531f671ef64acc8ea56a473c05aeb5ea9f4c1f0) --- .pick_status.json | 2 +- src/amd/vulkan/bvh/converter_internal.comp | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index e0fb7aac5cd..957c4beba87 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -625,7 +625,7 @@ "description": "radv: Handle nodes with 2 invalid children in internal node converter.", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "682dc5c28e4e16ef66cbe996d908d0d5b5c77051" }, diff --git a/src/amd/vulkan/bvh/converter_internal.comp b/src/amd/vulkan/bvh/converter_internal.comp index 0f85f468665..2eb8427fbec 100644 --- a/src/amd/vulkan/bvh/converter_internal.comp +++ b/src/amd/vulkan/bvh/converter_internal.comp @@ -108,10 +108,10 @@ main() children[found_child_count++] = src.children[i]; while (found_child_count < 4) { - uint32_t collapsed_child_index; - float largest_surface_area = 0.0f; + int32_t collapsed_child_index = -1; + float largest_surface_area = -INFINITY; - for (uint32_t i = 0; i < found_child_count; ++i) { + for (int32_t i = 0; i < found_child_count; ++i) { if (ir_id_to_type(children[i]) != radv_ir_node_internal) continue; @@ -126,7 +126,7 @@ main() } } - if (largest_surface_area > 0.0f) { + if (collapsed_child_index != -1) { REF(radv_ir_box_node) child_node = REF(radv_ir_box_node)OFFSET(args.intermediate_bvh, ir_id_to_offset(children[collapsed_child_index])); @@ -146,6 +146,10 @@ main() if (valid_grandchild_count > 0) children[collapsed_child_index] = grandchildren[0]; + else { + found_child_count--; + children[collapsed_child_index] = children[found_child_count]; + } if (in_final_tree == FINAL_TREE_PRESENT) DEREF(child_node).in_final_tree = FINAL_TREE_NOT_PRESENT;
