Skip to content

Commit 81bc370

Browse files
aratajewpszymich
authored andcommitted
Raytracing extension implementation
.
1 parent bc72454 commit 81bc370

File tree

15 files changed

+1354
-63
lines changed

15 files changed

+1354
-63
lines changed

IGC/BiFModule/CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,8 +427,8 @@ endif()
427427
file(GLOB_RECURSE _PRE_RELEASE_CL "${IGC_OPTION__BIF_SRC_OCL_DIR}/Languages/OpenCL/PreRelease/*.cl")
428428

429429

430-
set(IGC_BUILD__BIF_OCL_SHARED_INC "${IGC_OPTION__BIF_SRC_OCL_DIR}/Languages/OpenCL/opencl_cth_released.h")
431-
set(IGC_BUILD__BIF_OCL_SHARED_INC_PRE_RELEASE "${IGC_OPTION__BIF_SRC_OCL_DIR}/Languages/OpenCL/PreRelease/opencl_cth_pre_release.h")
430+
set(IGC_BUILD__BIF_OCL_SHARED_INC "${IGC_OPTION__BIF_SRC_OCL_DIR}/Languages/OpenCL/opencl_cth_released.h")
431+
set(IGC_BUILD__BIF_OCL_SHARED_INC_PRE_RELEASE "${IGC_OPTION__BIF_SRC_OCL_DIR}/Languages/OpenCL/PreRelease/opencl_cth_pre_release.h")
432432

433433
set(_concatScript "${IGC_SOURCE_DIR}/BiFModule/concat.py")
434434
set(IGC_BUILD__BIF_OCL_FORCE_INC "${IGC_BUILD__BIF_DIR}/opencl_cth.h")
@@ -448,6 +448,7 @@ add_custom_command(
448448
set(IGC_BUILD__BIF_OCL_COMMON_INC_DIRS
449449
"${IGC_OPTION__BIF_SRC_OCL_DIR}/Languages/OpenCL"
450450
"${IGC_OPTION__BIF_SRC_OCL_DIR}/Languages/OpenCL/PointerSize"
451+
"${IGC_OPTION__BIF_SRC_OCL_DIR}/Languages/OpenCL/Raytracing"
451452
"${IGC_OPTION__BIF_SRC_OCL_DIR}/Headers"
452453
"${CMAKE_CURRENT_SOURCE_DIR}/../AdaptorOCL/ocl_igc_shared/device_enqueue"
453454
)

IGC/BiFModule/Implementation/IBiF_Impl.cl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,3 @@ SPDX-License-Identifier: MIT
110110
// Tile ID Extension Opcodes
111111
//*****************************************************************************/
112112
#include "tileid.cl"
113-

IGC/BiFModule/Implementation/IGCBiF_Intrinsics.cl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,8 +859,39 @@ void __builtin_IB_system_memfence(bool fence_typed_memory);
859859
// i64 CAS SLM atomic (PVC+)
860860
long __builtin_IB_atomic_cmpxchg_local_i64(__local long*, long, long);
861861

862+
// -----------------helpers for intel_rt_production--------------------
863+
864+
rtfence_t __builtin_IB_intel_query_rt_fence(intel_ray_query_t rayquery);
865+
rtglobals_t __builtin_IB_intel_query_rt_globals(intel_ray_query_t rayquery);
866+
global void* __builtin_IB_intel_query_rt_stack(intel_ray_query_t rayquery);
867+
uint __builtin_IB_intel_query_ctrl(intel_ray_query_t rayquery);
868+
uint __builtin_IB_intel_query_bvh_level(intel_ray_query_t rayquery);
869+
870+
intel_ray_query_t __builtin_IB_intel_init_ray_query(
871+
rtfence_t fence,
872+
rtglobals_t rtglobals,
873+
global void* rtstack,
874+
uint ctrl,
875+
uint bvhLevel);
876+
877+
void __builtin_IB_intel_update_ray_query(
878+
intel_ray_query_t rayquery,
879+
rtfence_t fence,
880+
rtglobals_t rtglobals,
881+
global void* rtstack,
882+
uint ctrl,
883+
uint bvhLevel);
884+
885+
// --------------------------------------------------------------------
886+
862887
#ifdef cl_intel_pvc_rt_validation
863888
// PVC raytracing extensions
889+
890+
struct rtglobals_t;
891+
typedef __global struct rtglobals_t *rtglobals_t;
892+
struct rtfence_t;
893+
typedef __private struct rtfence_t *rtfence_t;
894+
864895
void* __builtin_IB_intel_get_rt_stack(rtglobals_t rt_dispatch_globals);
865896
void* __builtin_IB_intel_get_thread_btd_stack(rtglobals_t rt_dispatch_globals);
866897
void* __builtin_IB_intel_get_global_btd_stack(rtglobals_t rt_dispatch_globals);

IGC/BiFModule/Languages/OpenCL/IBiF_Impl.cl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ SPDX-License-Identifier: MIT
7272
//*****************************************************************************/
7373
#include "IBiF_Atomics.cl"
7474

75+
//*****************************************************************************/
76+
// Intel raytracing extension
77+
//*****************************************************************************/
78+
#include "IBiF_intel_rt_production.cl"
79+
7580

7681
//*****************************************************************************/
7782
// Work-Item function

IGC/BiFModule/Languages/OpenCL/PreRelease/IBIF_PreRelease_Impl.cl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,3 @@ SPDX-License-Identifier: MIT
4646
//*****************************************************************************/
4747
#include "IBiF_Dot_Product.cl"
4848

49-

IGC/BiFModule/Languages/OpenCL/PreRelease/IBiF_raytracing.cl

Lines changed: 0 additions & 36 deletions
This file was deleted.

IGC/BiFModule/Languages/OpenCL/PreRelease/opencl_cth_pre_release.h

Lines changed: 166 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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
23482327
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
23822361

23832362
void __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

Comments
 (0)