[Mesa-dev] [PATCH 08/24] st/mesa: simplify update_shader_samplers

Marek Olšák maraeo at gmail.com
Mon Jun 12 18:18:39 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

---
 src/mesa/state_tracker/st_atom_sampler.c | 24 ++++++++----------------
 1 file changed, 8 insertions(+), 16 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 52ff9b6..9e5d940 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -253,52 +253,43 @@ convert_sampler_from_unit(const struct st_context *st,
 
 /**
  * Update the gallium driver's sampler state for fragment, vertex or
  * geometry shader stage.
  */
 static void
 update_shader_samplers(struct st_context *st,
                        enum pipe_shader_type shader_stage,
                        const struct gl_program *prog,
                        struct pipe_sampler_state *samplers,
-                       unsigned *num_samplers)
+                       unsigned *out_num_samplers)
 {
    GLbitfield samplers_used = prog->SamplersUsed;
    GLbitfield free_slots = ~prog->SamplersUsed;
    GLbitfield external_samplers_used = prog->ExternalSamplersUsed;
-   GLuint unit;
-   const GLuint old_max = *num_samplers;
+   unsigned unit, num_samplers;
    const struct pipe_sampler_state *states[PIPE_MAX_SAMPLERS];
 
    if (samplers_used == 0x0)
       return;
 
-   *num_samplers = 0;
+   num_samplers = util_last_bit(samplers_used);
 
    /* loop over sampler units (aka tex image units) */
    for (unit = 0; samplers_used; unit++, samplers_used >>= 1) {
       struct pipe_sampler_state *sampler = samplers + unit;
 
       if (samplers_used & 1) {
-         const GLuint texUnit = prog->SamplerUnits[unit];
-
-         convert_sampler_from_unit(st, sampler, texUnit);
+         convert_sampler_from_unit(st, sampler, prog->SamplerUnits[unit]);
          states[unit] = sampler;
-         *num_samplers = unit + 1;
-      }
-      else if (samplers_used != 0 || unit < old_max) {
+      } else {
          states[unit] = NULL;
       }
-      else {
-         /* if we've reset all the old samplers and we have no more new ones */
-         break;
-      }
    }
 
    /* For any external samplers with multiplaner YUV, stuff the additional
     * sampler states we need at the end.
     *
     * Just re-use the existing sampler-state from the primary slot.
     */
    while (unlikely(external_samplers_used)) {
       GLuint unit = u_bit_scan(&external_samplers_used);
       GLuint extra = 0;
@@ -319,24 +310,25 @@ update_shader_samplers(struct st_context *st,
          /* we need two additional samplers: */
          extra = u_bit_scan(&free_slots);
          states[extra] = sampler;
          extra = u_bit_scan(&free_slots);
          states[extra] = sampler;
          break;
       default:
          break;
       }
 
-      *num_samplers = MAX2(*num_samplers, extra + 1);
+      num_samplers = MAX2(num_samplers, extra + 1);
    }
 
-   cso_set_samplers(st->cso_context, shader_stage, *num_samplers, states);
+   cso_set_samplers(st->cso_context, shader_stage, num_samplers, states);
+   *out_num_samplers = num_samplers;
 }
 
 
 void
 st_update_vertex_samplers(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    update_shader_samplers(st,
                           PIPE_SHADER_VERTEX,
-- 
2.7.4



More information about the mesa-dev mailing list