1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2021 Bas Nieuwenhuizen 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 5*61046927SAndroid Build Coastguard Worker */ 6*61046927SAndroid Build Coastguard Worker 7*61046927SAndroid Build Coastguard Worker #ifndef BVH_BVH_H 8*61046927SAndroid Build Coastguard Worker #define BVH_BVH_H 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker #define radv_bvh_node_triangle 0 11*61046927SAndroid Build Coastguard Worker #define radv_bvh_node_box16 4 12*61046927SAndroid Build Coastguard Worker #define radv_bvh_node_box32 5 13*61046927SAndroid Build Coastguard Worker #define radv_bvh_node_instance 6 14*61046927SAndroid Build Coastguard Worker #define radv_bvh_node_aabb 7 15*61046927SAndroid Build Coastguard Worker 16*61046927SAndroid Build Coastguard Worker #define radv_ir_node_triangle 0 17*61046927SAndroid Build Coastguard Worker #define radv_ir_node_internal 1 18*61046927SAndroid Build Coastguard Worker #define radv_ir_node_instance 2 19*61046927SAndroid Build Coastguard Worker #define radv_ir_node_aabb 3 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard Worker #define RADV_GEOMETRY_OPAQUE (1u << 31) 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Worker #define RADV_INSTANCE_FORCE_OPAQUE (1u << 31) 24*61046927SAndroid Build Coastguard Worker #define RADV_INSTANCE_NO_FORCE_NOT_OPAQUE (1u << 30) 25*61046927SAndroid Build Coastguard Worker #define RADV_INSTANCE_TRIANGLE_FACING_CULL_DISABLE (1u << 29) 26*61046927SAndroid Build Coastguard Worker #define RADV_INSTANCE_TRIANGLE_FLIP_FACING (1u << 28) 27*61046927SAndroid Build Coastguard Worker 28*61046927SAndroid Build Coastguard Worker #ifdef VULKAN 29*61046927SAndroid Build Coastguard Worker #define VK_UUID_SIZE 16 30*61046927SAndroid Build Coastguard Worker #else 31*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h> 32*61046927SAndroid Build Coastguard Worker typedef struct radv_ir_node radv_ir_node; 33*61046927SAndroid Build Coastguard Worker typedef struct radv_global_sync_data radv_global_sync_data; 34*61046927SAndroid Build Coastguard Worker typedef struct radv_bvh_geometry_data radv_bvh_geometry_data; 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker typedef uint16_t float16_t; 37*61046927SAndroid Build Coastguard Worker 38*61046927SAndroid Build Coastguard Worker typedef struct { 39*61046927SAndroid Build Coastguard Worker float values[3][4]; 40*61046927SAndroid Build Coastguard Worker } mat3x4; 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker typedef struct { 43*61046927SAndroid Build Coastguard Worker float x; 44*61046927SAndroid Build Coastguard Worker float y; 45*61046927SAndroid Build Coastguard Worker float z; 46*61046927SAndroid Build Coastguard Worker } vec3; 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard Worker typedef struct radv_aabb radv_aabb; 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard Worker #endif 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker struct radv_aabb { 53*61046927SAndroid Build Coastguard Worker vec3 min; 54*61046927SAndroid Build Coastguard Worker vec3 max; 55*61046927SAndroid Build Coastguard Worker }; 56*61046927SAndroid Build Coastguard Worker 57*61046927SAndroid Build Coastguard Worker struct radv_accel_struct_serialization_header { 58*61046927SAndroid Build Coastguard Worker uint8_t driver_uuid[VK_UUID_SIZE]; 59*61046927SAndroid Build Coastguard Worker uint8_t accel_struct_compat[VK_UUID_SIZE]; 60*61046927SAndroid Build Coastguard Worker uint64_t serialization_size; 61*61046927SAndroid Build Coastguard Worker uint64_t compacted_size; 62*61046927SAndroid Build Coastguard Worker uint64_t instance_count; 63*61046927SAndroid Build Coastguard Worker #ifndef VULKAN 64*61046927SAndroid Build Coastguard Worker uint64_t instances[]; 65*61046927SAndroid Build Coastguard Worker #endif 66*61046927SAndroid Build Coastguard Worker }; 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Worker struct radv_accel_struct_geometry_info { 69*61046927SAndroid Build Coastguard Worker uint32_t primitive_count; 70*61046927SAndroid Build Coastguard Worker uint32_t flags; 71*61046927SAndroid Build Coastguard Worker uint32_t type; 72*61046927SAndroid Build Coastguard Worker }; 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker struct radv_accel_struct_header { 75*61046927SAndroid Build Coastguard Worker uint32_t bvh_offset; 76*61046927SAndroid Build Coastguard Worker uint32_t reserved; 77*61046927SAndroid Build Coastguard Worker radv_aabb aabb; 78*61046927SAndroid Build Coastguard Worker 79*61046927SAndroid Build Coastguard Worker /* Everything after this gets either updated/copied from the CPU or written by header.comp. */ 80*61046927SAndroid Build Coastguard Worker uint64_t compacted_size; 81*61046927SAndroid Build Coastguard Worker uint64_t serialization_size; 82*61046927SAndroid Build Coastguard Worker uint32_t copy_dispatch_size[3]; 83*61046927SAndroid Build Coastguard Worker uint64_t size; 84*61046927SAndroid Build Coastguard Worker 85*61046927SAndroid Build Coastguard Worker /* Everything after this gets updated/copied from the CPU. */ 86*61046927SAndroid Build Coastguard Worker uint32_t geometry_count; 87*61046927SAndroid Build Coastguard Worker uint64_t instance_offset; 88*61046927SAndroid Build Coastguard Worker uint64_t instance_count; 89*61046927SAndroid Build Coastguard Worker uint32_t build_flags; 90*61046927SAndroid Build Coastguard Worker }; 91*61046927SAndroid Build Coastguard Worker 92*61046927SAndroid Build Coastguard Worker struct radv_ir_node { 93*61046927SAndroid Build Coastguard Worker radv_aabb aabb; 94*61046927SAndroid Build Coastguard Worker }; 95*61046927SAndroid Build Coastguard Worker 96*61046927SAndroid Build Coastguard Worker #define RADV_UNKNOWN_BVH_OFFSET 0xFFFFFFFF 97*61046927SAndroid Build Coastguard Worker #define RADV_NULL_BVH_OFFSET 0xFFFFFFFE 98*61046927SAndroid Build Coastguard Worker 99*61046927SAndroid Build Coastguard Worker struct radv_ir_box_node { 100*61046927SAndroid Build Coastguard Worker radv_ir_node base; 101*61046927SAndroid Build Coastguard Worker uint32_t children[2]; 102*61046927SAndroid Build Coastguard Worker uint32_t bvh_offset; 103*61046927SAndroid Build Coastguard Worker }; 104*61046927SAndroid Build Coastguard Worker 105*61046927SAndroid Build Coastguard Worker struct radv_global_sync_data { 106*61046927SAndroid Build Coastguard Worker uint32_t task_counts[2]; 107*61046927SAndroid Build Coastguard Worker uint32_t task_started_counter; 108*61046927SAndroid Build Coastguard Worker uint32_t task_done_counter; 109*61046927SAndroid Build Coastguard Worker uint32_t current_phase_start_counter; 110*61046927SAndroid Build Coastguard Worker uint32_t current_phase_end_counter; 111*61046927SAndroid Build Coastguard Worker uint32_t phase_index; 112*61046927SAndroid Build Coastguard Worker /* If this flag is set, the shader should exit 113*61046927SAndroid Build Coastguard Worker * instead of executing another phase */ 114*61046927SAndroid Build Coastguard Worker uint32_t next_phase_exit_flag; 115*61046927SAndroid Build Coastguard Worker }; 116*61046927SAndroid Build Coastguard Worker 117*61046927SAndroid Build Coastguard Worker struct radv_ir_header { 118*61046927SAndroid Build Coastguard Worker int32_t min_bounds[3]; 119*61046927SAndroid Build Coastguard Worker int32_t max_bounds[3]; 120*61046927SAndroid Build Coastguard Worker uint32_t active_leaf_count; 121*61046927SAndroid Build Coastguard Worker /* Indirect dispatch dimensions for the encoder. 122*61046927SAndroid Build Coastguard Worker * ir_internal_node_count is the thread count in the X dimension, 123*61046927SAndroid Build Coastguard Worker * while Y and Z are always set to 1. */ 124*61046927SAndroid Build Coastguard Worker uint32_t ir_internal_node_count; 125*61046927SAndroid Build Coastguard Worker uint32_t dispatch_size_y; 126*61046927SAndroid Build Coastguard Worker uint32_t dispatch_size_z; 127*61046927SAndroid Build Coastguard Worker radv_global_sync_data sync_data; 128*61046927SAndroid Build Coastguard Worker uint32_t dst_node_offset; 129*61046927SAndroid Build Coastguard Worker }; 130*61046927SAndroid Build Coastguard Worker 131*61046927SAndroid Build Coastguard Worker struct radv_bvh_triangle_node { 132*61046927SAndroid Build Coastguard Worker float coords[3][3]; 133*61046927SAndroid Build Coastguard Worker uint32_t reserved[3]; 134*61046927SAndroid Build Coastguard Worker uint32_t triangle_id; 135*61046927SAndroid Build Coastguard Worker /* flags in upper 4 bits */ 136*61046927SAndroid Build Coastguard Worker uint32_t geometry_id_and_flags; 137*61046927SAndroid Build Coastguard Worker uint32_t reserved2; 138*61046927SAndroid Build Coastguard Worker uint32_t id; 139*61046927SAndroid Build Coastguard Worker }; 140*61046927SAndroid Build Coastguard Worker 141*61046927SAndroid Build Coastguard Worker struct radv_bvh_aabb_node { 142*61046927SAndroid Build Coastguard Worker uint32_t primitive_id; 143*61046927SAndroid Build Coastguard Worker /* flags in upper 4 bits */ 144*61046927SAndroid Build Coastguard Worker uint32_t geometry_id_and_flags; 145*61046927SAndroid Build Coastguard Worker uint32_t reserved[14]; 146*61046927SAndroid Build Coastguard Worker }; 147*61046927SAndroid Build Coastguard Worker 148*61046927SAndroid Build Coastguard Worker struct radv_bvh_instance_node { 149*61046927SAndroid Build Coastguard Worker uint64_t bvh_ptr; /* pre-shifted/masked to serve as node base */ 150*61046927SAndroid Build Coastguard Worker 151*61046927SAndroid Build Coastguard Worker /* lower 24 bits are the custom instance index, upper 8 bits are the visibility mask */ 152*61046927SAndroid Build Coastguard Worker uint32_t custom_instance_and_mask; 153*61046927SAndroid Build Coastguard Worker /* lower 24 bits are the sbt offset, upper 8 bits are VkGeometryInstanceFlagsKHR */ 154*61046927SAndroid Build Coastguard Worker uint32_t sbt_offset_and_flags; 155*61046927SAndroid Build Coastguard Worker 156*61046927SAndroid Build Coastguard Worker mat3x4 wto_matrix; 157*61046927SAndroid Build Coastguard Worker 158*61046927SAndroid Build Coastguard Worker uint32_t instance_id; 159*61046927SAndroid Build Coastguard Worker uint32_t bvh_offset; 160*61046927SAndroid Build Coastguard Worker uint32_t reserved[2]; 161*61046927SAndroid Build Coastguard Worker 162*61046927SAndroid Build Coastguard Worker /* Object to world matrix transposed from the initial transform. */ 163*61046927SAndroid Build Coastguard Worker mat3x4 otw_matrix; 164*61046927SAndroid Build Coastguard Worker }; 165*61046927SAndroid Build Coastguard Worker 166*61046927SAndroid Build Coastguard Worker struct radv_bvh_box16_node { 167*61046927SAndroid Build Coastguard Worker uint32_t children[4]; 168*61046927SAndroid Build Coastguard Worker float16_t coords[4][2][3]; 169*61046927SAndroid Build Coastguard Worker }; 170*61046927SAndroid Build Coastguard Worker 171*61046927SAndroid Build Coastguard Worker struct radv_bvh_box32_node { 172*61046927SAndroid Build Coastguard Worker uint32_t children[4]; 173*61046927SAndroid Build Coastguard Worker radv_aabb coords[4]; 174*61046927SAndroid Build Coastguard Worker uint32_t reserved[4]; 175*61046927SAndroid Build Coastguard Worker }; 176*61046927SAndroid Build Coastguard Worker 177*61046927SAndroid Build Coastguard Worker #define RADV_BVH_ROOT_NODE radv_bvh_node_box32 178*61046927SAndroid Build Coastguard Worker #define RADV_BVH_INVALID_NODE 0xffffffffu 179*61046927SAndroid Build Coastguard Worker 180*61046927SAndroid Build Coastguard Worker /* If the task index is set to this value, there is no 181*61046927SAndroid Build Coastguard Worker * more work to do. */ 182*61046927SAndroid Build Coastguard Worker #define TASK_INDEX_INVALID 0xFFFFFFFF 183*61046927SAndroid Build Coastguard Worker 184*61046927SAndroid Build Coastguard Worker struct radv_bvh_geometry_data { 185*61046927SAndroid Build Coastguard Worker uint64_t data; 186*61046927SAndroid Build Coastguard Worker uint64_t indices; 187*61046927SAndroid Build Coastguard Worker uint64_t transform; 188*61046927SAndroid Build Coastguard Worker 189*61046927SAndroid Build Coastguard Worker uint32_t geometry_id; 190*61046927SAndroid Build Coastguard Worker uint32_t geometry_type; 191*61046927SAndroid Build Coastguard Worker uint32_t first_id; 192*61046927SAndroid Build Coastguard Worker uint32_t stride; 193*61046927SAndroid Build Coastguard Worker uint32_t vertex_format; 194*61046927SAndroid Build Coastguard Worker uint32_t index_format; 195*61046927SAndroid Build Coastguard Worker }; 196*61046927SAndroid Build Coastguard Worker 197*61046927SAndroid Build Coastguard Worker #endif /* BVH_H */ 198