[Mesa-dev] [PATCH 1/3] i965: Move loop over texture units into brw_populate_sampler_prog_key.

Kenneth Graunke kenneth at whitecape.org
Wed Jan 11 01:55:44 PST 2012


The whole reason I avoided this was because it might operate on a
brw_vertex_program or a brw_fragment_program.  However, that isn't a
problem: all we need is the gl_program base type.

This avoids awkwardly passing the loop counter 'i' as a parameter,
simplifies both callers, and most importantly, plumbs prog in place for
use in the next commit.

Cc: Eric Anholt <eric at anholt.net>
Cc: Ian Romanick <idr at freedesktop.org>
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/mesa/drivers/dri/i965/brw_program.h |    3 +-
 src/mesa/drivers/dri/i965/brw_vs.c      |    5 +-
 src/mesa/drivers/dri/i965/brw_wm.c      |  160 ++++++++++++++++---------------
 3 files changed, 84 insertions(+), 84 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_program.h b/src/mesa/drivers/dri/i965/brw_program.h
index a2698cf..5fe5202 100644
--- a/src/mesa/drivers/dri/i965/brw_program.h
+++ b/src/mesa/drivers/dri/i965/brw_program.h
@@ -55,6 +55,7 @@ struct brw_sampler_prog_key_data {
 };
 
 void brw_populate_sampler_prog_key_data(struct gl_context *ctx,
-				        struct brw_sampler_prog_key_data *key, int i);
+				        struct gl_program *prog,
+				        struct brw_sampler_prog_key_data *key);
 
 #endif
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
index 7fc7dcc..c9fcea8 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -322,10 +322,7 @@ static void brw_upload_vs_prog(struct brw_context *brw)
    }
 
    /* _NEW_TEXTURE */
-   for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
-      if (prog->TexturesUsed[i])
-	 brw_populate_sampler_prog_key_data(ctx, &key.tex, i);
-   }
+   brw_populate_sampler_prog_key_data(ctx, prog, &key.tex);
 
    /* BRW_NEW_VERTICES */
    for (i = 0; i < VERT_ATTRIB_MAX; i++) {
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index cad0af8..cbf9e23 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -322,86 +322,91 @@ bool do_wm_prog(struct brw_context *brw,
 
 void
 brw_populate_sampler_prog_key_data(struct gl_context *ctx,
-				   struct brw_sampler_prog_key_data *key,
-				   int i)
+				   struct gl_program *prog,
+				   struct brw_sampler_prog_key_data *key)
 {
-   const struct gl_texture_unit *unit = &ctx->Texture.Unit[i];
-
-   if (unit->_ReallyEnabled) {
-      const struct gl_texture_object *t = unit->_Current;
-      const struct gl_texture_image *img = t->Image[0][t->BaseLevel];
-      struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, i);
-      int swizzles[SWIZZLE_NIL + 1] = {
-	 SWIZZLE_X,
-	 SWIZZLE_Y,
-	 SWIZZLE_Z,
-	 SWIZZLE_W,
-	 SWIZZLE_ZERO,
-	 SWIZZLE_ONE,
-	 SWIZZLE_NIL
-      };
-
-      if (img->_BaseFormat == GL_DEPTH_COMPONENT ||
-	  img->_BaseFormat == GL_DEPTH_STENCIL) {
-	 if (sampler->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB)
-	    key->compare_funcs[i] = sampler->CompareFunc;
-
-	 /* We handle GL_DEPTH_TEXTURE_MODE here instead of as surface format
-	  * overrides because shadow comparison always returns the result of
-	  * the comparison in all channels anyway.
-	  */
-	 switch (sampler->DepthMode) {
-	 case GL_ALPHA:
-	    swizzles[0] = SWIZZLE_ZERO;
-	    swizzles[1] = SWIZZLE_ZERO;
-	    swizzles[2] = SWIZZLE_ZERO;
-	    swizzles[3] = SWIZZLE_X;
-	    break;
-	 case GL_LUMINANCE:
-	    swizzles[0] = SWIZZLE_X;
-	    swizzles[1] = SWIZZLE_X;
-	    swizzles[2] = SWIZZLE_X;
-	    swizzles[3] = SWIZZLE_ONE;
-	    break;
-	 case GL_INTENSITY:
-	    swizzles[0] = SWIZZLE_X;
-	    swizzles[1] = SWIZZLE_X;
-	    swizzles[2] = SWIZZLE_X;
-	    swizzles[3] = SWIZZLE_X;
-	    break;
-	 case GL_RED:
-	    swizzles[0] = SWIZZLE_X;
-	    swizzles[1] = SWIZZLE_ZERO;
-	    swizzles[2] = SWIZZLE_ZERO;
-	    swizzles[3] = SWIZZLE_ONE;
-	    break;
+   for (int i = 0; i < BRW_MAX_TEX_UNIT; i++) {
+      if (!prog->TexturesUsed[i])
+	 continue;
+
+      const struct gl_texture_unit *unit = &ctx->Texture.Unit[i];
+
+      if (unit->_ReallyEnabled) {
+	 const struct gl_texture_object *t = unit->_Current;
+	 const struct gl_texture_image *img = t->Image[0][t->BaseLevel];
+	 struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, i);
+	 int swizzles[SWIZZLE_NIL + 1] = {
+	    SWIZZLE_X,
+	    SWIZZLE_Y,
+	    SWIZZLE_Z,
+	    SWIZZLE_W,
+	    SWIZZLE_ZERO,
+	    SWIZZLE_ONE,
+	    SWIZZLE_NIL
+	 };
+
+	 if (img->_BaseFormat == GL_DEPTH_COMPONENT ||
+	     img->_BaseFormat == GL_DEPTH_STENCIL) {
+	    if (sampler->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB)
+	       key->compare_funcs[i] = sampler->CompareFunc;
+
+	    /* We handle GL_DEPTH_TEXTURE_MODE here instead of as surface format
+	     * overrides because shadow comparison always returns the result of
+	     * the comparison in all channels anyway.
+	     */
+	    switch (sampler->DepthMode) {
+	    case GL_ALPHA:
+	       swizzles[0] = SWIZZLE_ZERO;
+	       swizzles[1] = SWIZZLE_ZERO;
+	       swizzles[2] = SWIZZLE_ZERO;
+	       swizzles[3] = SWIZZLE_X;
+	       break;
+	    case GL_LUMINANCE:
+	       swizzles[0] = SWIZZLE_X;
+	       swizzles[1] = SWIZZLE_X;
+	       swizzles[2] = SWIZZLE_X;
+	       swizzles[3] = SWIZZLE_ONE;
+	       break;
+	    case GL_INTENSITY:
+	       swizzles[0] = SWIZZLE_X;
+	       swizzles[1] = SWIZZLE_X;
+	       swizzles[2] = SWIZZLE_X;
+	       swizzles[3] = SWIZZLE_X;
+	       break;
+	    case GL_RED:
+	       swizzles[0] = SWIZZLE_X;
+	       swizzles[1] = SWIZZLE_ZERO;
+	       swizzles[2] = SWIZZLE_ZERO;
+	       swizzles[3] = SWIZZLE_ONE;
+	       break;
+	    }
 	 }
-      }
 
-      if (img->InternalFormat == GL_YCBCR_MESA) {
-	 key->yuvtex_mask |= 1 << i;
-	 if (img->TexFormat == MESA_FORMAT_YCBCR)
-	     key->yuvtex_swap_mask |= 1 << i;
-      }
+	 if (img->InternalFormat == GL_YCBCR_MESA) {
+	    key->yuvtex_mask |= 1 << i;
+	    if (img->TexFormat == MESA_FORMAT_YCBCR)
+		key->yuvtex_swap_mask |= 1 << i;
+	 }
 
-      key->swizzles[i] =
-	 MAKE_SWIZZLE4(swizzles[GET_SWZ(t->_Swizzle, 0)],
-		       swizzles[GET_SWZ(t->_Swizzle, 1)],
-		       swizzles[GET_SWZ(t->_Swizzle, 2)],
-		       swizzles[GET_SWZ(t->_Swizzle, 3)]);
-
-      if (sampler->MinFilter != GL_NEAREST &&
-	  sampler->MagFilter != GL_NEAREST) {
-	 if (sampler->WrapS == GL_CLAMP)
-	    key->gl_clamp_mask[0] |= 1 << i;
-	 if (sampler->WrapT == GL_CLAMP)
-	    key->gl_clamp_mask[1] |= 1 << i;
-	 if (sampler->WrapR == GL_CLAMP)
-	    key->gl_clamp_mask[2] |= 1 << i;
+	 key->swizzles[i] =
+	    MAKE_SWIZZLE4(swizzles[GET_SWZ(t->_Swizzle, 0)],
+			  swizzles[GET_SWZ(t->_Swizzle, 1)],
+			  swizzles[GET_SWZ(t->_Swizzle, 2)],
+			  swizzles[GET_SWZ(t->_Swizzle, 3)]);
+
+	 if (sampler->MinFilter != GL_NEAREST &&
+	     sampler->MagFilter != GL_NEAREST) {
+	    if (sampler->WrapS == GL_CLAMP)
+	       key->gl_clamp_mask[0] |= 1 << i;
+	    if (sampler->WrapT == GL_CLAMP)
+	       key->gl_clamp_mask[1] |= 1 << i;
+	    if (sampler->WrapR == GL_CLAMP)
+	       key->gl_clamp_mask[2] |= 1 << i;
+	 }
+      }
+      else {
+	 key->swizzles[i] = SWIZZLE_NOOP;
       }
-   }
-   else {
-      key->swizzles[i] = SWIZZLE_NOOP;
    }
 }
 
@@ -487,10 +492,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
    key->clamp_fragment_color = ctx->Color._ClampFragmentColor;
 
    /* _NEW_TEXTURE */
-   for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
-      if (prog->TexturesUsed[i])
-	 brw_populate_sampler_prog_key_data(ctx, &key->tex, i);
-   }
+   brw_populate_sampler_prog_key_data(ctx, prog, &key->tex);
 
    /* _NEW_BUFFERS */
    /*
-- 
1.7.7.5



More information about the mesa-dev mailing list