• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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