diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index c0689983a8e..39cd814280e 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -1279,15 +1279,14 @@ void main() */ struct zink_shader * -zink_shader_tcs_create(struct zink_context *ctx, struct zink_shader *vs) +zink_shader_tcs_create(struct zink_screen *screen, struct zink_shader *vs, unsigned vertices_per_patch) { - unsigned vertices_per_patch = ctx->gfx_pipeline_state.vertices_per_patch + 1; struct zink_shader *ret = CALLOC_STRUCT(zink_shader); ret->hash = _mesa_hash_pointer(ret); ret->programs = _mesa_pointer_set_create(NULL); simple_mtx_init(&ret->lock, mtx_plain); - nir_shader *nir = nir_shader_create(NULL, MESA_SHADER_TESS_CTRL, &zink_screen(ctx->base.screen)->nir_options, NULL); + nir_shader *nir = nir_shader_create(NULL, MESA_SHADER_TESS_CTRL, &screen->nir_options, NULL); nir_function *fn = nir_function_create(nir, "main"); fn->is_entrypoint = true; nir_function_impl *impl = nir_function_impl_create(fn); diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index 5f136a5c65a..b9e7321d574 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -112,7 +112,7 @@ void zink_shader_free(struct zink_context *ctx, struct zink_shader *shader); struct zink_shader * -zink_shader_tcs_create(struct zink_context *ctx, struct zink_shader *vs); +zink_shader_tcs_create(struct zink_screen *screen, struct zink_shader *vs, unsigned vertices_per_patch); static inline bool zink_shader_descriptor_is_buffer(struct zink_shader *zs, enum zink_descriptor_type type, unsigned i) diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 260dbd48809..3ec3444fcad 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -198,7 +198,7 @@ update_gfx_program(struct zink_context *ctx) ctx->gfx_pipeline_state.modules[stage] = prog->modules[stage]->shader; zink_update_gfx_program(ctx, prog); } else { - prog = zink_create_gfx_program(ctx, ctx->gfx_stages); + prog = zink_create_gfx_program(ctx, ctx->gfx_stages, ctx->gfx_pipeline_state.vertices_per_patch + 1); entry = _mesa_hash_table_insert_pre_hashed(ht, hash, prog->shaders, prog); } prog = (struct zink_gfx_program*)(entry ? entry->data : NULL); diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 4a74d63b93f..0c75778f36c 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -450,7 +450,8 @@ assign_io(struct zink_gfx_program *prog, struct zink_shader *stages[ZINK_SHADER_ struct zink_gfx_program * zink_create_gfx_program(struct zink_context *ctx, - struct zink_shader *stages[ZINK_SHADER_COUNT]) + struct zink_shader *stages[ZINK_SHADER_COUNT], + unsigned vertices_per_patch) { struct zink_screen *screen = zink_screen(ctx->base.screen); struct zink_gfx_program *prog = rzalloc(NULL, struct zink_gfx_program); @@ -469,7 +470,7 @@ zink_create_gfx_program(struct zink_context *ctx, if (stages[PIPE_SHADER_TESS_EVAL] && !stages[PIPE_SHADER_TESS_CTRL]) { prog->shaders[PIPE_SHADER_TESS_EVAL]->generated = prog->shaders[PIPE_SHADER_TESS_CTRL] = - zink_shader_tcs_create(ctx, stages[PIPE_SHADER_VERTEX]); + zink_shader_tcs_create(screen, stages[PIPE_SHADER_VERTEX], vertices_per_patch); _mesa_hash_table_init(&prog->base.shader_cache[PIPE_SHADER_TESS_CTRL], prog, keybox_hash, keybox_equals); prog->stages_present |= BITFIELD_BIT(PIPE_SHADER_TESS_CTRL); } diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h index c4e1c43447b..b0b586ba0c0 100644 --- a/src/gallium/drivers/zink/zink_program.h +++ b/src/gallium/drivers/zink/zink_program.h @@ -197,7 +197,8 @@ zink_update_gfx_program(struct zink_context *ctx, struct zink_gfx_program *prog) struct zink_gfx_program * zink_create_gfx_program(struct zink_context *ctx, - struct zink_shader *stages[ZINK_SHADER_COUNT]); + struct zink_shader *stages[ZINK_SHADER_COUNT], + unsigned vertices_per_patch); void zink_destroy_gfx_program(struct zink_screen *screen,