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;

Reply via email to