summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/zink/zink_compiler.c6
-rw-r--r--src/gallium/drivers/zink/zink_context.h1
-rw-r--r--src/gallium/drivers/zink/zink_draw.c8
-rw-r--r--src/gallium/drivers/zink/zink_state.c4
4 files changed, 17 insertions, 2 deletions
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 55e49c72185..69d611522eb 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -338,8 +338,10 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
if (zs->streamout.so_info_slots)
streamout = &zs->streamout;
- nir = nir_shader_clone(NULL, zs->nir);
- NIR_PASS_V(nir, nir_lower_clip_halfz);
+ if (!zink_vs_key(key)->clip_halfz) {
+ nir = nir_shader_clone(NULL, zs->nir);
+ NIR_PASS_V(nir, nir_lower_clip_halfz);
+ }
}
} else {
if (!zink_fs_key(key)->samples &&
diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h
index 7d28dae9460..10e11fddd52 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -121,6 +121,7 @@ struct zink_context {
struct zink_gfx_program *curr_program;
unsigned dirty_shader_stages : 6; /* mask of changed shader stages */
+ bool last_vertex_stage_dirty;
struct hash_table *render_pass_cache;
diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c
index 262ed5bf0cd..90ec5317556 100644
--- a/src/gallium/drivers/zink/zink_draw.c
+++ b/src/gallium/drivers/zink/zink_draw.c
@@ -162,6 +162,14 @@ zink_bind_vertex_buffers(struct zink_batch *batch, struct zink_context *ctx)
static struct zink_gfx_program *
get_gfx_program(struct zink_context *ctx)
{
+ if (ctx->last_vertex_stage_dirty) {
+ if (ctx->gfx_stages[PIPE_SHADER_GEOMETRY])
+ ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_GEOMETRY);
+ else if (ctx->gfx_stages[PIPE_SHADER_TESS_EVAL])
+ ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_TESS_EVAL);
+ else
+ ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_VERTEX);
+ }
if (ctx->dirty_shader_stages) {
struct hash_entry *entry = _mesa_hash_table_search(ctx->program_cache,
ctx->gfx_stages);
diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c
index d8e08bba812..810d971126c 100644
--- a/src/gallium/drivers/zink/zink_state.c
+++ b/src/gallium/drivers/zink/zink_state.c
@@ -464,6 +464,7 @@ static void
zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso)
{
struct zink_context *ctx = zink_context(pctx);
+ bool clip_halfz = ctx->rast_state ? ctx->rast_state->base.clip_halfz : false;
ctx->rast_state = cso;
if (ctx->rast_state) {
@@ -472,6 +473,9 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso)
ctx->gfx_pipeline_state.dirty = true;
}
+ if (clip_halfz != ctx->rast_state->base.clip_halfz)
+ ctx->last_vertex_stage_dirty = true;
+
if (ctx->line_width != ctx->rast_state->line_width) {
ctx->line_width = ctx->rast_state->line_width;
ctx->gfx_pipeline_state.dirty = true;