summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/iris/iris_draw.c17
-rw-r--r--src/gallium/drivers/iris/iris_program.c4
-rw-r--r--src/gallium/drivers/iris/iris_state.c11
3 files changed, 30 insertions, 2 deletions
diff --git a/src/gallium/drivers/iris/iris_draw.c b/src/gallium/drivers/iris/iris_draw.c
index 4b8205a2bbe..d33bad0a0ff 100644
--- a/src/gallium/drivers/iris/iris_draw.c
+++ b/src/gallium/drivers/iris/iris_draw.c
@@ -47,11 +47,24 @@ static void
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 ||
diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c
index 5fb4ef64861..0200b9bb1ec 100644
--- a/src/gallium/drivers/iris/iris_program.c
+++ b/src/gallium/drivers/iris/iris_program.c
@@ -628,6 +628,10 @@ iris_setup_uniforms(const struct brw_compiler *compiler,
}
break;
}
+ case nir_intrinsic_load_patch_vertices_in:
+ system_values[num_system_values++] =
+ BRW_PARAM_BUILTIN_PATCH_VERTICES_IN;
+ break;
default:
continue;
}
diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c
index 195829991a9..d41cb7490b4 100644
--- a/src/gallium/drivers/iris/iris_state.c
+++ b/src/gallium/drivers/iris/iris_state.c
@@ -2245,6 +2245,17 @@ upload_uniforms(struct iris_context *ice,
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");
}