1 /* 2 * Copyright © 2021 Bas Nieuwenhuizen 3 * 4 * SPDX-License-Identifier: MIT 5 */ 6 7 #ifndef BVH_BVH_H 8 #define BVH_BVH_H 9 10 #include "vk_bvh.h" 11 12 #define radv_bvh_node_triangle 0 13 #define radv_bvh_node_box16 4 14 #define radv_bvh_node_box32 5 15 #define radv_bvh_node_instance 6 16 #define radv_bvh_node_aabb 7 17 18 #define RADV_GEOMETRY_OPAQUE (1u << 31) 19 20 #define RADV_INSTANCE_FORCE_OPAQUE (1u << 31) 21 #define RADV_INSTANCE_NO_FORCE_NOT_OPAQUE (1u << 30) 22 #define RADV_INSTANCE_TRIANGLE_FACING_CULL_DISABLE (1u << 29) 23 #define RADV_INSTANCE_TRIANGLE_FLIP_FACING (1u << 28) 24 25 #ifdef VULKAN 26 #define VK_UUID_SIZE 16 27 #else 28 #include <vulkan/vulkan.h> 29 typedef uint16_t float16_t; 30 #endif 31 32 struct radv_accel_struct_serialization_header { 33 uint8_t driver_uuid[VK_UUID_SIZE]; 34 uint8_t accel_struct_compat[VK_UUID_SIZE]; 35 uint64_t serialization_size; 36 uint64_t compacted_size; 37 uint64_t instance_count; 38 #ifndef VULKAN 39 uint64_t instances[]; 40 #endif 41 }; 42 43 struct radv_accel_struct_geometry_info { 44 uint32_t primitive_count; 45 uint32_t flags; 46 uint32_t type; 47 }; 48 49 struct radv_accel_struct_header { 50 uint32_t bvh_offset; 51 uint32_t reserved; 52 vk_aabb aabb; 53 54 /* Everything after this gets either updated/copied from the CPU or written by header.comp. */ 55 uint64_t compacted_size; 56 uint64_t serialization_size; 57 uint32_t copy_dispatch_size[3]; 58 uint64_t size; 59 60 /* Everything after this gets updated/copied from the CPU. */ 61 uint32_t geometry_count; 62 uint64_t instance_offset; 63 uint64_t instance_count; 64 uint32_t build_flags; 65 }; 66 67 struct radv_bvh_triangle_node { 68 float coords[3][3]; 69 uint32_t reserved[3]; 70 uint32_t triangle_id; 71 /* flags in upper 4 bits */ 72 uint32_t geometry_id_and_flags; 73 uint32_t reserved2; 74 uint32_t id; 75 }; 76 77 struct radv_bvh_aabb_node { 78 uint32_t primitive_id; 79 /* flags in upper 4 bits */ 80 uint32_t geometry_id_and_flags; 81 uint32_t reserved[14]; 82 }; 83 84 struct radv_bvh_instance_node { 85 uint64_t bvh_ptr; /* pre-shifted/masked to serve as node base */ 86 87 /* lower 24 bits are the custom instance index, upper 8 bits are the visibility mask */ 88 uint32_t custom_instance_and_mask; 89 /* lower 24 bits are the sbt offset, upper 8 bits are VkGeometryInstanceFlagsKHR */ 90 uint32_t sbt_offset_and_flags; 91 92 mat3x4 wto_matrix; 93 94 uint32_t instance_id; 95 uint32_t bvh_offset; 96 uint32_t reserved[2]; 97 98 /* Object to world matrix transposed from the initial transform. */ 99 mat3x4 otw_matrix; 100 }; 101 102 struct radv_bvh_box16_node { 103 uint32_t children[4]; 104 float16_t coords[4][2][3]; 105 }; 106 107 struct radv_bvh_box32_node { 108 uint32_t children[4]; 109 vk_aabb coords[4]; 110 uint32_t reserved[4]; 111 }; 112 113 #define RADV_BVH_ROOT_NODE radv_bvh_node_box32 114 #define RADV_BVH_INVALID_NODE 0xffffffffu 115 116 #endif /* BVH_H */ 117