xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/grl/gpu/d3d12.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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