@@ -12,7 +12,7 @@ SPDX-License-Identifier: MIT
12
12
#if defined(cl_intel_rt_production )
13
13
14
14
void __basic_rtstack_init (
15
- global RTStack * rtStack ,
15
+ global void * rtStack ,
16
16
global HWAccel * hwaccel ,
17
17
intel_float3 origin ,
18
18
intel_float3 direction ,
@@ -23,38 +23,41 @@ void __basic_rtstack_init(
23
23
{
24
24
unsigned int bvh_level = 0 ;
25
25
/* init ray */
26
- rtStack -> ray [bvh_level ].org [0 ] = origin .x ;
27
- rtStack -> ray [bvh_level ].org [1 ] = origin .y ;
28
- rtStack -> ray [bvh_level ].org [2 ] = origin .z ;
29
- rtStack -> ray [bvh_level ].dir [0 ] = direction .x ;
30
- rtStack -> ray [bvh_level ].dir [1 ] = direction .y ;
31
- rtStack -> ray [bvh_level ].dir [2 ] = direction .z ;
32
- rtStack -> ray [bvh_level ].tnear = tmin ;
33
- rtStack -> ray [bvh_level ].tfar = tmax ;
34
-
35
- rtStack -> ray [bvh_level ].data [1 ] = 0 ;
36
- rtStack -> ray [bvh_level ].data [2 ] = 0 ;
37
- rtStack -> ray [bvh_level ].data [3 ] = 0 ;
38
-
39
- MemRay_setRootNodePtr (& rtStack -> ray [bvh_level ], (ulong )hwaccel + 128 );
40
- MemRay_setRayFlags (& rtStack -> ray [bvh_level ], flags );
41
- MemRay_setRayMask (& rtStack -> ray [bvh_level ], mask );
42
-
43
- MemHit_clearUV (& rtStack -> hit [COMMITTED ]);
44
- rtStack -> hit [COMMITTED ].t = INFINITY ;
45
- rtStack -> hit [COMMITTED ].data0 = 0 ;
46
- MemHit_setValid (& rtStack -> hit [COMMITTED ], 0 );
47
- MemHit_setDone (& rtStack -> hit [COMMITTED ], 0 );
48
-
49
- MemHit_clearUV (& rtStack -> hit [POTENTIAL ]);
50
- rtStack -> hit [POTENTIAL ].t = INFINITY ;
51
- rtStack -> hit [POTENTIAL ].data0 = 0 ;
52
- MemHit_setValid (& rtStack -> hit [POTENTIAL ], 1 );
53
- MemHit_setDone (& rtStack -> hit [POTENTIAL ], 1 );
26
+ MemRay * memRay = get_rt_stack_ray (rtStack , bvh_level );
27
+ memRay -> org [0 ] = origin .x ;
28
+ memRay -> org [1 ] = origin .y ;
29
+ memRay -> org [2 ] = origin .z ;
30
+ memRay -> dir [0 ] = direction .x ;
31
+ memRay -> dir [1 ] = direction .y ;
32
+ memRay -> dir [2 ] = direction .z ;
33
+ memRay -> tnear = tmin ;
34
+ memRay -> tfar = tmax ;
35
+
36
+ memRay -> data [1 ] = 0 ;
37
+ memRay -> data [2 ] = 0 ;
38
+ memRay -> data [3 ] = 0 ;
39
+
40
+ MemRay_setRootNodePtr (memRay , (ulong )hwaccel + 128 );
41
+ MemRay_setRayFlags (memRay , flags );
42
+ MemRay_setRayMask (memRay , mask );
43
+
44
+ MemHit * commitedHit = get_rt_stack_hit (rtStack , intel_hit_type_committed_hit );
45
+ MemHit_clearUV (commitedHit );
46
+ commitedHit -> t = INFINITY ;
47
+ commitedHit -> data0 = 0 ;
48
+ MemHit_setValid (commitedHit , 0 );
49
+ MemHit_setDone (commitedHit , 0 );
50
+
51
+ MemHit * potentialHit = get_rt_stack_hit (rtStack , intel_hit_type_potential_hit );
52
+ MemHit_clearUV (potentialHit );
53
+ potentialHit -> t = INFINITY ;
54
+ potentialHit -> data0 = 0 ;
55
+ MemHit_setValid (potentialHit , 1 );
56
+ MemHit_setDone (potentialHit , 1 );
54
57
}
55
58
56
59
void __basic_ray_forward (
57
- global RTStack * rtStack ,
60
+ global void * rtStack ,
58
61
HWAccel * hwaccel ,
59
62
uint bvhLevel ,
60
63
intel_float3 origin ,
@@ -64,22 +67,23 @@ void __basic_ray_forward(
64
67
uint mask ,
65
68
intel_ray_flags_t flags )
66
69
{
67
- rtStack -> ray [bvhLevel ].org [0 ] = origin .x ;
68
- rtStack -> ray [bvhLevel ].org [1 ] = origin .y ;
69
- rtStack -> ray [bvhLevel ].org [2 ] = origin .z ;
70
- rtStack -> ray [bvhLevel ].dir [0 ] = direction .x ;
71
- rtStack -> ray [bvhLevel ].dir [1 ] = direction .y ;
72
- rtStack -> ray [bvhLevel ].dir [2 ] = direction .z ;
73
- rtStack -> ray [bvhLevel ].tnear = tmin ;
74
- rtStack -> ray [bvhLevel ].tfar = tmax ;
75
-
76
- rtStack -> ray [bvhLevel ].data [1 ] = 0 ;
77
- rtStack -> ray [bvhLevel ].data [2 ] = 0 ;
78
- rtStack -> ray [bvhLevel ].data [3 ] = 0 ;
79
-
80
- MemRay_setRootNodePtr (& rtStack -> ray [bvhLevel ], (ulong )hwaccel + 128 );
81
- MemRay_setRayFlags (& rtStack -> ray [bvhLevel ], flags );
82
- MemRay_setRayMask (& rtStack -> ray [bvhLevel ], mask );
70
+ MemRay * memRay = get_rt_stack_ray (rtStack , bvhLevel );
71
+ memRay -> org [0 ] = origin .x ;
72
+ memRay -> org [1 ] = origin .y ;
73
+ memRay -> org [2 ] = origin .z ;
74
+ memRay -> dir [0 ] = direction .x ;
75
+ memRay -> dir [1 ] = direction .y ;
76
+ memRay -> dir [2 ] = direction .z ;
77
+ memRay -> tnear = tmin ;
78
+ memRay -> tfar = tmax ;
79
+
80
+ memRay -> data [1 ] = 0 ;
81
+ memRay -> data [2 ] = 0 ;
82
+ memRay -> data [3 ] = 0 ;
83
+
84
+ MemRay_setRootNodePtr (memRay , (ulong )hwaccel + 128 );
85
+ MemRay_setRayFlags (memRay , flags );
86
+ MemRay_setRayMask (memRay , mask );
83
87
}
84
88
85
89
typedef enum
@@ -97,8 +101,7 @@ intel_ray_query_t intel_ray_query_init(
97
101
{
98
102
global HWAccel * hwaccel = to_global ((HWAccel * )accel );
99
103
rtglobals_t dispatchGlobalsPtr = (rtglobals_t ) __getImplicitDispatchGlobals ();
100
- global RTStack * rtStack =
101
- to_global ((RTStack * )__builtin_IB_intel_get_rt_stack (dispatchGlobalsPtr ));
104
+ global void * rtStack = to_global (__builtin_IB_intel_get_rt_stack (dispatchGlobalsPtr ));
102
105
103
106
__basic_rtstack_init (rtStack , hwaccel , ray .origin , ray .direction , ray .tmin , ray .tmax , ray .mask , ray .flags );
104
107
@@ -119,7 +122,7 @@ void intel_ray_query_forward_ray(
119
122
intel_raytracing_acceleration_structure_t accel_i )
120
123
{
121
124
HWAccel * hwaccel = (HWAccel * )accel_i ;
122
- global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
125
+ global void * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
123
126
124
127
/* init ray */
125
128
uint bvh_level = __builtin_IB_intel_query_bvh_level (rayquery ) + 1 ;
@@ -139,15 +142,18 @@ void intel_ray_query_forward_ray(
139
142
140
143
void intel_ray_query_commit_potential_hit (intel_ray_query_t rayquery )
141
144
{
142
- global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
145
+ global void * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
143
146
144
147
uint bvh_level = __builtin_IB_intel_query_bvh_level (rayquery );
145
- uint rflags = MemRay_getRayFlags (& rtStack -> ray [bvh_level ]);
148
+ MemRay * memRay = get_rt_stack_ray (rtStack , bvh_level );
149
+ uint rflags = MemRay_getRayFlags (memRay );
146
150
151
+ MemHit * commitedHit = get_rt_stack_hit (rtStack , intel_hit_type_committed_hit );
152
+ MemHit * potentialHit = get_rt_stack_hit (rtStack , intel_hit_type_potential_hit );
147
153
if (rflags & intel_ray_flags_accept_first_hit_and_end_search )
148
154
{
149
- rtStack -> hit [ COMMITTED ] = rtStack -> hit [ POTENTIAL ] ;
150
- MemHit_setValid (& rtStack -> hit [ COMMITTED ] , 1 );
155
+ * commitedHit = * potentialHit ;
156
+ MemHit_setValid (commitedHit , 1 );
151
157
152
158
__builtin_IB_intel_update_ray_query (
153
159
rayquery ,
@@ -160,7 +166,7 @@ void intel_ray_query_commit_potential_hit(intel_ray_query_t rayquery)
160
166
}
161
167
else
162
168
{
163
- MemHit_setValid (& rtStack -> hit [ POTENTIAL ] , 1 ); // FIXME: is this required?
169
+ MemHit_setValid (potentialHit , 1 ); // FIXME: is this required?
164
170
165
171
__builtin_IB_intel_update_ray_query (
166
172
rayquery ,
@@ -176,19 +182,20 @@ void intel_ray_query_commit_potential_hit(intel_ray_query_t rayquery)
176
182
void intel_ray_query_commit_potential_hit_override (
177
183
intel_ray_query_t rayquery , float override_hit_distance , intel_float2 override_uv )
178
184
{
179
- global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
180
- rtStack -> hit [POTENTIAL ].t = override_hit_distance ;
181
- MemHit_setUV (& rtStack -> hit [POTENTIAL ], override_uv .x , override_uv .y );
185
+ global void * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
186
+ MemHit * potentialHit = get_rt_stack_hit (rtStack , intel_hit_type_potential_hit );
187
+ potentialHit -> t = override_hit_distance ;
188
+ MemHit_setUV (potentialHit , override_uv .x , override_uv .y );
182
189
intel_ray_query_commit_potential_hit (rayquery );
183
190
}
184
191
185
192
void intel_ray_query_start_traversal (intel_ray_query_t rayquery )
186
193
{
187
194
rtglobals_t dispatchGlobalsPtr = __builtin_IB_intel_query_rt_globals (rayquery );
188
- global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
189
-
190
- MemHit_setDone (& rtStack -> hit [ POTENTIAL ] , 1 );
191
- MemHit_setValid (& rtStack -> hit [ POTENTIAL ] , 1 );
195
+ global void * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
196
+ MemHit * potentialHit = get_rt_stack_hit ( rtStack , intel_hit_type_potential_hit );
197
+ MemHit_setDone (potentialHit , 1 );
198
+ MemHit_setValid (potentialHit , 1 );
192
199
193
200
TraceRayCtrl ctrl = __builtin_IB_intel_query_ctrl (rayquery );
194
201
@@ -214,9 +221,9 @@ void intel_ray_query_sync(intel_ray_query_t rayquery)
214
221
rtfence_t fence = __builtin_IB_intel_query_rt_fence (rayquery );
215
222
__builtin_IB_intel_rt_sync (fence );
216
223
217
- global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
218
-
219
- uint bvh_level = MemHit_getBvhLevel (& rtStack -> hit [ POTENTIAL ] );
224
+ global void * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
225
+ MemHit * potentialHit = get_rt_stack_hit ( rtStack , intel_hit_type_potential_hit );
226
+ uint bvh_level = MemHit_getBvhLevel (potentialHit );
220
227
221
228
__builtin_IB_intel_update_ray_query (
222
229
rayquery ,
@@ -397,39 +404,42 @@ void intel_get_hit_triangle_vertices(
397
404
// during any-hit or intersection shader execution.
398
405
intel_float3 intel_get_ray_origin (intel_ray_query_t rayquery , uint bvh_level )
399
406
{
400
- global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
407
+ global void * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
401
408
402
- global MemRay * ray = & rtStack -> ray [ bvh_level ] ;
403
- return (intel_float3 ){ray -> org [0 ], ray -> org [1 ], ray -> org [2 ]};
409
+ MemRay * memRay = get_rt_stack_ray ( rtStack , bvh_level ) ;
410
+ return (intel_float3 ){memRay -> org [0 ], memRay -> org [1 ], memRay -> org [2 ]};
404
411
}
405
412
406
413
intel_float3 intel_get_ray_direction (intel_ray_query_t rayquery , uint bvh_level )
407
414
{
408
415
global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
409
416
410
- global MemRay * ray = & rtStack -> ray [ bvh_level ] ;
411
- return (intel_float3 ){ray -> dir [0 ], ray -> dir [1 ], ray -> dir [2 ]};
417
+ MemRay * memRay = get_rt_stack_ray ( rtStack , bvh_level ) ;
418
+ return (intel_float3 ){memRay -> dir [0 ], memRay -> dir [1 ], memRay -> dir [2 ]};
412
419
}
413
420
414
421
float intel_get_ray_tmin (intel_ray_query_t rayquery , uint bvh_level )
415
422
{
416
- global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
423
+ global void * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
417
424
418
- return rtStack -> ray [bvh_level ].tnear ;
425
+ MemRay * memRay = get_rt_stack_ray (rtStack , bvh_level );
426
+ return memRay -> tnear ;
419
427
}
420
428
421
429
intel_ray_flags_t intel_get_ray_flags (intel_ray_query_t rayquery , uint bvh_level )
422
430
{
423
- global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
431
+ global void * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
424
432
425
- return (intel_ray_flags_t )MemRay_getRayFlags (& rtStack -> ray [bvh_level ]);
433
+ MemRay * memRay = get_rt_stack_ray (rtStack , bvh_level );
434
+ return (intel_ray_flags_t )MemRay_getRayFlags (memRay );
426
435
}
427
436
428
437
int intel_get_ray_mask (intel_ray_query_t rayquery , uint bvh_level )
429
438
{
430
- global RTStack * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
439
+ global void * rtStack = __builtin_IB_intel_query_rt_stack (rayquery );
431
440
432
- return MemRay_getRayMask (& rtStack -> ray [bvh_level ]);
441
+ MemRay * memRay = get_rt_stack_ray (rtStack , bvh_level );
442
+ return MemRay_getRayMask (memRay );
433
443
}
434
444
435
445
// Test whether traversal has terminated. If false, the ray has reached
0 commit comments