diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index bf1315abeae..f261711517f 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2216,6 +2216,30 @@ nir_intrinsic_from_system_value(gl_system_value val) return nir_intrinsic_load_work_dim; case SYSTEM_VALUE_USER_DATA_AMD: return nir_intrinsic_load_user_data_amd; + case SYSTEM_VALUE_RAY_LAUNCH_ID: + return nir_intrinsic_load_ray_launch_id; + case SYSTEM_VALUE_RAY_LAUNCH_SIZE: + return nir_intrinsic_load_ray_launch_size; + case SYSTEM_VALUE_RAY_WORLD_ORIGIN: + return nir_intrinsic_load_ray_world_origin; + case SYSTEM_VALUE_RAY_WORLD_DIRECTION: + return nir_intrinsic_load_ray_world_direction; + case SYSTEM_VALUE_RAY_OBJECT_ORIGIN: + return nir_intrinsic_load_ray_object_origin; + case SYSTEM_VALUE_RAY_OBJECT_DIRECTION: + return nir_intrinsic_load_ray_object_direction; + case SYSTEM_VALUE_RAY_T_MIN: + return nir_intrinsic_load_ray_t_min; + case SYSTEM_VALUE_RAY_T_MAX: + return nir_intrinsic_load_ray_t_max; + case SYSTEM_VALUE_RAY_HIT_KIND: + return nir_intrinsic_load_ray_hit_kind; + case SYSTEM_VALUE_RAY_FLAGS: + return nir_intrinsic_load_ray_flags; + case SYSTEM_VALUE_RAY_GEOMETRY_INDEX: + return nir_intrinsic_load_ray_geometry_index; + case SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX: + return nir_intrinsic_load_ray_instance_custom_index; default: unreachable("system value does not directly correspond to intrinsic"); } @@ -2323,6 +2347,30 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin) return SYSTEM_VALUE_GS_HEADER_IR3; case nir_intrinsic_load_tcs_header_ir3: return SYSTEM_VALUE_TCS_HEADER_IR3; + case nir_intrinsic_load_ray_launch_id: + return SYSTEM_VALUE_RAY_LAUNCH_ID; + case nir_intrinsic_load_ray_launch_size: + return SYSTEM_VALUE_RAY_LAUNCH_SIZE; + case nir_intrinsic_load_ray_world_origin: + return SYSTEM_VALUE_RAY_WORLD_ORIGIN; + case nir_intrinsic_load_ray_world_direction: + return SYSTEM_VALUE_RAY_WORLD_DIRECTION; + case nir_intrinsic_load_ray_object_origin: + return SYSTEM_VALUE_RAY_OBJECT_ORIGIN; + case nir_intrinsic_load_ray_object_direction: + return SYSTEM_VALUE_RAY_OBJECT_DIRECTION; + case nir_intrinsic_load_ray_t_min: + return SYSTEM_VALUE_RAY_T_MIN; + case nir_intrinsic_load_ray_t_max: + return SYSTEM_VALUE_RAY_T_MAX; + case nir_intrinsic_load_ray_hit_kind: + return SYSTEM_VALUE_RAY_HIT_KIND; + case nir_intrinsic_load_ray_flags: + return SYSTEM_VALUE_RAY_FLAGS; + case nir_intrinsic_load_ray_geometry_index: + return SYSTEM_VALUE_RAY_GEOMETRY_INDEX; + case nir_intrinsic_load_ray_instance_custom_index: + return SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX; default: unreachable("intrinsic doesn't produce a system value"); } diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index dc5bcaac74c..d136687e19f 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -658,6 +658,20 @@ system_value("scratch_base_ptr", 0, bit_sizes=[32,64], indices=[BASE]) system_value("constant_base_ptr", 0, bit_sizes=[32,64]) system_value("shared_base_ptr", 0, bit_sizes=[32,64]) +# System values for ray tracing. +system_value("ray_launch_id", 3) +system_value("ray_launch_size", 3) +system_value("ray_world_origin", 3) +system_value("ray_world_direction", 3) +system_value("ray_object_origin", 3) +system_value("ray_object_direction", 3) +system_value("ray_t_min", 1) +system_value("ray_t_max", 1) +system_value("ray_hit_kind", 1) +system_value("ray_flags", 1) +system_value("ray_geometry_index", 1) +system_value("ray_instance_custom_index", 1) + # Driver-specific viewport scale/offset parameters. # # VC4 and V3D need to emit a scaled version of the position in the vertex diff --git a/src/compiler/shader_enums.c b/src/compiler/shader_enums.c index ccea8692833..7114877f73b 100644 --- a/src/compiler/shader_enums.c +++ b/src/compiler/shader_enums.c @@ -289,6 +289,19 @@ gl_system_value_name(gl_system_value sysval) ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID), ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE), ENUM(SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL), + ENUM(SYSTEM_VALUE_RAY_LAUNCH_ID), + ENUM(SYSTEM_VALUE_RAY_LAUNCH_SIZE), + ENUM(SYSTEM_VALUE_RAY_WORLD_ORIGIN), + ENUM(SYSTEM_VALUE_RAY_WORLD_DIRECTION), + ENUM(SYSTEM_VALUE_RAY_OBJECT_ORIGIN), + ENUM(SYSTEM_VALUE_RAY_OBJECT_DIRECTION), + ENUM(SYSTEM_VALUE_RAY_T_MIN), + ENUM(SYSTEM_VALUE_RAY_T_MAX), + ENUM(SYSTEM_VALUE_RAY_OBJECT_TO_WORLD), + ENUM(SYSTEM_VALUE_RAY_WORLD_TO_OBJECT), + ENUM(SYSTEM_VALUE_RAY_HIT_KIND), + ENUM(SYSTEM_VALUE_RAY_FLAGS), + ENUM(SYSTEM_VALUE_RAY_GEOMETRY_INDEX), ENUM(SYSTEM_VALUE_GS_HEADER_IR3), ENUM(SYSTEM_VALUE_TCS_HEADER_IR3), }; diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h index ced516ff57f..5bab7fed120 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -669,6 +669,26 @@ typedef enum SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE, SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL, + /** + * \name Ray tracing shader system values + */ + /*@{*/ + SYSTEM_VALUE_RAY_LAUNCH_ID, + SYSTEM_VALUE_RAY_LAUNCH_SIZE, + SYSTEM_VALUE_RAY_WORLD_ORIGIN, + SYSTEM_VALUE_RAY_WORLD_DIRECTION, + SYSTEM_VALUE_RAY_OBJECT_ORIGIN, + SYSTEM_VALUE_RAY_OBJECT_DIRECTION, + SYSTEM_VALUE_RAY_T_MIN, + SYSTEM_VALUE_RAY_T_MAX, + SYSTEM_VALUE_RAY_OBJECT_TO_WORLD, + SYSTEM_VALUE_RAY_WORLD_TO_OBJECT, + SYSTEM_VALUE_RAY_HIT_KIND, + SYSTEM_VALUE_RAY_FLAGS, + SYSTEM_VALUE_RAY_GEOMETRY_INDEX, + SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX, + /*@}*/ + /** * IR3 specific geometry shader and tesselation control shader system * values that packs invocation id, thread id and vertex id. Having this diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 5149d37b77e..33118d0a228 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -1039,6 +1039,63 @@ vtn_get_builtin_location(struct vtn_builder *b, *location = SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL; set_mode_system_value(b, mode); break; + case SpvBuiltInLaunchIdKHR: + *location = SYSTEM_VALUE_RAY_LAUNCH_ID; + set_mode_system_value(b, mode); + break; + case SpvBuiltInLaunchSizeKHR: + *location = SYSTEM_VALUE_RAY_LAUNCH_SIZE; + set_mode_system_value(b, mode); + break; + case SpvBuiltInWorldRayOriginKHR: + *location = SYSTEM_VALUE_RAY_WORLD_ORIGIN; + set_mode_system_value(b, mode); + break; + case SpvBuiltInWorldRayDirectionKHR: + *location = SYSTEM_VALUE_RAY_WORLD_DIRECTION; + set_mode_system_value(b, mode); + break; + case SpvBuiltInObjectRayOriginKHR: + *location = SYSTEM_VALUE_RAY_OBJECT_ORIGIN; + set_mode_system_value(b, mode); + break; + case SpvBuiltInObjectRayDirectionKHR: + *location = SYSTEM_VALUE_RAY_OBJECT_DIRECTION; + set_mode_system_value(b, mode); + break; + case SpvBuiltInObjectToWorldKHR: + *location = SYSTEM_VALUE_RAY_OBJECT_TO_WORLD; + set_mode_system_value(b, mode); + break; + case SpvBuiltInWorldToObjectKHR: + *location = SYSTEM_VALUE_RAY_WORLD_TO_OBJECT; + set_mode_system_value(b, mode); + break; + case SpvBuiltInRayTminKHR: + *location = SYSTEM_VALUE_RAY_T_MIN; + set_mode_system_value(b, mode); + break; + case SpvBuiltInRayTmaxKHR: + case SpvBuiltInHitTNV: + *location = SYSTEM_VALUE_RAY_T_MAX; + set_mode_system_value(b, mode); + break; + case SpvBuiltInInstanceCustomIndexKHR: + *location = SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX; + set_mode_system_value(b, mode); + break; + case SpvBuiltInHitKindKHR: + *location = SYSTEM_VALUE_RAY_HIT_KIND; + set_mode_system_value(b, mode); + break; + case SpvBuiltInIncomingRayFlagsKHR: + *location = SYSTEM_VALUE_RAY_FLAGS; + set_mode_system_value(b, mode); + break; + case SpvBuiltInRayGeometryIndexKHR: + *location = SYSTEM_VALUE_RAY_GEOMETRY_INDEX; + set_mode_system_value(b, mode); + break; default: vtn_fail("Unsupported builtin: %s (%u)", spirv_builtin_to_string(builtin), builtin);