diff --git a/src/amd/vulkan/bvh/build_helpers.h b/src/amd/vulkan/bvh/build_helpers.h index ee4b788138f..eded3b0da08 100644 --- a/src/amd/vulkan/bvh/build_helpers.h +++ b/src/amd/vulkan/bvh/build_helpers.h @@ -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) diff --git a/src/amd/vulkan/bvh/bvh.h b/src/amd/vulkan/bvh/bvh.h index 46305e587a7..2f042b69916 100644 --- a/src/amd/vulkan/bvh/bvh.h +++ b/src/amd/vulkan/bvh/bvh.h @@ -29,10 +29,16 @@ #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 +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];