if (!sel)
return NULL;
- pipe_reference_init(&sel->reference, 1);
sel->screen = sscreen;
sel->compiler_ctx_state.debug = sctx->debug;
sel->compiler_ctx_state.is_debug_context = sctx->is_debug;
return sel;
}
+static void *si_create_shader(struct pipe_context *ctx,
+ const struct pipe_shader_state *state)
+{
+ struct si_screen *sscreen = (struct si_screen *)ctx->screen;
+
+ return util_live_shader_cache_get(ctx, &sscreen->live_shader_cache, state);
+}
+
static void si_update_streamout_state(struct si_context *sctx)
{
struct si_shader_selector *shader_with_so = si_get_vs(sctx)->cso;
free(shader);
}
-void si_destroy_shader_selector(struct si_context *sctx,
- struct si_shader_selector *sel)
+static void si_destroy_shader_selector(struct pipe_context *ctx, void *cso)
{
+ struct si_context *sctx = (struct si_context*)ctx;
+ struct si_shader_selector *sel = (struct si_shader_selector *)cso;
struct si_shader *p = sel->first_variant, *c;
struct si_shader_ctx_state *current_shader[SI_NUM_SHADERS] = {
[PIPE_SHADER_VERTEX] = &sctx->vs_shader,
}
}
+void si_init_screen_live_shader_cache(struct si_screen *sscreen)
+{
+ util_live_shader_cache_init(&sscreen->live_shader_cache,
+ si_create_shader_selector,
+ si_destroy_shader_selector);
+}
+
void si_init_shader_functions(struct si_context *sctx)
{
sctx->atoms.s.spi_map.emit = si_emit_spi_map;
sctx->atoms.s.scratch_state.emit = si_emit_scratch_state;
- sctx->b.create_vs_state = si_create_shader_selector;
- sctx->b.create_tcs_state = si_create_shader_selector;
- sctx->b.create_tes_state = si_create_shader_selector;
- sctx->b.create_gs_state = si_create_shader_selector;
- sctx->b.create_fs_state = si_create_shader_selector;
+ sctx->b.create_vs_state = si_create_shader;
+ sctx->b.create_tcs_state = si_create_shader;
+ sctx->b.create_tes_state = si_create_shader;
+ sctx->b.create_gs_state = si_create_shader;
+ sctx->b.create_fs_state = si_create_shader;
sctx->b.bind_vs_state = si_bind_vs_shader;
sctx->b.bind_tcs_state = si_bind_tcs_shader;