[Mesa-dev] [PATCH 2/3] st/mesa: decouple shaders from contexts if they are shareable

Marek Olšák maraeo at gmail.com
Mon Oct 19 16:18:52 PDT 2015


On Mon, Oct 19, 2015 at 11:47 PM, Rob Clark <robdclark at gmail.com> wrote:
> On Sat, Oct 10, 2015 at 9:09 PM, Marek Olšák <maraeo at gmail.com> wrote:
>> From: Marek Olšák <marek.olsak at 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


More information about the mesa-dev mailing list