[Mesa-dev] [PATCH] st/mesa: fix sampler view counting

Brian Paul brianp at vmware.com
Fri Aug 17 11:22:25 PDT 2012


The bug in question was happening because when all texturing got 
turned off we were calling pipe->set_sampler_views(count=0).  In 
llvmpipe this caused the function to return early, before we set the 
LP_NEW_SAMPLER_VIEW flag.  That caused us to miss some state validation.

I agree that unused sampler views shouldn't have an effect on 
rendering, but in this case it does (and perhaps would effect other 
drivers as well).  As I mentioned, drivers used to null-out the 
sampler views not specified by pipe::set_sampler_views(n) but that 
behavior is going away.  During the transition, this patch gives a bit 
of a safety net.

-Brian


On 08/17/2012 12:03 PM, Marek Olšák wrote:
> This looks good, but I don't see how it could fix anything.
> Bound-but-unused sampler views should have no effect on rendering.
>
> Marek
>
> On Fri, Aug 17, 2012 at 4:28 PM, Brian Paul<brianp at vmware.com>  wrote:
>> In the past, when we called pipe::set_sampler_views(n) the drivers set
>> samplers [n..MAX] to NULL.  We no longer do that.  The state tracker
>> code was already trying to set unused sampler views to NULL to cover
>> that case, but the logic was broken and unnoticed until now.  This patch
>> fixes it.
>>
>> Fixes http://bugs.freedesktop.org/show_bug.cgi?id=53617
>> ---
>>   src/mesa/state_tracker/st_atom_texture.c |   11 +++++++++--
>>   1 files changed, 9 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
>> index 6e2efd9..df05e83 100644
>> --- a/src/mesa/state_tracker/st_atom_texture.c
>> +++ b/src/mesa/state_tracker/st_atom_texture.c
>> @@ -265,7 +265,7 @@ update_textures(struct st_context *st,
>>   {
>>      const GLuint old_max = *num_textures;
>>      GLbitfield samplers_used = prog->SamplersUsed;
>> -   GLuint unit;
>> +   GLuint unit, new_count;
>>
>>      if (samplers_used == 0x0&&  old_max == 0)
>>         return;
>> @@ -294,9 +294,16 @@ update_textures(struct st_context *st,
>>         pipe_sampler_view_reference(&(sampler_views[unit]), sampler_view);
>>      }
>>
>> +   /* Ex: if old_max = 3 and *num_textures = 1, we need to pass an
>> +    * array of views={X, NULL, NULL} to unref the old texture views
>> +    * at positions [1] and [2].
>> +    */
>> +   new_count = MAX2(*num_textures, old_max);
>> +   assert(new_count<= max_units);
>> +
>>      cso_set_sampler_views(st->cso_context,
>>                            shader_stage,
>> -                         MIN2(*num_textures, max_units),
>> +                         new_count,
>>                            sampler_views);
>>   }
>>
>> --
>> 1.7.3.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list