Module: Mesa
Branch: main
Commit: 8fca54a754e8489402c6942877f466172a2a9caf
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=8fca54a754e8489402c6942877f466172a2a9caf

Author: Konstantin Seurer <[email protected]>
Date:   Sat Dec 16 17:05:44 2023 +0100

radv: Add more offsets acceleration_structure_layout

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26725>

---

 src/amd/vulkan/radv_acceleration_structure.c | 29 ++++++++++++----------------
 1 file changed, 12 insertions(+), 17 deletions(-)

diff --git a/src/amd/vulkan/radv_acceleration_structure.c 
b/src/amd/vulkan/radv_acceleration_structure.c
index 70b967d7e5b..d37c552fe89 100644
--- a/src/amd/vulkan/radv_acceleration_structure.c
+++ b/src/amd/vulkan/radv_acceleration_structure.c
@@ -94,6 +94,8 @@ struct build_config {
 struct acceleration_structure_layout {
    uint32_t geometry_info_offset;
    uint32_t bvh_offset;
+   uint32_t leaf_nodes_offset;
+   uint32_t internal_nodes_offset;
    uint32_t size;
 };
 
@@ -190,7 +192,15 @@ get_build_layout(struct radv_device *device, uint32_t 
leaf_count,
       offset = ALIGN(offset, 64);
       accel_struct->bvh_offset = offset;
 
-      offset += bvh_size;
+      /* root node */
+      offset += sizeof(struct radv_bvh_box32_node);
+
+      accel_struct->leaf_nodes_offset = offset;
+      offset += bvh_leaf_size * leaf_count;
+
+      accel_struct->internal_nodes_offset = offset;
+      /* Factor out the root node. */
+      offset += sizeof(struct radv_bvh_box32_node) * (internal_count - 1);
 
       accel_struct->size = offset;
    }
@@ -1054,22 +1064,7 @@ encode_nodes(VkCommandBuffer commandBuffer, uint32_t 
infoCount,
             pInfos[i].pGeometries ? pInfos[i].pGeometries[0].geometryType : 
pInfos[i].ppGeometries[0]->geometryType;
 
       if (bvh_states[i].config.compact) {
-         uint32_t leaf_node_size = 0;
-         switch (geometry_type) {
-         case VK_GEOMETRY_TYPE_TRIANGLES_KHR:
-            leaf_node_size = sizeof(struct radv_bvh_triangle_node);
-            break;
-         case VK_GEOMETRY_TYPE_AABBS_KHR:
-            leaf_node_size = sizeof(struct radv_bvh_aabb_node);
-            break;
-         case VK_GEOMETRY_TYPE_INSTANCES_KHR:
-            leaf_node_size = sizeof(struct radv_bvh_instance_node);
-            break;
-         default:
-            unreachable("");
-         }
-
-         uint32_t dst_offset = sizeof(struct radv_bvh_box32_node) + 
bvh_states[i].leaf_node_count * leaf_node_size;
+         uint32_t dst_offset = 
bvh_states[i].accel_struct.internal_nodes_offset - 
bvh_states[i].accel_struct.bvh_offset;
          radv_update_buffer_cp(cmd_buffer,
                                pInfos[i].scratchData.deviceAddress + 
bvh_states[i].scratch.header_offset +
                                   offsetof(struct radv_ir_header, 
dst_node_offset),

Reply via email to