diff options
-rw-r--r-- | src/gallium/drivers/zink/zink_compiler.c | 6 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_context.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_draw.c | 8 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_state.c | 4 |
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; |