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)
{
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)
{
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)
#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];
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];