[Mesa-dev] [PATCH 5/6] st/mesa: merge fragment/vertex sampler update code

Brian Paul brianp at vmware.com
Fri Aug 3 07:07:39 PDT 2012


---
 src/mesa/state_tracker/st_atom_sampler.c |  109 +++++++++++++++---------------
 1 files changed, 54 insertions(+), 55 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index c219b21..8dc45fd 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -195,88 +195,87 @@ convert_sampler(struct st_context *st,
 }
 
 
+/**
+ * Update the gallium driver's sampler state for fragment, vertex or
+ * geometry shader stage.
+ */
 static void
-update_vertex_samplers(struct st_context *st)
+update_shader_samplers(struct st_context *st,
+                       unsigned shader_stage,
+                       const struct gl_program *prog,
+                       unsigned max_units,
+                       struct pipe_sampler_state *samplers,
+                       unsigned *num_samplers)
 {
-   const struct gl_context *ctx = st->ctx;
-   struct gl_vertex_program *vprog = ctx->VertexProgram._Current;
-   GLuint su;
-   GLuint samplers_used = vprog->Base.SamplersUsed;
-   const GLuint old_max = st->state.num_vertex_samplers;
+   GLuint unit;
+   GLbitfield samplers_used;
+   const GLuint old_max = *num_samplers;
+
+   samplers_used = prog->SamplersUsed;
 
-   if (st->state.num_vertex_samplers == 0 && vprog->Base.SamplersUsed == 0)
+   if (*num_samplers == 0 && samplers_used == 0x0)
        return;
 
-   st->state.num_vertex_samplers = 0;
+   *num_samplers = 0;
 
    /* loop over sampler units (aka tex image units) */
-   for (su = 0; su < ctx->Const.MaxVertexTextureImageUnits; su++, samplers_used >>= 1) {
-      struct pipe_sampler_state *sampler = st->state.vertex_samplers + su;
+   for (unit = 0; unit < max_units; unit++, samplers_used >>= 1) {
+      struct pipe_sampler_state *sampler = samplers + unit;
 
       if (samplers_used & 1) {
-         GLuint texUnit = vprog->Base.SamplerUnits[su];
+         const GLuint texUnit = prog->SamplerUnits[unit];
 
          convert_sampler(st, sampler, texUnit);
 
-         st->state.num_vertex_samplers = su + 1;
+         *num_samplers = unit + 1;
 
-         cso_single_sampler(st->cso_context, PIPE_SHADER_VERTEX, su, sampler);
+         cso_single_sampler(st->cso_context, shader_stage, unit, sampler);
       }
-      else if (samplers_used != 0 || su < old_max) {
-         cso_single_sampler(st->cso_context, PIPE_SHADER_VERTEX, su, NULL);
-      } else {
+      else if (samplers_used != 0 || unit < old_max) {
+         cso_single_sampler(st->cso_context, shader_stage, unit, NULL);
+      }
+      else {
          /* if we've reset all the old samplers and we have no more new ones */
          break;
       }
    }
-   cso_single_sampler_done(st->cso_context, PIPE_SHADER_VERTEX);
+
+   cso_single_sampler_done(st->cso_context, shader_stage);
 }
 
 
 static void
-update_fragment_samplers(struct st_context *st)
+update_samplers(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
-   struct gl_fragment_program *fprog = ctx->FragmentProgram._Current;
-   GLuint su;
-   GLuint samplers_used = fprog->Base.SamplersUsed;
-   const GLuint old_max = st->state.num_fragment_samplers;
-
-   if (st->state.num_fragment_samplers == 0 && fprog->Base.SamplersUsed == 0)
-       return;
-
-   st->state.num_fragment_samplers = 0;
-
-   /* loop over sampler units (aka tex image units) */
-   for (su = 0; su < ctx->Const.MaxTextureImageUnits; su++, samplers_used >>= 1) {
-      struct pipe_sampler_state *sampler = st->state.fragment_samplers + su;
-
-      if (samplers_used & 1) {
-         GLuint texUnit = fprog->Base.SamplerUnits[su];
 
-         convert_sampler(st, sampler, texUnit);
-
-         st->state.num_fragment_samplers = su + 1;
-
-         cso_single_sampler(st->cso_context, PIPE_SHADER_FRAGMENT, su, sampler);
-      }
-      else if (samplers_used != 0 || su < old_max) {
-         cso_single_sampler(st->cso_context, PIPE_SHADER_FRAGMENT, su, NULL);
-      } else {
-         /* if we've reset all the old samplers and we have no more new ones */
-         break;
-      }
+   update_shader_samplers(st,
+                          PIPE_SHADER_FRAGMENT,
+                          &ctx->FragmentProgram._Current->Base,
+                          ctx->Const.MaxTextureImageUnits,
+                          st->state.fragment_samplers,
+                          &st->state.num_fragment_samplers);
+
+   if (ctx->Const.MaxVertexTextureImageUnits > 0) {
+      update_shader_samplers(st,
+                             PIPE_SHADER_VERTEX,
+                             &ctx->VertexProgram._Current->Base,
+                             ctx->Const.MaxVertexTextureImageUnits,
+                             st->state.vertex_samplers,
+                             &st->state.num_vertex_samplers);
    }
 
-   cso_single_sampler_done(st->cso_context, PIPE_SHADER_FRAGMENT);
-}
-
-
-static void
-update_samplers(struct st_context *st)
-{
-    update_fragment_samplers(st);
-    update_vertex_samplers(st);
+   if (ctx->Const.MaxGeometryTextureImageUnits > 0 &&
+       ctx->GeometryProgram._Current) {
+/*
+      update_shader_samplers(st,
+                             PIPE_SHADER_GEOMETRY,
+                             &ctx->GeometryProgram._Current->Base,
+                             ctx->Const.MaxGeometryTextureImageUnits,
+                             st->state.geometry_samplers,
+                             &st->state.num_geometry_samplers);
+*/
+   }
 }
 
 
-- 
1.7.3.4



More information about the mesa-dev mailing list