On Mon, Oct 19, 2015 at 11:47 PM, Rob Clark <robdcl...@gmail.com> wrote: > On Sat, Oct 10, 2015 at 9:09 PM, Marek Olšák <mar...@gmail.com> wrote: >> From: Marek Olšák <marek.ol...@amd.com> >> >> --- >> src/mesa/state_tracker/st_atom_shader.c | 10 +++++----- >> src/mesa/state_tracker/st_cb_bitmap.c | 2 +- >> src/mesa/state_tracker/st_cb_drawpixels.c | 2 +- >> src/mesa/state_tracker/st_context.c | 3 ++- >> src/mesa/state_tracker/st_context.h | 1 + >> src/mesa/state_tracker/st_program.c | 16 +++++++++++----- >> 6 files changed, 21 insertions(+), 13 deletions(-) >> >> diff --git a/src/mesa/state_tracker/st_atom_shader.c >> b/src/mesa/state_tracker/st_atom_shader.c >> index 1e880a1..3941454 100644 >> --- a/src/mesa/state_tracker/st_atom_shader.c >> +++ b/src/mesa/state_tracker/st_atom_shader.c >> @@ -64,7 +64,7 @@ update_fp( struct st_context *st ) >> assert(stfp->Base.Base.Target == GL_FRAGMENT_PROGRAM_ARB); >> >> memset(&key, 0, sizeof(key)); >> - key.st = st; >> + key.st = st->has_shareable_shaders ? NULL : st; >> >> /* _NEW_FRAG_CLAMP */ >> key.clamp_color = st->clamp_frag_color_in_shader && >> @@ -119,7 +119,7 @@ update_vp( struct st_context *st ) >> assert(stvp->Base.Base.Target == GL_VERTEX_PROGRAM_ARB); >> >> memset(&key, 0, sizeof key); >> - key.st = st; /* variants are per-context */ >> + key.st = st->has_shareable_shaders ? NULL : st; >> >> /* When this is true, we will add an extra input to the vertex >> * shader translation (for edgeflags), an extra output with >> @@ -174,7 +174,7 @@ update_gp( struct st_context *st ) >> assert(stgp->Base.Base.Target == GL_GEOMETRY_PROGRAM_NV); >> >> memset(&key, 0, sizeof(key)); >> - key.st = st; >> + key.st = st->has_shareable_shaders ? NULL : st; >> >> st->gp_variant = st_get_gp_variant(st, stgp, &key); >> >> @@ -210,7 +210,7 @@ update_tcp( struct st_context *st ) >> assert(sttcp->Base.Base.Target == GL_TESS_CONTROL_PROGRAM_NV); >> >> memset(&key, 0, sizeof(key)); >> - key.st = st; >> + key.st = st->has_shareable_shaders ? NULL : st; >> >> st->tcp_variant = st_get_tcp_variant(st, sttcp, &key); >> >> @@ -246,7 +246,7 @@ update_tep( struct st_context *st ) >> assert(sttep->Base.Base.Target == GL_TESS_EVALUATION_PROGRAM_NV); >> >> memset(&key, 0, sizeof(key)); >> - key.st = st; >> + key.st = st->has_shareable_shaders ? NULL : st; >> >> st->tep_variant = st_get_tep_variant(st, sttep, &key); >> >> diff --git a/src/mesa/state_tracker/st_cb_bitmap.c >> b/src/mesa/state_tracker/st_cb_bitmap.c >> index bb6dfe8..cbc6845 100644 >> --- a/src/mesa/state_tracker/st_cb_bitmap.c >> +++ b/src/mesa/state_tracker/st_cb_bitmap.c >> @@ -269,7 +269,7 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, GLint >> y, GLfloat z, >> struct pipe_resource *vbuf = NULL; >> >> memset(&key, 0, sizeof(key)); >> - key.st = st; >> + key.st = st->has_shareable_shaders ? NULL : st; >> key.bitmap = GL_TRUE; >> key.clamp_color = st->clamp_frag_color_in_shader && >> st->ctx->Color._ClampFragmentColor; >> diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c >> b/src/mesa/state_tracker/st_cb_drawpixels.c >> index 7e8633e..20cbfde 100644 >> --- a/src/mesa/state_tracker/st_cb_drawpixels.c >> +++ b/src/mesa/state_tracker/st_cb_drawpixels.c >> @@ -914,7 +914,7 @@ get_color_fp_variant(struct st_context *st) >> >> memset(&key, 0, sizeof(key)); >> >> - key.st = st; >> + key.st = st->has_shareable_shaders ? NULL : st; >> key.drawpixels = 1; >> key.scaleAndBias = (ctx->Pixel.RedBias != 0.0 || >> ctx->Pixel.RedScale != 1.0 || >> diff --git a/src/mesa/state_tracker/st_context.c >> b/src/mesa/state_tracker/st_context.c >> index bef7307..6256c0b 100644 >> --- a/src/mesa/state_tracker/st_context.c >> +++ b/src/mesa/state_tracker/st_context.c >> @@ -237,7 +237,8 @@ st_create_context_priv( struct gl_context *ctx, struct >> pipe_context *pipe, >> PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER); >> st->can_force_persample_interp = screen->get_param(screen, >> PIPE_CAP_FORCE_PERSAMPLE_INTERP); >> - >> + st->has_shareable_shaders = screen->get_param(screen, >> + >> PIPE_CAP_SHAREABLE_SHADERS); >> st->needs_texcoord_semantic = >> screen->get_param(screen, PIPE_CAP_TGSI_TEXCOORD); >> st->apply_texture_swizzle_to_border_color = >> diff --git a/src/mesa/state_tracker/st_context.h >> b/src/mesa/state_tracker/st_context.h >> index f187d82..446fe5d 100644 >> --- a/src/mesa/state_tracker/st_context.h >> +++ b/src/mesa/state_tracker/st_context.h >> @@ -99,6 +99,7 @@ struct st_context >> boolean has_etc2; >> boolean prefer_blit_based_texture_transfer; >> boolean can_force_persample_interp; >> + boolean has_shareable_shaders; >> >> boolean needs_texcoord_semantic; >> boolean apply_texture_swizzle_to_border_color; >> diff --git a/src/mesa/state_tracker/st_program.c >> b/src/mesa/state_tracker/st_program.c >> index 6a69ba7..87571a8 100644 >> --- a/src/mesa/state_tracker/st_program.c >> +++ b/src/mesa/state_tracker/st_program.c >> @@ -1728,6 +1728,12 @@ destroy_program_variants_cb(GLuint key, void *data, >> void *userData) >> void >> st_destroy_program_variants(struct st_context *st) >> { >> + /* If shaders can be shared with other contexts, the last context will >> + * call DeleteProgram on all shaders, releasing everything. >> + */ >> + if (st->has_shareable_shaders) >> + return; > > I guess this could result in shaders not being released in some cases > where they otherwise would, for app's w/ multiple contexts. Not sure > how likely that is in practice.. Or how much harder it would be to > just refcnt shader association w/ st's?
What cases? Shaders are never released by st/mesa. This function was a band-aid for gallium in order to release only the variants belonging to the context. Otherwise, mesa/main is responsible for releasing whole shaders including all variants, not st/mesa or any other classic driver. The place is: mesa/main/shared.c Marek _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev