spirv,nir: Add support for ray-tracing built-ins
Missing in this commit are NIR intrinsics for the ObjectToWorld and WorldToObject built-ins. Those are matrices and so they take a bit more work and justify a separate commit. For now, we add the enums and leave the SYSTEM_VALUE <-> nir_intrinsic conversion commented out. Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6479>
This commit is contained in:

committed by
Marge Bot

parent
ed907e5d84
commit
46cd91bb45
@@ -2216,6 +2216,30 @@ nir_intrinsic_from_system_value(gl_system_value val)
|
|||||||
return nir_intrinsic_load_work_dim;
|
return nir_intrinsic_load_work_dim;
|
||||||
case SYSTEM_VALUE_USER_DATA_AMD:
|
case SYSTEM_VALUE_USER_DATA_AMD:
|
||||||
return nir_intrinsic_load_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:
|
default:
|
||||||
unreachable("system value does not directly correspond to intrinsic");
|
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;
|
return SYSTEM_VALUE_GS_HEADER_IR3;
|
||||||
case nir_intrinsic_load_tcs_header_ir3:
|
case nir_intrinsic_load_tcs_header_ir3:
|
||||||
return SYSTEM_VALUE_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:
|
default:
|
||||||
unreachable("intrinsic doesn't produce a system value");
|
unreachable("intrinsic doesn't produce a system value");
|
||||||
}
|
}
|
||||||
|
@@ -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("constant_base_ptr", 0, bit_sizes=[32,64])
|
||||||
system_value("shared_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.
|
# Driver-specific viewport scale/offset parameters.
|
||||||
#
|
#
|
||||||
# VC4 and V3D need to emit a scaled version of the position in the vertex
|
# VC4 and V3D need to emit a scaled version of the position in the vertex
|
||||||
|
@@ -289,6 +289,19 @@ gl_system_value_name(gl_system_value sysval)
|
|||||||
ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID),
|
ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID),
|
||||||
ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE),
|
ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE),
|
||||||
ENUM(SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL),
|
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_GS_HEADER_IR3),
|
||||||
ENUM(SYSTEM_VALUE_TCS_HEADER_IR3),
|
ENUM(SYSTEM_VALUE_TCS_HEADER_IR3),
|
||||||
};
|
};
|
||||||
|
@@ -669,6 +669,26 @@ typedef enum
|
|||||||
SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE,
|
SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE,
|
||||||
SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL,
|
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
|
* IR3 specific geometry shader and tesselation control shader system
|
||||||
* values that packs invocation id, thread id and vertex id. Having this
|
* values that packs invocation id, thread id and vertex id. Having this
|
||||||
|
@@ -1039,6 +1039,63 @@ vtn_get_builtin_location(struct vtn_builder *b,
|
|||||||
*location = SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL;
|
*location = SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL;
|
||||||
set_mode_system_value(b, mode);
|
set_mode_system_value(b, mode);
|
||||||
break;
|
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:
|
default:
|
||||||
vtn_fail("Unsupported builtin: %s (%u)",
|
vtn_fail("Unsupported builtin: %s (%u)",
|
||||||
spirv_builtin_to_string(builtin), builtin);
|
spirv_builtin_to_string(builtin), builtin);
|
||||||
|
Reference in New Issue
Block a user