diff --git a/src/gallium/drivers/zink/zink_blit.c b/src/gallium/drivers/zink/zink_blit.c index 45d9b0ed911..71b36d0992d 100644 --- a/src/gallium/drivers/zink/zink_blit.c +++ b/src/gallium/drivers/zink/zink_blit.c @@ -201,6 +201,8 @@ zink_blit(struct pipe_context *pctx, util_blitter_save_rasterizer(ctx->blitter, ctx->rast_state); util_blitter_save_fragment_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_FRAGMENT]); util_blitter_save_vertex_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_VERTEX]); + util_blitter_save_tessctrl_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_TESS_CTRL]); + util_blitter_save_tesseval_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_TESS_EVAL]); util_blitter_save_geometry_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_GEOMETRY]); util_blitter_save_framebuffer(ctx->blitter, &ctx->fb_state); util_blitter_save_viewport(ctx->blitter, ctx->viewport_states); diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 95e62855e37..55a428e56d5 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -637,6 +637,46 @@ zink_bind_gs_state(struct pipe_context *pctx, bind_stage(zink_context(pctx), PIPE_SHADER_GEOMETRY, cso); } +static void * +zink_create_tcs_state(struct pipe_context *pctx, + const struct pipe_shader_state *shader) +{ + struct nir_shader *nir; + if (shader->type != PIPE_SHADER_IR_NIR) + nir = zink_tgsi_to_nir(pctx->screen, shader->tokens); + else + nir = (struct nir_shader *)shader->ir.nir; + + return zink_shader_create(zink_screen(pctx->screen), nir, &shader->stream_output); +} + +static void +zink_bind_tcs_state(struct pipe_context *pctx, + void *cso) +{ + bind_stage(zink_context(pctx), PIPE_SHADER_TESS_CTRL, cso); +} + +static void * +zink_create_tes_state(struct pipe_context *pctx, + const struct pipe_shader_state *shader) +{ + struct nir_shader *nir; + if (shader->type != PIPE_SHADER_IR_NIR) + nir = zink_tgsi_to_nir(pctx->screen, shader->tokens); + else + nir = (struct nir_shader *)shader->ir.nir; + + return zink_shader_create(zink_screen(pctx->screen), nir, NULL); +} + +static void +zink_bind_tes_state(struct pipe_context *pctx, + void *cso) +{ + bind_stage(zink_context(pctx), PIPE_SHADER_TESS_EVAL, cso); +} + static void zink_delete_shader_state(struct pipe_context *pctx, void *cso) { @@ -658,4 +698,12 @@ zink_program_init(struct zink_context *ctx) ctx->base.create_gs_state = zink_create_gs_state; ctx->base.bind_gs_state = zink_bind_gs_state; ctx->base.delete_gs_state = zink_delete_shader_state; + + ctx->base.create_tcs_state = zink_create_tcs_state; + ctx->base.bind_tcs_state = zink_bind_tcs_state; + ctx->base.delete_tcs_state = zink_delete_shader_state; + + ctx->base.create_tes_state = zink_create_tes_state; + ctx->base.bind_tes_state = zink_bind_tes_state; + ctx->base.delete_tes_state = zink_delete_shader_state; }