mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 02:10:11 +01:00
radeonsi: add reference counting for shader selectors
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 <nicolai.haehnle@amd.com>
This commit is contained in:
parent
6c15e15af4
commit
ef40937854
2 changed files with 25 additions and 3 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue