From 286b8b8f99580fae0a61803517898b1b80795747 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 4 Dec 2018 14:11:51 -0800 Subject: [PATCH] iris: handle PatchVerticesIn as a system value. --- src/gallium/drivers/iris/iris_draw.c | 17 +++++++++++++++-- src/gallium/drivers/iris/iris_program.c | 4 ++++ src/gallium/drivers/iris/iris_state.c | 11 +++++++++++ src/intel/compiler/brw_compiler.h | 2 ++ 4 files changed, 32 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"); } diff --git a/src/intel/compiler/brw_compiler.h b/src/intel/compiler/brw_compiler.h index 560f2c3c6ba..b894c47ed6b 100644 --- a/src/intel/compiler/brw_compiler.h +++ b/src/intel/compiler/brw_compiler.h @@ -567,6 +567,8 @@ enum brw_param_builtin { 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, -- 2.30.2