@@ -2322,27 +2322,6 @@ float __attribute__((overloadable)) atomic_fetch_sub_explicit(volatile __global
23222322#endif // CL_VERSION_2_0
23232323#endif //defined(cl_intel_global_float_atomics)
23242324
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)
23462325
23472326#ifdef cl_intel_subgroup_extended_block_read
23482327ushort2 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
23822361
23832362void __attribute__((overloadable )) work_group_named_barrier (local NamedBarrier_t * barrier , cl_mem_fence_flags flags , memory_scope scope );
23842363#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