@@ -2322,27 +2322,6 @@ float __attribute__((overloadable)) atomic_fetch_sub_explicit(volatile __global
2322
2322
#endif // CL_VERSION_2_0
2323
2323
#endif //defined(cl_intel_global_float_atomics)
2324
2324
2325
- #if defined(cl_intel_pvc_rt_validation )
2326
-
2327
- struct rtglobals_t ;
2328
- typedef __global struct rtglobals_t * rtglobals_t ;
2329
- struct rtfence_t ;
2330
- typedef __private struct rtfence_t * rtfence_t ;
2331
-
2332
- void * intel_get_rt_stack (rtglobals_t rt_dispatch_globals );
2333
-
2334
- void * intel_get_thread_btd_stack (rtglobals_t rt_dispatch_globals );
2335
-
2336
- void * intel_get_global_btd_stack (rtglobals_t rt_dispatch_globals );
2337
-
2338
- rtfence_t intel_dispatch_trace_ray_query (
2339
- rtglobals_t rt_dispatch_globals , uint bvh_level , uint traceRayCtrl );
2340
-
2341
- void intel_rt_sync (rtfence_t fence );
2342
-
2343
- global void * intel_get_implicit_dispatch_globals ();
2344
-
2345
- #endif // defined(cl_intel_pvc_rt_validation)
2346
2325
2347
2326
#ifdef cl_intel_subgroup_extended_block_read
2348
2327
ushort2 intel_subgroup_block_read_u8_m1k32v2 (__global void * base_address , int width , int height , int pitch , int2 coord );
@@ -2382,3 +2361,169 @@ void __attribute__((overloadable)) work_group_named_barrier(local NamedBarrier_t
2382
2361
2383
2362
void __attribute__((overloadable )) work_group_named_barrier (local NamedBarrier_t * barrier , cl_mem_fence_flags flags , memory_scope scope );
2384
2363
#endif // __OPENCL_C_VERSION__ >= CL_VERSION_2_0
2364
+
2365
+
2366
+ struct rtglobals_t ;
2367
+ typedef __global struct rtglobals_t * rtglobals_t ;
2368
+ struct rtfence_t ;
2369
+ typedef __private struct rtfence_t * rtfence_t ;
2370
+
2371
+ void * intel_get_rt_stack (rtglobals_t rt_dispatch_globals );
2372
+
2373
+ void * intel_get_thread_btd_stack (rtglobals_t rt_dispatch_globals );
2374
+
2375
+ void * intel_get_global_btd_stack (rtglobals_t rt_dispatch_globals );
2376
+
2377
+ rtfence_t intel_dispatch_trace_ray_query (
2378
+ rtglobals_t rt_dispatch_globals , uint bvh_level , uint traceRayCtrl );
2379
+
2380
+ void intel_rt_sync (rtfence_t fence );
2381
+
2382
+ global void * intel_get_implicit_dispatch_globals ();
2383
+
2384
+ // ----------- Raytracing production API code -----------
2385
+
2386
+ // --- Opaque types ---
2387
+ typedef private struct intel_ray_query_opaque_t * intel_ray_query_t ;
2388
+ typedef global struct intel_raytracing_acceleration_structure_opaque_t * intel_raytracing_acceleration_structure_t ;
2389
+
2390
+ // --- Enum and struct definitions ---
2391
+
2392
+ typedef enum // intel_ray_flags_t
2393
+ {
2394
+ intel_ray_flags_none = 0x00 ,
2395
+ intel_ray_flags_force_opaque =
2396
+ 0x01 , // forces geometry to be opaque (no anyhit shader invokation)
2397
+ intel_ray_flags_force_non_opaque =
2398
+ 0x02 , // forces geometry to be non-opqaue (invoke anyhit shader)
2399
+ intel_ray_flags_accept_first_hit_and_end_search =
2400
+ 0x04 , // terminates traversal on the first hit found (shadow rays)
2401
+ intel_ray_flags_skip_closest_hit_shader =
2402
+ 0x08 , // skip execution of the closest hit shader
2403
+ intel_ray_flags_cull_back_facing_triangles =
2404
+ 0x10 , // back facing triangles to not produce a hit
2405
+ intel_ray_flags_cull_front_facing_triangles =
2406
+ 0x20 , // front facing triangles do not produce a hit
2407
+ intel_ray_flags_cull_opaque = 0x40 , // opaque geometry does not produce a hit
2408
+ intel_ray_flags_cull_non_opaque = 0x80 , // non-opaque geometry does not produce a hit
2409
+ intel_ray_flags_skip_triangles = 0x100 , // treat all triangle intersections as misses.
2410
+ intel_ray_flags_skip_procedural_primitives =
2411
+ 0x200 , // skip execution of intersection shaders
2412
+ } intel_ray_flags_t ;
2413
+
2414
+ typedef enum intel_hit_type_t
2415
+ {
2416
+ intel_hit_type_committed_hit = 0 ,
2417
+ intel_hit_type_potential_hit = 1 ,
2418
+ } intel_hit_type_t ;
2419
+
2420
+ typedef enum
2421
+ {
2422
+ intel_raytracing_ext_flag_ray_query = 1 << 0 , // true if ray queries are supported
2423
+ } intel_raytracing_ext_flag_t ;
2424
+
2425
+ typedef struct // intel_float2
2426
+ {
2427
+ float x , y ;
2428
+ } intel_float2 ;
2429
+
2430
+ typedef struct // intel_float3
2431
+ {
2432
+ float x , y , z ;
2433
+ } intel_float3 ;
2434
+
2435
+ typedef struct // intel_float4x3
2436
+ {
2437
+ intel_float3 vx , vy , vz , p ;
2438
+ } intel_float4x3 ;
2439
+
2440
+ typedef struct // intel_ray_desc_t
2441
+ {
2442
+ intel_float3 origin ;
2443
+ intel_float3 direction ;
2444
+ float tmin ;
2445
+ float tmax ;
2446
+ uint mask ;
2447
+ intel_ray_flags_t flags ;
2448
+ } intel_ray_desc_t ;
2449
+
2450
+ // if traversal returns one can test if a triangle or procedural is hit
2451
+ typedef enum // intel_candidate_type_t
2452
+ {
2453
+ intel_candidate_type_triangle ,
2454
+ intel_candidate_type_procedural
2455
+ } intel_candidate_type_t ;
2456
+
2457
+ // --- API functions ---
2458
+
2459
+ // check supported ray tracing features
2460
+ intel_raytracing_ext_flag_t intel_get_raytracing_ext_flag ();
2461
+
2462
+ // initialize a ray query
2463
+ intel_ray_query_t intel_ray_query_init (
2464
+ intel_ray_desc_t ray , intel_raytracing_acceleration_structure_t accel );
2465
+
2466
+ // setup for instance traversal using a transformed ray and bottom-level AS
2467
+ void intel_ray_query_forward_ray (
2468
+ intel_ray_query_t query ,
2469
+ intel_ray_desc_t ray ,
2470
+ intel_raytracing_acceleration_structure_t accel );
2471
+
2472
+ // commit the potential hit
2473
+ void intel_ray_query_commit_potential_hit (intel_ray_query_t query );
2474
+
2475
+ // commit the potential hit and override hit distance and UVs
2476
+ void intel_ray_query_commit_potential_hit_override (
2477
+ intel_ray_query_t query , float override_hit_distance , intel_float2 override_uv );
2478
+
2479
+ // start traversal of a ray query
2480
+ void intel_ray_query_start_traversal (intel_ray_query_t query );
2481
+
2482
+ // Synchronize ray_query execution. If a ray was traversed,
2483
+ // this must be called prior to accessing the ray query.
2484
+ void intel_ray_query_sync (intel_ray_query_t query );
2485
+
2486
+ // Signal that a ray query will not be used further. This is the moral
2487
+ // equivalent of a delete. This function does an implicit sync.
2488
+ void intel_ray_query_abandon (intel_ray_query_t query );
2489
+
2490
+ // read hit information during shader execution
2491
+ uint intel_get_hit_bvh_level (intel_ray_query_t query , intel_hit_type_t hit_type );
2492
+ float intel_get_hit_distance (intel_ray_query_t query , intel_hit_type_t hit_type );
2493
+ intel_float2 intel_get_hit_barycentrics (intel_ray_query_t query , intel_hit_type_t hit_type );
2494
+ bool intel_get_hit_front_face (intel_ray_query_t query , intel_hit_type_t hit_type );
2495
+ uint intel_get_hit_geometry_id (intel_ray_query_t query , intel_hit_type_t hit_type );
2496
+ uint intel_get_hit_primitive_id (intel_ray_query_t query , intel_hit_type_t hit_type );
2497
+ uint intel_get_hit_triangle_primitive_id (
2498
+ intel_ray_query_t query ,
2499
+ intel_hit_type_t hit_type ); // fast path for triangles
2500
+ uint intel_get_hit_procedural_primitive_id (
2501
+ intel_ray_query_t query ,
2502
+ intel_hit_type_t hit_type ); // fast path for procedurals
2503
+ uint intel_get_hit_instance_id (intel_ray_query_t query , intel_hit_type_t hit_type );
2504
+ uint intel_get_hit_instance_user_id (intel_ray_query_t query , intel_hit_type_t hit_type );
2505
+ intel_float4x3 intel_get_hit_world_to_object (intel_ray_query_t query , intel_hit_type_t hit_type );
2506
+ intel_float4x3 intel_get_hit_object_to_world (intel_ray_query_t query , intel_hit_type_t hit_type );
2507
+
2508
+ intel_candidate_type_t intel_get_hit_candidate (intel_ray_query_t query , intel_hit_type_t hit_type );
2509
+
2510
+ // fetch triangle vertices for a hit
2511
+ void intel_get_hit_triangle_vertices (
2512
+ intel_ray_query_t query , intel_float3 vertices_out [3 ], intel_hit_type_t hit_type );
2513
+
2514
+ // Read ray-data. This is used to read transformed rays produced by HW
2515
+ // instancing pipeline during any-hit or intersection shader execution.
2516
+ intel_float3 intel_get_ray_origin (intel_ray_query_t query , uint bvh_level );
2517
+ intel_float3 intel_get_ray_direction (intel_ray_query_t query , uint bvh_level );
2518
+ float intel_get_ray_tmin (intel_ray_query_t query , uint bvh_level );
2519
+ intel_ray_flags_t intel_get_ray_flags (intel_ray_query_t query , uint bvh_level );
2520
+ int intel_get_ray_mask (intel_ray_query_t query , uint bvh_level );
2521
+
2522
+ // Test whether traversal has terminated. If false, the ray has reached
2523
+ // a procedural leaf or a non-opaque triangle leaf, and requires shader
2524
+ // processing.
2525
+ bool intel_is_traversal_done (intel_ray_query_t query );
2526
+
2527
+ // if traversal is done one can test for the presence of a committed hit to
2528
+ // either invoke miss or closest hit shader
2529
+ bool intel_has_committed_hit (intel_ray_query_t query );
0 commit comments