From ef409378548bba05d2bc441c003a4d1cc3a2991b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 20 Apr 2017 13:04:02 +0200 Subject: [PATCH] radeonsi: add reference counting for shader selectors MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The 2nd shader of merged shaders should take a reference of the 1st shader. The next commit will do that. Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeonsi/si_shader.h | 1 + src/gallium/drivers/radeonsi/si_state_shaders.c | 27 ++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index a508ece..f9ba79f 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -247,6 +247,7 @@ struct si_compiler_ctx_state { * binaries for one TGSI program. This can be shared by multiple contexts. */ struct si_shader_selector { + struct pipe_reference reference; struct si_screen *screen; struct util_queue_fence ready; struct si_compiler_ctx_state compiler_ctx_state; diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 602bbfb..e5b7281 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -1504,6 +1504,19 @@ static bool si_check_missing_main_part(struct si_screen *sscreen, return true; } +static void si_destroy_shader_selector(struct si_context *sctx, + struct si_shader_selector *sel); + +static void si_shader_selector_reference(struct si_context *sctx, + struct si_shader_selector **dst, + struct si_shader_selector *src) +{ + if (pipe_reference(&(*dst)->reference, &src->reference)) + si_destroy_shader_selector(sctx, *dst); + + *dst = src; +} + /* Select the hw shader variant depending on the current state. */ static int si_shader_select_with_key(struct si_screen *sscreen, struct si_shader_ctx_state *state, @@ -1886,6 +1899,7 @@ 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.tm = sctx->tm; sel->compiler_ctx_state.debug = sctx->b.debug; @@ -2235,10 +2249,9 @@ static void si_delete_shader(struct si_context *sctx, struct si_shader *shader) free(shader); } -static void si_delete_shader_selector(struct pipe_context *ctx, void *state) +static void si_destroy_shader_selector(struct si_context *sctx, + struct si_shader_selector *sel) { - struct si_context *sctx = (struct si_context *)ctx; - struct si_shader_selector *sel = (struct si_shader_selector *)state; struct si_shader *p = sel->first_variant, *c; struct si_shader_ctx_state *current_shader[SI_NUM_SHADERS] = { [PIPE_SHADER_VERTEX] = &sctx->vs_shader, @@ -2276,6 +2289,14 @@ static void si_delete_shader_selector(struct pipe_context *ctx, void *state) free(sel); } +static void si_delete_shader_selector(struct pipe_context *ctx, void *state) +{ + struct si_context *sctx = (struct si_context *)ctx; + struct si_shader_selector *sel = (struct si_shader_selector *)state; + + si_shader_selector_reference(sctx, &sel, NULL); +} + static unsigned si_get_ps_input_cntl(struct si_context *sctx, struct si_shader *vs, unsigned name, unsigned index, unsigned interpolate) -- 2.7.4