bool pipeline_changed[2]; //gfx, compute
struct zink_shader *gfx_stages[ZINK_SHADER_COUNT];
+ struct zink_shader *last_vertex_stage;
struct zink_gfx_pipeline_state gfx_pipeline_state;
enum pipe_prim_type gfx_prim_mode;
struct hash_table *program_cache;
goto fail;
}
+ if (stages[PIPE_SHADER_GEOMETRY])
+ prog->last_vertex_stage = stages[PIPE_SHADER_GEOMETRY];
+ else if (stages[PIPE_SHADER_TESS_EVAL])
+ prog->last_vertex_stage = stages[PIPE_SHADER_TESS_EVAL];
+ else
+ prog->last_vertex_stage = stages[PIPE_SHADER_VERTEX];
+
struct mesa_sha1 sctx;
_mesa_sha1_init(&sctx);
for (int i = 0; i < ZINK_SHADER_COUNT; ++i) {
zink_bind_vs_state(struct pipe_context *pctx,
void *cso)
{
- bind_stage(zink_context(pctx), PIPE_SHADER_VERTEX, cso);
+ struct zink_context *ctx = zink_context(pctx);
+ bind_stage(ctx, PIPE_SHADER_VERTEX, cso);
+ if (!ctx->gfx_stages[PIPE_SHADER_GEOMETRY] &&
+ !ctx->gfx_stages[PIPE_SHADER_TESS_EVAL]) {
+ ctx->last_vertex_stage = cso;
+ }
}
static void
ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_VERTEX) |
BITFIELD_BIT(PIPE_SHADER_TESS_EVAL);
bind_stage(ctx, PIPE_SHADER_GEOMETRY, cso);
+ if (cso)
+ ctx->last_vertex_stage = cso;
+ else {
+ if (ctx->gfx_stages[PIPE_SHADER_TESS_EVAL])
+ ctx->last_vertex_stage = ctx->gfx_stages[PIPE_SHADER_TESS_EVAL];
+ else
+ ctx->last_vertex_stage = ctx->gfx_stages[PIPE_SHADER_VERTEX];
+ }
}
static void
ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_VERTEX);
}
bind_stage(ctx, PIPE_SHADER_TESS_EVAL, cso);
+ if (!ctx->gfx_stages[PIPE_SHADER_GEOMETRY]) {
+ if (cso)
+ ctx->last_vertex_stage = cso;
+ else
+ ctx->last_vertex_stage = ctx->gfx_stages[PIPE_SHADER_VERTEX];
+ }
}
static void *
struct zink_shader_module *default_variants[ZINK_SHADER_COUNT][2]; //[default, no streamout]
const void *default_variant_key[ZINK_SHADER_COUNT];
+ struct zink_shader *last_vertex_stage;
+
struct zink_shader *shaders[ZINK_SHADER_COUNT];
struct hash_table *pipelines[11]; // number of draw modes we support
};