[Mesa-dev] [PATCH 5/5] llvmpipe: consolidate the sampler and sampler view setting code

Brian Paul brianp at vmware.com
Mon Aug 6 07:30:00 PDT 2012


On 08/05/2012 01:27 AM, Jose Fonseca wrote:
>
>
> ----- Original Message -----
>> Less code.  And as with softpipe, if/when we consolidate the
>> pipe_context
>> functions for binding sampler state, this will make the llvmpipe
>> changes
>> trivial.
>> ---
>>   src/gallium/drivers/llvmpipe/lp_state_sampler.c |  118
>>   ++++++++++-------------
>>   1 files changed, 50 insertions(+), 68 deletions(-)
>>
>> diff --git a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
>> b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
>> index 1451538..cb4846a 100644
>> --- a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
>> +++ b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
>> @@ -66,7 +66,8 @@ llvmpipe_create_sampler_state(struct pipe_context
>> *pipe,
>>
>>   static void
>>   llvmpipe_bind_sampler_states(struct pipe_context *pipe,
>> -                             unsigned num, void **sampler)
>> +                             unsigned shader,
>> +                             unsigned num, void **samplers)
>>   {
>>      struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
>>      unsigned i;
>> @@ -74,66 +75,57 @@ llvmpipe_bind_sampler_states(struct pipe_context
>> *pipe,
>>      assert(num<= PIPE_MAX_SAMPLERS);
>>
>>      /* Check for no-op */
>> -   if (num == llvmpipe->num_samplers[PIPE_SHADER_FRAGMENT]&&
>> -       !memcmp(llvmpipe->samplers[PIPE_SHADER_FRAGMENT], sampler,
>> num * sizeof(void *)))
>> +   if (num == llvmpipe->num_samplers[shader]&&
>> +       !memcmp(llvmpipe->samplers[shader], samplers, num *
>> sizeof(void *)))
>>         return;
>>
>>      draw_flush(llvmpipe->draw);
>>
>>      for (i = 0; i<  num; ++i)
>> -      llvmpipe->samplers[PIPE_SHADER_FRAGMENT][i] = sampler[i];
>> +      llvmpipe->samplers[shader][i] = samplers[i];
>>      for (i = num; i<  PIPE_MAX_SAMPLERS; ++i)
>> -      llvmpipe->samplers[PIPE_SHADER_FRAGMENT][i] = NULL;
>> +      llvmpipe->samplers[shader][i] = NULL;
>>
>> -   llvmpipe->num_samplers[PIPE_SHADER_FRAGMENT] = num;
>> +   llvmpipe->num_samplers[shader] = num;
>> +
>> +   if (shader == PIPE_SHADER_VERTEX) {
>> +      draw_set_samplers(llvmpipe->draw,
>> +                        llvmpipe->samplers[PIPE_SHADER_VERTEX],
>> +                        llvmpipe->num_samplers[PIPE_SHADER_VERTEX]);
>> +   }
>>
>>      llvmpipe->dirty |= LP_NEW_SAMPLER;
>>   }
>>
>>
>>   static void
>> -llvmpipe_bind_vertex_sampler_states(struct pipe_context *pipe,
>> -                                    unsigned num_samplers,
>> -                                    void **samplers)
>> +llvmpipe_bind_fragment_sampler_states(struct pipe_context *pipe,
>> +                                      unsigned num, void **samplers)
>>   {
>> -   struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
>> -   unsigned i;
>> -
>> -   assert(num_samplers<= PIPE_MAX_VERTEX_SAMPLERS);
>> -
>> -   /* Check for no-op */
>> -   if (num_samplers == llvmpipe->num_samplers[PIPE_SHADER_VERTEX]&&
>> -       !memcmp(llvmpipe->samplers[PIPE_SHADER_VERTEX], samplers,
>> num_samplers * sizeof(void *)))
>> -      return;
>> -
>> -   draw_flush(llvmpipe->draw);
>> -
>> -   for (i = 0; i<  num_samplers; ++i)
>> -      llvmpipe->samplers[PIPE_SHADER_VERTEX][i] = samplers[i];
>> -   for (i = num_samplers; i<  PIPE_MAX_VERTEX_SAMPLERS; ++i)
>> -      llvmpipe->samplers[PIPE_SHADER_VERTEX][i] = NULL;
>> -
>> -   llvmpipe->num_samplers[PIPE_SHADER_VERTEX] = num_samplers;
>> +   llvmpipe_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, num,
>> samplers);
>> +}
>>
>> -   draw_set_samplers(llvmpipe->draw,
>> -                     llvmpipe->samplers[PIPE_SHADER_VERTEX],
>> -                     llvmpipe->num_samplers[PIPE_SHADER_VERTEX]);
>>
>> -   llvmpipe->dirty |= LP_NEW_SAMPLER;
>> +static void
>> +llvmpipe_bind_vertex_sampler_states(struct pipe_context *pipe,
>> +                                    unsigned num, void **samplers)
>> +{
>> +   llvmpipe_bind_sampler_states(pipe, PIPE_SHADER_VERTEX, num,
>> samplers);
>>   }
>>
>>
>>   static void
>>   llvmpipe_bind_geometry_sampler_states(struct pipe_context *pipe,
>> -                                      unsigned num, void **sampler)
>> +                                      unsigned num, void **samplers)
>>   {
>> -   /* XXX: implementation missing */
>> +   llvmpipe_bind_sampler_states(pipe, PIPE_SHADER_GEOMETRY, num,
>> samplers);
>>   }
>>
>>   static void
>> -llvmpipe_set_fragment_sampler_views(struct pipe_context *pipe,
>> -                                    unsigned num,
>> -                                    struct pipe_sampler_view
>> **views)
>> +llvmpipe_set_sampler_views(struct pipe_context *pipe,
>> +                           unsigned shader,
>> +                           unsigned num,
>> +                           struct pipe_sampler_view **views)
>>   {
>>      struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
>>      uint i;
>> @@ -141,8 +133,8 @@ llvmpipe_set_fragment_sampler_views(struct
>> pipe_context *pipe,
>>      assert(num<= PIPE_MAX_SAMPLERS);
>>
>>      /* Check for no-op */
>> -   if (num == llvmpipe->num_sampler_views[PIPE_SHADER_FRAGMENT]&&
>> -       !memcmp(llvmpipe->sampler_views[PIPE_SHADER_FRAGMENT], views,
>> num * sizeof(struct pipe_sampler_view *)))
>> +   if (num == llvmpipe->num_sampler_views[shader]&&
>> +       !memcmp(llvmpipe->sampler_views[shader], views, num *
>> sizeof(struct pipe_sampler_view *)))
>>         return;
>>
>>      draw_flush(llvmpipe->draw);
>> @@ -150,46 +142,36 @@ llvmpipe_set_fragment_sampler_views(struct
>> pipe_context *pipe,
>>      for (i = 0; i<  PIPE_MAX_SAMPLERS; i++) {
>>         struct pipe_sampler_view *view = i<  num ? views[i] : NULL;
>>
>> -
>>       pipe_sampler_view_reference(&llvmpipe->sampler_views[PIPE_SHADER_FRAGMENT][i],
>> view);
>> +
>>       pipe_sampler_view_reference(&llvmpipe->sampler_views[shader][i],
>> view);
>>      }
>>
>> -   llvmpipe->num_sampler_views[PIPE_SHADER_FRAGMENT] = num;
>> +   llvmpipe->num_sampler_views[shader] = num;
>> +
>> +   if (shader == PIPE_SHADER_VERTEX) {
>
> Geometry shader implementation would not be complete without calling draw_set_sampler_views here. So, in substitution for the deleted
>
>     /* XXX: implementation missing */
>
> comments about geometry shaders, there should be a comment here saying
>
>     /* XXX call draw_set_sampler_views() here for geometry shaders once draw_set_sampler_views is extended to accept a shader argument */

And similarly for draw_set_samplers() earlier in the code.  I'll add 
that.  Thanks.

-Brian


More information about the mesa-dev mailing list