radeonsi: use the live shader cache
[mesa.git] / src / gallium / drivers / radeonsi / si_state_shaders.c
index 69827d0774bcb2b825c510663560c6153fbb5990..ffa4289783ed63794086d27e8c2126dc765bc2f2 100644 (file)
@@ -2788,7 +2788,6 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
        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;
@@ -3055,6 +3054,14 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
        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;
@@ -3358,9 +3365,10 @@ static void si_delete_shader(struct si_context *sctx, struct si_shader *shader)
        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,
@@ -4242,16 +4250,23 @@ static void si_emit_scratch_state(struct si_context *sctx)
        }
 }
 
+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;