1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
//
// Copyright (C) 2009-2021 Intel Corporation
//
// SPDX-License-Identifier: MIT
//
//
//
// This file is to contain structure definitions for RTAS-related meta-deta.
// The structures here should be generic enough to apply to any acceleration structure.
// If we ever move to KD-Trees or Octrees, this file should not need to change.
//
//********************************************************************************************
// WARNING!!!!!
//
// This file is shared by OpenCL and C++ source code and must be a pure C header
// There should only be C structure definitions and trivial inline functions here
//
//********************************************************************************************
#pragma once
#include "GRLIntTypes.h"
GRL_NAMESPACE_BEGIN(GRL)
GRL_NAMESPACE_BEGIN(RTAS)
typedef struct SerializationIdentifier
{
uint8_t Bytes[16];
} SerializationIdentifier;
GRL_STATIC_ASSERT(sizeof(SerializationIdentifier) == 16, "Wrong size!");
// Header structure for RTAS serialization.
// This structure is binary-compatible with the DXR and Vulkan API definitions
typedef struct SerializationHeader
{
SerializationIdentifier DriverID; // DXR 'DriverOpaqueGUID'. Vulkan: 'driverUUID'
SerializationIdentifier GRLID; // DXR 'DriverOpaqueVersioningData'. Vulkan: 'accelerationStructureUUID'
uint64_t SerializedSizeInBytesIncludingHeader;
uint64_t DeserializedSizeInBytes;
uint64_t InstanceHandleCount;
} SerializationHeader;
GRL_STATIC_ASSERT(sizeof(SerializationHeader) == 56, "Wrong size!");
// This structure is binary-compatible with DXR and Vulkan 'InstanceDesc' structures
typedef struct InstanceDesc {
float Transform[3][4];
uint32_t InstanceIDAndMask; // mask in 8 msbs
uint32_t InstanceContributionToHitGroupIndexAndFlags; // flags in 8 msbs
gpuva_t AccelerationStructureGPUVA; // NOTE: In GRL this is always a VA. Vulkan CPU builds use handles here, and these may need to be translated
} InstanceDesc;
GRL_STATIC_ASSERT(sizeof(InstanceDesc) == 64, "Wrong size!");
typedef struct GeoMetaData{
uint32_t PrimitiveCount;
uint16_t Type;
uint16_t Flags;
} GeoMetaData;
GRL_STATIC_ASSERT(sizeof(GeoMetaData) == 8, "Wrong size!");
typedef struct AABB3f {
float lower[3];
float upper[3];
} AABB3f;
GRL_STATIC_ASSERT(sizeof(AABB3f) == 24, "Wrong size!");
enum_uint32(error_t_) {
error_t_no_error = 0x0,
error_t_internal_node_child_OOB = 0x1,
error_t_leaf_node_child_OOB = 0x2,
error_t_unrecognised_node_t = 0x4,
error_t_mixed_node_unsupported = 0x8,
error_t_instance_pointers_inconsistent = 0x10,
error_t_instance_pointed_root_not_internal = 0x20,
error_t_leaf_node_instance_child_missed_by_64B = 0x40,
error_t_internal_node_child_cycle = 0x80,
error_t_input_geo_insane = 0x100,
error_t_quad_leaf_broken = 0x200,
error_t_backpointer_not_reset = 0x400,
error_t_backpointer_wrong_children_num = 0x500,
error_t_backpointer_inconsitent_parent_child = 0x600,
error_t_backpointer_root_not_root_error = 0x700,
error_t_backpointer_OOB = 0x800,
error_t_backpointers_buffer_too_small = 0x900,
error_t_atomic_update_struct_fatleaf_count_oob = 0x1000, // for this and following:
error_t_atomic_update_struct_fatleaf_node_idx_oob = 0x2000, // offset_in_BVH is just index in fatleaf or inner node arrays
error_t_atomic_update_struct_fatleaf_backpointer_mismatch = 0x3000,
error_t_atomic_update_struct_fatleaf_num_children_error = 0x4000,
error_t_atomic_update_struct_fatleaf_children_non_leaf = 0x5000,
error_t_atomic_update_struct_inner_count_oob = 0x6000,
error_t_atomic_update_struct_inner_node_idx_oob = 0x7000,
error_t_atomic_update_struct_inner_node_child_idx_error = 0x8000,
error_t_atomic_update_struct_inner_num_children_error = 0x9000,
error_t_atomic_update_struct_inner_children_non_internal = 0xA000,
error_t_unknown = 1u << 31,
};
enum_uint32(error_phase_t) {
error_phase_t_unknown = 0,
error_phase_t_post_build_Morton = 1,
error_phase_t_post_build_Trivial = 2,
error_phase_t_post_build_NewSAH = 3,
error_phase_t_post_update = 4,
error_phase_t_pre_update = 5,
error_phase_t_post_copy_op = 6,
};
typedef struct ERROR_INFO {
error_t_ type;
uint offset_in_BVH; //in 64B units
error_phase_t when;
uint reserved;
} ERROR_INFO;
// Meta-data common to all acceleration structures, which is needed to implement required functionality
// All RTAS structures must contain a struct of this type named 'Meta'
typedef struct RTASMetaData {
struct AABB3f bounds;
uint32_t instanceDescsStart; // byte offset to array of original instance_descs used for build. Required for DXR visualization and serialization
uint32_t instanceCount;
uint32_t geoDescsStart; // byte offset to array of 'GeoMetaData' matching input geos. Required for DXR visualization
uint32_t geoCount;
uint64_t allocationSize; // Size of the memory allocation containing this RTAS
// This is the size given to the app in the prebuild info when the RTAS was first created
// If RTAS was compacted, this will be the compacted size
ERROR_INFO errors; // only used in debug mode
} RTASMetaData;
GRL_STATIC_ASSERT( sizeof(RTASMetaData) == 64, "Wrong size!");
GRL_NAMESPACE_END(RTAS)
GRL_NAMESPACE_END(GRL)
|