1 //
2 // Copyright (C) 2009-2021 Intel Corporation
3 //
4 // SPDX-License-Identifier: MIT
5 //
6 //
7
8 #pragma once
9 #include "GRLStructs.h"
10 #include "shared.h"
11
12 typedef global void *D3D12_GPU_VIRTUAL_ADDRESS;
13 typedef void *ID3D12StateObjectPrototype;
14
15 enum DXGI_FORMAT
16 {
17 DXGI_FORMAT_UNKNOWN,
18 DXGI_FORMAT_R32G32B32A32_TYPELESS,
19 DXGI_FORMAT_R32G32B32A32_FLOAT,
20 DXGI_FORMAT_R32G32B32A32_UINT,
21 DXGI_FORMAT_R32G32B32A32_SINT,
22 DXGI_FORMAT_R32G32B32_TYPELESS,
23 DXGI_FORMAT_R32G32B32_FLOAT,
24 DXGI_FORMAT_R32G32B32_UINT,
25 DXGI_FORMAT_R32G32B32_SINT,
26 DXGI_FORMAT_R16G16B16A16_TYPELESS,
27 DXGI_FORMAT_R16G16B16A16_FLOAT,
28 DXGI_FORMAT_R16G16B16A16_UNORM,
29 DXGI_FORMAT_R16G16B16A16_UINT,
30 DXGI_FORMAT_R16G16B16A16_SNORM,
31 DXGI_FORMAT_R16G16B16A16_SINT,
32 DXGI_FORMAT_R32G32_TYPELESS,
33 DXGI_FORMAT_R32G32_FLOAT,
34 DXGI_FORMAT_R32G32_UINT,
35 DXGI_FORMAT_R32G32_SINT,
36 DXGI_FORMAT_R32G8X24_TYPELESS,
37 DXGI_FORMAT_D32_FLOAT_S8X24_UINT,
38 DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
39 DXGI_FORMAT_X32_TYPELESS_G8X24_UINT,
40 DXGI_FORMAT_R10G10B10A2_TYPELESS,
41 DXGI_FORMAT_R10G10B10A2_UNORM,
42 DXGI_FORMAT_R10G10B10A2_UINT,
43 DXGI_FORMAT_R11G11B10_FLOAT,
44 DXGI_FORMAT_R8G8B8A8_TYPELESS,
45 DXGI_FORMAT_R8G8B8A8_UNORM,
46 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
47 DXGI_FORMAT_R8G8B8A8_UINT,
48 DXGI_FORMAT_R8G8B8A8_SNORM,
49 DXGI_FORMAT_R8G8B8A8_SINT,
50 DXGI_FORMAT_R16G16_TYPELESS,
51 DXGI_FORMAT_R16G16_FLOAT,
52 DXGI_FORMAT_R16G16_UNORM,
53 DXGI_FORMAT_R16G16_UINT,
54 DXGI_FORMAT_R16G16_SNORM,
55 DXGI_FORMAT_R16G16_SINT,
56 DXGI_FORMAT_R32_TYPELESS,
57 DXGI_FORMAT_D32_FLOAT,
58 DXGI_FORMAT_R32_FLOAT,
59 DXGI_FORMAT_R32_UINT,
60 DXGI_FORMAT_R32_SINT,
61 DXGI_FORMAT_R24G8_TYPELESS,
62 DXGI_FORMAT_D24_UNORM_S8_UINT,
63 DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
64 DXGI_FORMAT_X24_TYPELESS_G8_UINT,
65 DXGI_FORMAT_R8G8_TYPELESS,
66 DXGI_FORMAT_R8G8_UNORM,
67 DXGI_FORMAT_R8G8_UINT,
68 DXGI_FORMAT_R8G8_SNORM,
69 DXGI_FORMAT_R8G8_SINT,
70 DXGI_FORMAT_R16_TYPELESS,
71 DXGI_FORMAT_R16_FLOAT,
72 DXGI_FORMAT_D16_UNORM,
73 DXGI_FORMAT_R16_UNORM,
74 DXGI_FORMAT_R16_UINT,
75 DXGI_FORMAT_R16_SNORM,
76 DXGI_FORMAT_R16_SINT,
77 DXGI_FORMAT_R8_TYPELESS,
78 DXGI_FORMAT_R8_UNORM,
79 DXGI_FORMAT_R8_UINT,
80 DXGI_FORMAT_R8_SNORM,
81 DXGI_FORMAT_R8_SINT,
82 DXGI_FORMAT_A8_UNORM,
83 DXGI_FORMAT_R1_UNORM,
84 DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
85 DXGI_FORMAT_R8G8_B8G8_UNORM,
86 DXGI_FORMAT_G8R8_G8B8_UNORM,
87 DXGI_FORMAT_BC1_TYPELESS,
88 DXGI_FORMAT_BC1_UNORM,
89 DXGI_FORMAT_BC1_UNORM_SRGB,
90 DXGI_FORMAT_BC2_TYPELESS,
91 DXGI_FORMAT_BC2_UNORM,
92 DXGI_FORMAT_BC2_UNORM_SRGB,
93 DXGI_FORMAT_BC3_TYPELESS,
94 DXGI_FORMAT_BC3_UNORM,
95 DXGI_FORMAT_BC3_UNORM_SRGB,
96 DXGI_FORMAT_BC4_TYPELESS,
97 DXGI_FORMAT_BC4_UNORM,
98 DXGI_FORMAT_BC4_SNORM,
99 DXGI_FORMAT_BC5_TYPELESS,
100 DXGI_FORMAT_BC5_UNORM,
101 DXGI_FORMAT_BC5_SNORM,
102 DXGI_FORMAT_B5G6R5_UNORM,
103 DXGI_FORMAT_B5G5R5A1_UNORM,
104 DXGI_FORMAT_B8G8R8A8_UNORM,
105 DXGI_FORMAT_B8G8R8X8_UNORM,
106 DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM,
107 DXGI_FORMAT_B8G8R8A8_TYPELESS,
108 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,
109 DXGI_FORMAT_B8G8R8X8_TYPELESS,
110 DXGI_FORMAT_B8G8R8X8_UNORM_SRGB,
111 DXGI_FORMAT_BC6H_TYPELESS,
112 DXGI_FORMAT_BC6H_UF16,
113 DXGI_FORMAT_BC6H_SF16,
114 DXGI_FORMAT_BC7_TYPELESS,
115 DXGI_FORMAT_BC7_UNORM,
116 DXGI_FORMAT_BC7_UNORM_SRGB,
117 DXGI_FORMAT_AYUV,
118 DXGI_FORMAT_Y410,
119 DXGI_FORMAT_Y416,
120 DXGI_FORMAT_NV12,
121 DXGI_FORMAT_P010,
122 DXGI_FORMAT_P016,
123 DXGI_FORMAT_420_OPAQUE,
124 DXGI_FORMAT_YUY2,
125 DXGI_FORMAT_Y210,
126 DXGI_FORMAT_Y216,
127 DXGI_FORMAT_NV11,
128 DXGI_FORMAT_AI44,
129 DXGI_FORMAT_IA44,
130 DXGI_FORMAT_P8,
131 DXGI_FORMAT_A8P8,
132 DXGI_FORMAT_B4G4R4A4_UNORM,
133 DXGI_FORMAT_P208,
134 DXGI_FORMAT_V208,
135 DXGI_FORMAT_V408,
136 DXGI_FORMAT_FORCE_UINT
137 };
138
139 typedef enum D3D12_RAYTRACING_GEOMETRY_FLAGS
140 {
141 D3D12_RAYTRACING_GEOMETRY_FLAG_NONE = 0,
142 D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE = 0x1,
143 D3D12_RAYTRACING_GEOMETRY_FLAG_NO_DUPLICATE_ANYHIT_INVOCATION = 0x2
144 } D3D12_RAYTRACING_GEOMETRY_FLAGS;
145
146 typedef enum D3D12_RAYTRACING_GEOMETRY_TYPE
147 {
148 D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES = 0,
149 D3D12_RAYTRACING_GEOMETRY_TYPE_PROCEDURAL_PRIMITIVE_AABBS = (D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES + 1)
150 } D3D12_RAYTRACING_GEOMETRY_TYPE;
151
152 typedef enum D3D12_RAYTRACING_INSTANCE_FLAGS
153 {
154 D3D12_RAYTRACING_INSTANCE_FLAG_NONE = 0,
155 D3D12_RAYTRACING_INSTANCE_FLAG_TRIANGLE_CULL_DISABLE = 0x1,
156 D3D12_RAYTRACING_INSTANCE_FLAG_TRIANGLE_FRONT_COUNTERCLOCKWISE = 0x2,
157 D3D12_RAYTRACING_INSTANCE_FLAG_FORCE_OPAQUE = 0x4,
158 D3D12_RAYTRACING_INSTANCE_FLAG_FORCE_NON_OPAQUE = 0x8
159 } D3D12_RAYTRACING_INSTANCE_FLAGS;
160
161 typedef struct D3D12_GPU_VIRTUAL_ADDRESSAND_STRIDE
162 {
163 D3D12_GPU_VIRTUAL_ADDRESS StartAddress;
164 unsigned long StrideInBytes;
165 } D3D12_GPU_VIRTUAL_ADDRESSAND_STRIDE;
166
167 typedef struct D3D12_GPU_VIRTUAL_ADDRESSRANGE
168 {
169 D3D12_GPU_VIRTUAL_ADDRESS StartAddress;
170 unsigned long SizeInBytes;
171 } D3D12_GPU_VIRTUAL_ADDRESSRANGE;
172
173 typedef struct D3D12_GPU_VIRTUAL_ADDRESSRANGE_AND_STRIDE
174 {
175 D3D12_GPU_VIRTUAL_ADDRESS StartAddress;
176 unsigned long SizeInBytes;
177 unsigned long StrideInBytes;
178 } D3D12_GPU_VIRTUAL_ADDRESSRANGE_AND_STRIDE;
179
180 typedef struct D3D12_RAYTRACING_GEOMETRY_TRIANGLES_DESC
181 {
182 D3D12_GPU_VIRTUAL_ADDRESS Transform;
183 enum DXGI_FORMAT IndexFormat;
184 enum DXGI_FORMAT VertexFormat;
185 unsigned int IndexCount;
186 unsigned int VertexCount;
187 D3D12_GPU_VIRTUAL_ADDRESS IndexBuffer;
188 struct D3D12_GPU_VIRTUAL_ADDRESSAND_STRIDE VertexBuffer;
189 } D3D12_RAYTRACING_GEOMETRY_TRIANGLES_DESC;
190
191 typedef struct D3D12_RAYTRACING_AABB
192 {
193 float MinX;
194 float MinY;
195 float MinZ;
196 float MaxX;
197 float MaxY;
198 float MaxZ;
199 } D3D12_RAYTRACING_AABB;
200
D3D12_set_raytracing_aabb(D3D12_RAYTRACING_AABB * dest,struct AABB * source)201 GRL_INLINE void D3D12_set_raytracing_aabb(D3D12_RAYTRACING_AABB* dest, struct AABB* source)
202 {
203 dest->MinX = source->lower.x;
204 dest->MinY = source->lower.y;
205 dest->MinZ = source->lower.z;
206 dest->MaxX = source->upper.x;
207 dest->MaxY = source->upper.y;
208 dest->MaxZ = source->upper.z;
209 }
210
211 typedef struct D3D12_RAYTRACING_GEOMETRY_AABBS_DESC
212 {
213 unsigned long AABBCount;
214 D3D12_GPU_VIRTUAL_ADDRESSAND_STRIDE AABBs;
215 } D3D12_RAYTRACING_GEOMETRY_AABBS_DESC;
216
217 typedef struct D3D12_RAYTRACING_GEOMETRY_DESC
218 {
219 D3D12_RAYTRACING_GEOMETRY_TYPE Type;
220 D3D12_RAYTRACING_GEOMETRY_FLAGS Flags;
221 //unsigned int ShaderIndex : 24; // extension
222 //unsigned int Mask : 8; // extension
223 //unsigned int ShaderIndex_Mask; // extension
224 union {
225 D3D12_RAYTRACING_GEOMETRY_TRIANGLES_DESC Triangles;
226 D3D12_RAYTRACING_GEOMETRY_AABBS_DESC AABBs;
227 };
228 } D3D12_RAYTRACING_GEOMETRY_DESC;
229
D3D12_set_Type(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,D3D12_RAYTRACING_GEOMETRY_TYPE type)230 GRL_INLINE void D3D12_set_Type(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, D3D12_RAYTRACING_GEOMETRY_TYPE type)
231 {
232 geomDesc->Type = type;
233 }
234
D3D12_get_Type(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)235 GRL_INLINE D3D12_RAYTRACING_GEOMETRY_TYPE D3D12_get_Type(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
236 {
237 return geomDesc->Type;
238 }
239
D3D12_set_Flags(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,D3D12_RAYTRACING_GEOMETRY_FLAGS flags)240 GRL_INLINE void D3D12_set_Flags(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, D3D12_RAYTRACING_GEOMETRY_FLAGS flags)
241 {
242 geomDesc->Flags = flags;
243 }
244
D3D12_get_Flags(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)245 GRL_INLINE D3D12_RAYTRACING_GEOMETRY_FLAGS D3D12_get_Flags(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
246 {
247 return geomDesc->Flags;
248 }
249
D3D12_set_triangles_Transform(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,D3D12_GPU_VIRTUAL_ADDRESS transform)250 GRL_INLINE void D3D12_set_triangles_Transform(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, D3D12_GPU_VIRTUAL_ADDRESS transform)
251 {
252 geomDesc->Triangles.Transform = transform;
253 }
254
D3D12_get_triangles_Transform(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)255 GRL_INLINE D3D12_GPU_VIRTUAL_ADDRESS D3D12_get_triangles_Transform(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
256 {
257 return geomDesc->Triangles.Transform;
258 }
259
D3D12_set_triangles_IndexFormat(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,IndexFormat format)260 GRL_INLINE void D3D12_set_triangles_IndexFormat(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, IndexFormat format)
261 {
262 switch (format)
263 {
264 case INDEX_FORMAT_NONE:
265 geomDesc->Triangles.IndexFormat = DXGI_FORMAT_UNKNOWN;
266 break;
267 case INDEX_FORMAT_R16_UINT:
268 geomDesc->Triangles.IndexFormat = DXGI_FORMAT_R16_UINT;
269 break;
270 case INDEX_FORMAT_R32_UINT:
271 geomDesc->Triangles.IndexFormat = DXGI_FORMAT_R32_UINT;
272 break;
273 }
274 }
275
D3D12_get_triangles_IndexFormat(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)276 GRL_INLINE IndexFormat D3D12_get_triangles_IndexFormat(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
277 {
278 switch (geomDesc->Triangles.IndexFormat)
279 {
280 case DXGI_FORMAT_R16_UINT:
281 return INDEX_FORMAT_R16_UINT;
282 case DXGI_FORMAT_R32_UINT:
283 return INDEX_FORMAT_R32_UINT;
284 case DXGI_FORMAT_UNKNOWN:
285 default:
286 return INDEX_FORMAT_NONE;
287 }
288 }
289
D3D12_set_triangles_VertexFormat(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,VertexFormat format)290 GRL_INLINE void D3D12_set_triangles_VertexFormat(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, VertexFormat format)
291 {
292 switch (format)
293 {
294 case VERTEX_FORMAT_R32G32_FLOAT:
295 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R32G32_FLOAT;
296 break;
297 case VERTEX_FORMAT_R32G32B32_FLOAT:
298 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT;
299 break;
300 case VERTEX_FORMAT_R16G16_FLOAT:
301 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R16G16_FLOAT;
302 break;
303 case VERTEX_FORMAT_R16G16B16A16_FLOAT:
304 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R16G16B16A16_FLOAT;
305 break;
306 case VERTEX_FORMAT_R16G16_SNORM:
307 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R16G16_SNORM;
308 break;
309 case VERTEX_FORMAT_R16G16B16A16_SNORM:
310 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R16G16B16A16_SNORM;
311 break;
312 case VERTEX_FORMAT_R16G16B16A16_UNORM:
313 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R16G16B16A16_UNORM;
314 break;
315 case VERTEX_FORMAT_R16G16_UNORM:
316 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R16G16_UNORM;
317 break;
318 case VERTEX_FORMAT_R10G10B10A2_UNORM:
319 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R10G10B10A2_UNORM;
320 break;
321 case VERTEX_FORMAT_R8G8B8A8_UNORM:
322 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R8G8B8A8_UNORM;
323 break;
324 case VERTEX_FORMAT_R8G8_UNORM:
325 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R8G8_UNORM;
326 break;
327 case VERTEX_FORMAT_R8G8B8A8_SNORM:
328 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R8G8B8A8_SNORM;
329 break;
330 case VERTEX_FORMAT_R8G8_SNORM:
331 geomDesc->Triangles.VertexFormat = DXGI_FORMAT_R8G8_SNORM;
332 break;
333 }
334 }
335
D3D12_get_triangles_VertexFormat(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)336 GRL_INLINE VertexFormat D3D12_get_triangles_VertexFormat(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
337 {
338 switch(geomDesc->Triangles.VertexFormat)
339 {
340 case DXGI_FORMAT_R32G32_FLOAT:
341 return VERTEX_FORMAT_R32G32_FLOAT;
342 case DXGI_FORMAT_R32G32B32_FLOAT:
343 return VERTEX_FORMAT_R32G32B32_FLOAT;
344 case DXGI_FORMAT_R16G16_FLOAT:
345 return VERTEX_FORMAT_R16G16_FLOAT;
346 case DXGI_FORMAT_R16G16B16A16_FLOAT:
347 return VERTEX_FORMAT_R16G16B16A16_FLOAT;
348 case DXGI_FORMAT_R16G16_SNORM:
349 return VERTEX_FORMAT_R16G16_SNORM;
350 case DXGI_FORMAT_R16G16B16A16_SNORM:
351 return VERTEX_FORMAT_R16G16B16A16_SNORM;
352 case DXGI_FORMAT_R16G16B16A16_UNORM:
353 return VERTEX_FORMAT_R16G16B16A16_UNORM;
354 case DXGI_FORMAT_R16G16_UNORM:
355 return VERTEX_FORMAT_R16G16_UNORM;
356 case DXGI_FORMAT_R10G10B10A2_UNORM:
357 return VERTEX_FORMAT_R10G10B10A2_UNORM;
358 case DXGI_FORMAT_R8G8B8A8_UNORM:
359 return VERTEX_FORMAT_R8G8B8A8_UNORM;
360 case DXGI_FORMAT_R8G8_UNORM:
361 return VERTEX_FORMAT_R8G8_UNORM;
362 case DXGI_FORMAT_R8G8B8A8_SNORM:
363 return VERTEX_FORMAT_R8G8B8A8_SNORM;
364 case DXGI_FORMAT_R8G8_SNORM:
365 return VERTEX_FORMAT_R8G8_SNORM;
366 default:
367 return VERTEX_FORMAT_R32G32_FLOAT;
368 }
369 }
370
D3D12_set_triangles_IndexCount(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,unsigned int count)371 GRL_INLINE void D3D12_set_triangles_IndexCount(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, unsigned int count)
372 {
373 geomDesc->Triangles.IndexCount = count;
374 }
375
D3D12_get_triangles_IndexCount(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)376 GRL_INLINE unsigned int D3D12_get_triangles_IndexCount(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
377 {
378 return geomDesc->Triangles.IndexCount;
379 }
380
D3D12_set_triangles_VertexCount(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,unsigned int count)381 GRL_INLINE void D3D12_set_triangles_VertexCount(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, unsigned int count)
382 {
383 geomDesc->Triangles.VertexCount = count;
384 }
385
D3D12_get_triangles_VertexCount(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)386 GRL_INLINE unsigned int D3D12_get_triangles_VertexCount(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
387 {
388 return geomDesc->Triangles.VertexCount;
389 }
390
D3D12_set_triangles_IndexBuffer(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,D3D12_GPU_VIRTUAL_ADDRESS buffer)391 GRL_INLINE void D3D12_set_triangles_IndexBuffer(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, D3D12_GPU_VIRTUAL_ADDRESS buffer)
392 {
393 geomDesc->Triangles.IndexBuffer = buffer;
394 }
395
D3D12_get_triangles_IndexBuffer(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)396 GRL_INLINE D3D12_GPU_VIRTUAL_ADDRESS D3D12_get_triangles_IndexBuffer(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
397 {
398 return geomDesc->Triangles.IndexBuffer;
399 }
400
D3D12_set_triangles_VertexBuffer_StartAddress(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,D3D12_GPU_VIRTUAL_ADDRESS address)401 GRL_INLINE void D3D12_set_triangles_VertexBuffer_StartAddress(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, D3D12_GPU_VIRTUAL_ADDRESS address)
402 {
403 geomDesc->Triangles.VertexBuffer.StartAddress = address;
404 }
405
D3D12_get_triangles_VertexBuffer_StartAddress(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)406 GRL_INLINE D3D12_GPU_VIRTUAL_ADDRESS D3D12_get_triangles_VertexBuffer_StartAddress(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
407 {
408 return geomDesc->Triangles.VertexBuffer.StartAddress;
409 }
410
D3D12_set_triangles_VertexBuffer_StrideInBytes(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,unsigned long stride)411 GRL_INLINE void D3D12_set_triangles_VertexBuffer_StrideInBytes(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, unsigned long stride)
412 {
413 geomDesc->Triangles.VertexBuffer.StrideInBytes = stride;
414 }
415
D3D12_get_triangles_VertexBuffer_StrideInBytes(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)416 GRL_INLINE unsigned long D3D12_get_triangles_VertexBuffer_StrideInBytes(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
417 {
418 return geomDesc->Triangles.VertexBuffer.StrideInBytes;
419 }
420
D3D12_set_procedurals_AABBCount(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,unsigned long count)421 GRL_INLINE void D3D12_set_procedurals_AABBCount(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, unsigned long count)
422 {
423 geomDesc->AABBs.AABBCount = count;
424 }
425
D3D12_get_procedurals_AABBCount(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)426 GRL_INLINE unsigned long D3D12_get_procedurals_AABBCount(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
427 {
428 return geomDesc->AABBs.AABBCount;
429 }
430
D3D12_set_procedurals_AABBs_StartAddress(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,D3D12_GPU_VIRTUAL_ADDRESS address)431 GRL_INLINE void D3D12_set_procedurals_AABBs_StartAddress(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, D3D12_GPU_VIRTUAL_ADDRESS address)
432 {
433 geomDesc->AABBs.AABBs.StartAddress = address;
434 }
435
D3D12_get_procedurals_AABBs_StartAddress(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)436 GRL_INLINE D3D12_GPU_VIRTUAL_ADDRESS D3D12_get_procedurals_AABBs_StartAddress(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
437 {
438 return geomDesc->AABBs.AABBs.StartAddress;
439 }
440
D3D12_set_procedurals_AABBs_StrideInBytes(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc,unsigned long stride)441 GRL_INLINE void D3D12_set_procedurals_AABBs_StrideInBytes(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc, unsigned long stride)
442 {
443 geomDesc->AABBs.AABBs.StrideInBytes = stride;
444 }
445
D3D12_get_procedurals_AABBs_StrideInBytes(D3D12_RAYTRACING_GEOMETRY_DESC * geomDesc)446 GRL_INLINE unsigned long D3D12_get_procedurals_AABBs_StrideInBytes(D3D12_RAYTRACING_GEOMETRY_DESC *geomDesc)
447 {
448 return geomDesc->AABBs.AABBs.StrideInBytes;
449 }
450
451 typedef struct D3D12_RAYTRACING_INSTANCE_DESC
452 {
453 float Transform[12];
454 // unsigned int InstanceID : 24;
455 // unsigned int InstanceMask : 8;
456 uint32_t DW0;
457 // unsigned int InstanceContributionToHitGroupIndex : 24;
458 // unsigned int Flags : 8;
459 uint32_t DW1;
460 global char *AccelerationStructure;
461 } D3D12_RAYTRACING_INSTANCE_DESC;
462
D3D12_get_transform(const D3D12_RAYTRACING_INSTANCE_DESC * d,const uint32_t row,const uint32_t column)463 GRL_INLINE float D3D12_get_transform(const D3D12_RAYTRACING_INSTANCE_DESC *d, const uint32_t row, const uint32_t column)
464 {
465 return d->Transform[row * 4 + column];
466 }
467
D3D12_get_instanceID(const D3D12_RAYTRACING_INSTANCE_DESC * d)468 GRL_INLINE uint32_t D3D12_get_instanceID(const D3D12_RAYTRACING_INSTANCE_DESC *d)
469 {
470 return d->DW0 & ((1 << 24) - 1);
471 }
472
D3D12_get_InstanceMask(const D3D12_RAYTRACING_INSTANCE_DESC * d)473 GRL_INLINE uint32_t D3D12_get_InstanceMask(const D3D12_RAYTRACING_INSTANCE_DESC *d)
474 {
475 return d->DW0 >> 24;
476 }
477
D3D12_get_InstanceContributionToHitGroupIndex(const D3D12_RAYTRACING_INSTANCE_DESC * d)478 GRL_INLINE uint32_t D3D12_get_InstanceContributionToHitGroupIndex(const D3D12_RAYTRACING_INSTANCE_DESC *d)
479 {
480 return d->DW1 & ((1 << 24) - 1);
481 }
482
D3D12_get_InstanceFlags(const D3D12_RAYTRACING_INSTANCE_DESC * d)483 GRL_INLINE uint32_t D3D12_get_InstanceFlags(const D3D12_RAYTRACING_INSTANCE_DESC *d)
484 {
485 return d->DW1 >> 24;
486 }
487
D3D12_get_AccelerationStructure(const D3D12_RAYTRACING_INSTANCE_DESC * d)488 GRL_INLINE gpuva_t D3D12_get_AccelerationStructure(const D3D12_RAYTRACING_INSTANCE_DESC *d)
489 {
490 return (gpuva_t)d->AccelerationStructure;
491 }
492
D3D12_set_transform(D3D12_RAYTRACING_INSTANCE_DESC * d,const uint32_t row,const uint32_t column,float value)493 GRL_INLINE void D3D12_set_transform(D3D12_RAYTRACING_INSTANCE_DESC *d, const uint32_t row, const uint32_t column, float value)
494 {
495 d->Transform[row * 4 + column] = value;
496 }
497
D3D12_set_instanceID(D3D12_RAYTRACING_INSTANCE_DESC * d,const uint32_t id)498 GRL_INLINE void D3D12_set_instanceID(D3D12_RAYTRACING_INSTANCE_DESC *d, const uint32_t id)
499 {
500 d->DW0 &= 255 << 24;
501 d->DW0 |= id & ((1 << 24) - 1);
502 }
503
D3D12_set_InstanceMask(D3D12_RAYTRACING_INSTANCE_DESC * d,const uint32_t mask)504 GRL_INLINE void D3D12_set_InstanceMask(D3D12_RAYTRACING_INSTANCE_DESC *d, const uint32_t mask)
505 {
506 d->DW0 &= ((1 << 24) - 1);
507 d->DW0 |= mask << 24;
508 }
509
D3D12_set_InstanceContributionToHitGroupIndex(D3D12_RAYTRACING_INSTANCE_DESC * d,const uint32_t contribution)510 GRL_INLINE void D3D12_set_InstanceContributionToHitGroupIndex(D3D12_RAYTRACING_INSTANCE_DESC *d, const uint32_t contribution)
511 {
512 d->DW1 &= 255 << 24;
513 d->DW1 |= contribution & ((1 << 24) - 1);
514 }
515
D3D12_set_InstanceFlags(D3D12_RAYTRACING_INSTANCE_DESC * d,const uint32_t flags)516 GRL_INLINE void D3D12_set_InstanceFlags(D3D12_RAYTRACING_INSTANCE_DESC *d, const uint32_t flags)
517 {
518 d->DW1 &= ((1 << 24) - 1);
519 d->DW1 |= flags << 24;
520 }
521
D3D12_set_AccelerationStructure(D3D12_RAYTRACING_INSTANCE_DESC * d,gpuva_t address)522 GRL_INLINE void D3D12_set_AccelerationStructure(D3D12_RAYTRACING_INSTANCE_DESC *d, gpuva_t address)
523 {
524 d->AccelerationStructure = (global char*)address;
525 }
526