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:
Jason Ekstrand
2020-05-13 13:56:03 -05:00
committed by Marge Bot
parent ed907e5d84
commit 46cd91bb45
5 changed files with 152 additions and 0 deletions

View File

@@ -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");
} }

View File

@@ -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

View File

@@ -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),
}; };

View File

@@ -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

View File

@@ -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);