case nir_intrinsic_load_base_vertex:
case nir_intrinsic_load_first_vertex:
case nir_intrinsic_load_workgroup_size:
- case nir_intrinsic_load_tess_level_outer:
- case nir_intrinsic_load_tess_level_inner:
case nir_intrinsic_load_tess_level_outer_default:
case nir_intrinsic_load_tess_level_inner_default:
case nir_intrinsic_load_tess_rel_patch_id_amd:
break;
case nir_intrinsic_load_barycentric_at_sample: /* This loads sample positions. */
- case nir_intrinsic_load_tess_level_outer: /* TES input read from memory */
- case nir_intrinsic_load_tess_level_inner: /* TES input read from memory */
info->uses_vmem_load_other = true;
break;
info->tessfactors_are_def_in_all_invocs = are_tessfactors_def_in_all_invocs(nir);
}
+ /* tess factors are loaded as input instead of system value */
+ info->reads_tess_factors = nir->info.patch_inputs_read &
+ (BITFIELD64_BIT(VARYING_SLOT_TESS_LEVEL_INNER) |
+ BITFIELD64_BIT(VARYING_SLOT_TESS_LEVEL_OUTER));
+
info->uses_frontface = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_FRONT_FACE);
info->uses_instanceid = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_INSTANCE_ID);
info->uses_base_vertex = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_BASE_VERTEX);
info->uses_primid = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_PRIMITIVE_ID) ||
nir->info.inputs_read & VARYING_BIT_PRIMITIVE_ID;
info->reads_samplemask = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SAMPLE_MASK_IN);
- info->reads_tess_factors = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_TESS_LEVEL_INNER) ||
- BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_TESS_LEVEL_OUTER);
info->uses_linear_sample = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE);
info->uses_linear_centroid = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID);
info->uses_linear_center = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL);
info->output_usagemask[info->num_outputs] = 0x1;
}
- if (nir->info.stage == MESA_SHADER_TESS_EVAL) {
- /* This is a hack to simplify loading tess levels in TES. */
- info->input[info->num_inputs].semantic = VARYING_SLOT_TESS_LEVEL_OUTER;
- info->input[info->num_inputs + 1].semantic = VARYING_SLOT_TESS_LEVEL_INNER;
- }
-
if (nir->info.stage == MESA_SHADER_FRAGMENT) {
info->allow_flat_shading = !(info->uses_persp_center || info->uses_persp_centroid ||
info->uses_persp_sample || info->uses_linear_center ||
static LLVMValueRef si_llvm_load_intrinsic(struct ac_shader_abi *abi, nir_intrinsic_op op)
{
struct si_shader_context *ctx = si_shader_context_from_abi(abi);
- const struct si_shader_info *info = &ctx->shader->selector->info;
switch (op) {
case nir_intrinsic_load_first_vertex:
return ac_build_gather_values(&ctx->ac, chan, 3);
}
- case nir_intrinsic_load_tess_level_outer:
- return abi->load_tess_varyings(abi, ctx->ac.f32, NULL, NULL, info->num_inputs, 0, 4, true);
-
- case nir_intrinsic_load_tess_level_inner:
- return abi->load_tess_varyings(abi, ctx->ac.f32, NULL, NULL, info->num_inputs + 1, 0, 4, true);
-
case nir_intrinsic_load_tess_level_outer_default:
case nir_intrinsic_load_tess_level_inner_default: {
LLVMValueRef slot = LLVMConstInt(ctx->ac.i32, SI_HS_CONST_DEFAULT_TESS_LEVELS, 0);