iris_update_draw_info(struct iris_context *ice,
const struct pipe_draw_info *info)
{
- if (ice->state.prim_mode != info->mode ||
- ice->state.vertices_per_patch != info->vertices_per_patch) {
+ if (ice->state.prim_mode != info->mode) {
ice->state.prim_mode = info->mode;
+ ice->state.dirty |= IRIS_DIRTY_VF_TOPOLOGY;
+ }
+
+ if (info->mode == PIPE_PRIM_PATCHES &&
+ ice->state.vertices_per_patch != info->vertices_per_patch) {
ice->state.vertices_per_patch = info->vertices_per_patch;
ice->state.dirty |= IRIS_DIRTY_VF_TOPOLOGY;
+
+ /* Flag constants dirty for gl_PatchVerticesIn if needed. */
+ const struct shader_info *tcs_info =
+ iris_get_shader_info(ice, MESA_SHADER_TESS_CTRL);
+ if (tcs_info &&
+ tcs_info->system_values_read & (1ull << SYSTEM_VALUE_VERTICES_IN)) {
+ ice->state.dirty |= IRIS_DIRTY_CONSTANTS_TCS;
+ ice->state.shaders[MESA_SHADER_TESS_CTRL].cbuf0_needs_upload = true;
+ }
}
if (ice->state.primitive_restart != info->primitive_restart ||
}
break;
}
+ case nir_intrinsic_load_patch_vertices_in:
+ system_values[num_system_values++] =
+ BRW_PARAM_BUILTIN_PATCH_VERTICES_IN;
+ break;
default:
continue;
}
int plane = BRW_PARAM_BUILTIN_CLIP_PLANE_IDX(sysval);
int comp = BRW_PARAM_BUILTIN_CLIP_PLANE_COMP(sysval);
value = fui(ice->state.clip_planes.ucp[plane][comp]);
+ } else if (sysval == BRW_PARAM_BUILTIN_PATCH_VERTICES_IN) {
+ if (stage == MESA_SHADER_TESS_CTRL) {
+ value = ice->state.vertices_per_patch;
+ } else {
+ assert(stage == MESA_SHADER_TESS_EVAL);
+ const struct shader_info *tcs_info =
+ iris_get_shader_info(ice, MESA_SHADER_TESS_CTRL);
+ assert(tcs_info);
+
+ value = tcs_info->tess.tcs_vertices_out;
+ }
} else {
assert(!"unhandled system value");
}
BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_X,
BRW_PARAM_BUILTIN_TESS_LEVEL_INNER_Y,
+ BRW_PARAM_BUILTIN_PATCH_VERTICES_IN,
+
BRW_PARAM_BUILTIN_BASE_WORK_GROUP_ID_X,
BRW_PARAM_BUILTIN_BASE_WORK_GROUP_ID_Y,
BRW_PARAM_BUILTIN_BASE_WORK_GROUP_ID_Z,