radv: Add BVH IR types
authorFriedrich Vock <friedrich.vock@gmx.de>
Thu, 22 Sep 2022 20:47:11 +0000 (22:47 +0200)
committerMarge Bot <emma+marge@anholt.net>
Mon, 26 Sep 2022 22:25:22 +0000 (22:25 +0000)
Reviewed-by: Konstantin Seurer <konstantin.seurer@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18769>

src/amd/vulkan/bvh/build_helpers.h
src/amd/vulkan/bvh/bvh.h

index ee4b788..eded3b0 100644 (file)
@@ -196,6 +196,13 @@ TYPE(uvec4, 16);
 
 TYPE(VOID_REF, 8);
 
+/* copied from u_math.h */
+uint32_t
+align(uint32_t value, uint32_t alignment)
+{
+   return (value + alignment - 1) & ~(alignment - 1);
+}
+
 void
 min_float_emulated(REF(int32_t) addr, float f)
 {
@@ -237,6 +244,14 @@ TYPE(radv_bvh_instance_node, 8);
 TYPE(radv_bvh_box16_node, 4);
 TYPE(radv_bvh_box32_node, 4);
 
+TYPE(radv_ir_node, 4);
+TYPE(radv_ir_box_node, 4);
+TYPE(radv_ir_triangle_node, 4);
+TYPE(radv_ir_aabb_node, 4);
+TYPE(radv_ir_instance_node, 8);
+
+#define NULL_NODE_ID 0xFFFFFFFF
+
 uint32_t
 id_to_offset(uint32_t id)
 {
@@ -255,7 +270,40 @@ pack_node_id(uint32_t offset, uint32_t type)
    return (offset >> 3) | type;
 }
 
-#define NULL_NODE_ID 0xFFFFFFFF
+uint32_t
+ir_id_to_offset(uint32_t id)
+{
+   return id & (~3u);
+}
+
+uint32_t
+ir_id_to_type(uint32_t id)
+{
+   return id & 3u;
+}
+
+uint32_t
+pack_ir_node_id(uint32_t offset, uint32_t type)
+{
+   return offset | type;
+}
+
+uint32_t
+ir_type_to_bvh_type(uint32_t type)
+{
+   switch (type) {
+   case radv_ir_node_triangle:
+      return radv_bvh_node_triangle;
+   case radv_ir_node_internal:
+      return radv_bvh_node_internal;
+   case radv_ir_node_instance:
+      return radv_bvh_node_instance;
+   case radv_ir_node_aabb:
+      return radv_bvh_node_aabb;
+   }
+   /* unreachable in valid nodes */
+   return NULL_NODE_ID;
+}
 
 AABB
 calculate_instance_node_bounds(radv_bvh_instance_node instance)
index 46305e5..2f042b6 100644 (file)
 #define radv_bvh_node_instance 6
 #define radv_bvh_node_aabb 7
 
+#define radv_ir_node_triangle 0
+#define radv_ir_node_internal 1
+#define radv_ir_node_instance 2
+#define radv_ir_node_aabb 3
+
 #ifdef VULKAN
 #define VK_UUID_SIZE 16
 #else
 #include <vulkan/vulkan.h>
+typedef struct radv_ir_node radv_ir_node;
 
 typedef struct {
    float values[3][4];
@@ -74,6 +80,41 @@ struct radv_accel_struct_header {
    uint32_t internal_node_count;
 };
 
+struct radv_ir_node {
+   float sah_cost;
+   uint32_t parent;
+   float aabb[2][3];
+};
+
+struct radv_ir_box_node {
+   radv_ir_node base;
+   uint32_t children[2];
+};
+
+struct radv_ir_aabb_node {
+   radv_ir_node base;
+   uint32_t primitive_id;
+   uint32_t geometry_id_and_flags;
+};
+
+struct radv_ir_triangle_node {
+   radv_ir_node base;
+   float coords[3][3];
+   uint32_t triangle_id;
+   uint32_t id;
+   uint32_t geometry_id_and_flags;
+};
+
+struct radv_ir_instance_node {
+   radv_ir_node base;
+   /* See radv_bvh_instance_node */
+   uint64_t base_ptr;
+   uint32_t custom_instance_and_mask;
+   uint32_t sbt_offset_and_flags;
+   mat3x4 otw_matrix;
+   uint32_t instance_id;
+};
+
 struct radv_bvh_triangle_node {
    float coords[3][3];
    uint32_t reserved[3];