[Mesa-dev] [PATCH 5/6] st/mesa: optimize pipe_sampler_view validation

Brian Paul brianp at vmware.com
Thu Oct 6 15:36:37 UTC 2016


On 10/06/2016 01:45 AM, Nicolai Hähnle wrote:
> On 06.10.2016 02:42, Brian Paul wrote:
>> Before, st_get_texture_sampler_view_from_stobj() did a lot of work to
>> check if the texture parameters matched the sampler view (format,
>> swizzle, min/max lod, first/last layer, etc).  We did this every time
>> we validated the texture state.
>>
>> Now, we use a ctx->Driver.TexParameter() callback and a couple other
>> checks to proactively release texture views when we know that
>> view-related parameters have changed.  Then, the validation step is
>> simplified:
>> - Search the texture's list of sampler views (just match the context).
>> - If found, we're done.
>> - Else, create a new sampler view.
>>
>> There will never be old, out-of-date sampler views attached to texture
>> objects that we have to test.
>>
>> Most apps create textures and set the texture parameters once.  This
>> make sampler view validation much cheaper for that case.
>>
>> Note that the old texture/sampler comparison code has been converted
>> into a set of assertions to verify that the sampler view is in fact
>> consistent with the texture parameters.  This should help to spot any
>> potential regressions.
>>
>> Reviewed-by: Edward O'Callaghan <funfunctor at folklore1984.net>
>> ---
>>  src/mesa/state_tracker/st_atom_texture.c | 58
>> ++++++++++++++++++++------------
>>  src/mesa/state_tracker/st_cb_texture.c   | 52
>> ++++++++++++++++++++++++++++
>>  src/mesa/state_tracker/st_texture.c      | 16 ++++-----
>>  src/mesa/state_tracker/st_texture.h      |  5 +++
>>  4 files changed, 101 insertions(+), 30 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_atom_texture.c
>> b/src/mesa/state_tracker/st_atom_texture.c
>> index bfa16dc..45f1f6b 100644
>> --- a/src/mesa/state_tracker/st_atom_texture.c
>> +++ b/src/mesa/state_tracker/st_atom_texture.c
>> @@ -370,7 +370,7 @@ st_create_texture_sampler_view_from_stobj(struct
>> st_context *st,
>>  static struct pipe_sampler_view *
>>  st_get_texture_sampler_view_from_stobj(struct st_context *st,
>>                                         struct st_texture_object *stObj,
>> -                       enum pipe_format format,
>> +                                       const struct gl_sampler_object
>> *samp,
>>                                         unsigned glsl_version)
>>  {
>>     struct pipe_sampler_view **sv;
>> @@ -381,34 +381,42 @@ st_get_texture_sampler_view_from_stobj(struct
>> st_context *st,
>>
>>     sv = st_texture_get_sampler_view(st, stObj);
>>
>> -   /* if sampler view has changed dereference it */
>>     if (*sv) {
>> -      if (check_sampler_swizzle(st, stObj, *sv, glsl_version) ||
>> -      (format != (*sv)->format) ||
>> -          gl_target_to_pipe(stObj->base.Target) != (*sv)->target ||
>> -          stObj->base.MinLevel + stObj->base.BaseLevel !=
>> (*sv)->u.tex.first_level ||
>> -          last_level(stObj) != (*sv)->u.tex.last_level ||
>> -          stObj->base.MinLayer != (*sv)->u.tex.first_layer ||
>> -          last_layer(stObj) != (*sv)->u.tex.last_layer) {
>> -     pipe_sampler_view_reference(sv, NULL);
>> +      /* Debug check: make sure that the sampler view's parameters are
>> +       * what they're supposed to be.
>> +       */
>> +      struct pipe_sampler_view *view = *sv;
>> +      assert(!check_sampler_swizzle(st, stObj, view, glsl_version));
>> +      assert(get_sampler_view_format(st, stObj, samp) == view->format);
>> +      assert(gl_target_to_pipe(stObj->base.Target) == view->target);
>> +      if (stObj->base.Target == GL_TEXTURE_BUFFER) {
>> +         unsigned base = stObj->base.BufferOffset;
>> +         unsigned size = MIN2(stObj->pt->width0 - base,
>> +                              (unsigned) stObj->base.BufferSize);
>> +         assert(view->u.buf.offset == base);
>> +         assert(view->u.buf.size == size);
>> +      }
>> +      else {
>
> Huh, so is this else-style intentional, or a spill-over from another
> code base? I wasn't aware of this style in st/mesa.

I've been doing it that way for about 25 years.  The } else { style is 
relatively new to Mesa and I guess I haven't adopted that habit yet.

'git grep else' shows a mix of styles.


> Also, the whole sampler lookup code gives me the race condition chills,
> but it looks like it's always been that way, so... patches 4 & 5:
>
> Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Patch 6 is Acked-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

Thanks for reviewing.

-Brian




More information about the mesa-dev mailing list