here is patch against Mesa CVS HEAD to refactor i830 texcombine
as its done in radeon/r200 driver.

it compiles, but its untested if it works.

feel free to test, modify, commit, drop

best regards,
Andreas Stenglein

Index: Mesa/src/mesa/drivers/dri/i830/i830_texstate.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/i830/i830_texstate.c,v
retrieving revision 1.5
diff -u -r1.5 i830_texstate.c
--- Mesa/src/mesa/drivers/dri/i830/i830_texstate.c      6 Feb 2004 17:39:03 -0000      
 1.5
+++ Mesa/src/mesa/drivers/dri/i830/i830_texstate.c      6 Mar 2004 19:48:36 -0000
@@ -189,828 +189,17 @@
    }
 }
 
-static void i830SetBlend_GL1_2(i830ContextPtr imesa, int curTex, 
-                              GLenum envMode, GLenum format)
-{
-   GLuint texel_op = GetTexelOp(curTex);
-
-   if(I830_DEBUG&DEBUG_TEXTURE)
-     fprintf(stderr, "%s %s %s unit (%d) texel_op(0x%x)\n",
-            __FUNCTION__,
-            _mesa_lookup_enum_by_nr(format),
-            _mesa_lookup_enum_by_nr(envMode),
-            curTex,
-            texel_op);
-
-   switch(envMode) {
-   case GL_REPLACE:
-      switch(format) {
-      case GL_ALPHA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-      case GL_LUMINANCE:
-      case GL_RGB:
-      case GL_YCBCR_MESA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-
-      case GL_INTENSITY:
-      case GL_LUMINANCE_ALPHA:
-      case GL_RGBA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-      default:
-        /* Always set to passthru if something is funny */
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-      }
-      break;
-
-   case GL_MODULATE:
-      switch(format) {
-      case GL_ALPHA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_MODULATE);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 5;
-        break;
-
-      case GL_LUMINANCE:
-      case GL_RGB:
-      case GL_YCBCR_MESA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_MODULATE);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 5;
-        break;
-
-      case GL_INTENSITY:
-      case GL_LUMINANCE_ALPHA:
-      case GL_RGBA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_MODULATE);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_MODULATE);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][5] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 6;
-        break;
-      default:
-        /* Always set to passthru if something is funny */
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-      }
-      break;
-
-   case GL_DECAL:
-      switch(format) {
-      case GL_RGB:
-      case GL_YCBCR_MESA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-
-      case GL_RGBA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_BLEND);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG0 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_REPLICATE_ALPHA |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][5] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 6;
-        break;
-      default:
-        /* Always set to passthru if something is funny */
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-      }
-      break;
-
-   case GL_BLEND:
-      switch(format) {
-      case GL_ALPHA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_MODULATE);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 5;
-        break;
-
-      case GL_LUMINANCE:
-      case GL_RGB:
-      case GL_YCBCR_MESA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_BLEND);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG0 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_FACTOR_N);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][5] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 6;
-        break;
-
-      case GL_INTENSITY:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_BLEND);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_BLEND);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG0 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_FACTOR_N);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][5] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG0 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][6] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_FACTOR_N);
-        imesa->TexBlend[curTex][7] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 8;
-        break;
-
-      case GL_LUMINANCE_ALPHA:
-      case GL_RGBA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_BLEND);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_MODULATE);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG0 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_FACTOR_N);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][5] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][6] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 7;
-        break;
-      default:
-        /* Always set to passthru if something is funny */
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-      }
-      break;
-
-   case GL_ADD:
-      switch(format) {
-      case GL_ALPHA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_MODULATE);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 5;
-        break;
-      case GL_LUMINANCE:
-      case GL_RGB:
-      case GL_YCBCR_MESA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ADD);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 5;
-        break;
-
-      case GL_INTENSITY:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ADD);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ADD);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][5] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 6;
-        break;
+   /* Native Arg1 == Arg0 in GL_EXT_texture_env_combine spec */
+   /* Native Arg2 == Arg1 in GL_EXT_texture_env_combine spec */
+   /* Native Arg0 == Arg2 in GL_EXT_texture_env_combine spec */
 
-      case GL_LUMINANCE_ALPHA:
-      case GL_RGBA:
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ADD);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_MODULATE);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][4] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      texel_op);
-        imesa->TexBlend[curTex][5] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG2 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 6;
-        break;
-      default:
-        /* Always set to passthru if something is funny */
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-      }
-      break;
-   default:
-        /* Always set to passthru if something is funny */
-        imesa->TexBlend[curTex][0] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      DISABLE_TEX_CNTRL_STAGE |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][1] = (STATE3D_MAP_BLEND_OP_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      ENABLE_TEXOUTPUT_WRT_SEL |
-                                      TEXOP_OUTPUT_CURRENT |
-                                      TEXOP_SCALE_1X |
-                                      TEXOP_MODIFY_PARMS |
-                                      TEXBLENDOP_ARG1);
-        imesa->TexBlend[curTex][2] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_COLOR |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlend[curTex][3] = (STATE3D_MAP_BLEND_ARG_CMD(curTex) |
-                                      TEXPIPE_ALPHA |
-                                      TEXBLEND_ARG1 |
-                                      TEXBLENDARG_MODIFY_PARMS |
-                                      TEXBLENDARG_CURRENT);
-        imesa->TexBlendColorPipeNum[curTex] = 0;
-        imesa->TexBlendWordsUsed[curTex] = 4;
-        break;
-   }
+static GLuint texcomb_arg[]=
+{
+   TEXBLEND_ARG1,
+   TEXBLEND_ARG2,
+   TEXBLEND_ARG0
+};
 
-   if (I830_DEBUG&DEBUG_TEXTURE)
-      fprintf(stderr, "%s\n", __FUNCTION__);
-}
 
 static void i830SetTexEnvCombine(i830ContextPtr imesa,
                                 const struct gl_texture_unit *texUnit, 
@@ -1021,14 +210,21 @@
    GLuint args_RGB[3];
    GLuint args_A[3];
    GLuint texel_op = GetTexelOp(unit);
-   GLuint rgb_shift = texUnit->Combine.ScaleShiftRGB;
-   GLuint alpha_shift = texUnit->Combine.ScaleShiftA;
-   int i;
+   const GLuint numColorArgs = texUnit->_CurrentCombine->_NumArgsRGB;
+   const GLuint numAlphaArgs = texUnit->_CurrentCombine->_NumArgsA;
+   GLuint rgb_shift = texUnit->_CurrentCombine->ScaleShiftRGB;
+   GLuint alpha_shift = texUnit->_CurrentCombine->ScaleShiftA;
+   int i, j;
+   
+   assert( numColorArgs <= 3);
+   assert( numColorArgs >= 0);
+   assert( numAlphaArgs <= 3);
+   assert( numAlphaArgs >= 0);
 
    if(I830_DEBUG&DEBUG_TEXTURE)
       fprintf(stderr, "%s\n", __FUNCTION__);
 
-   switch(texUnit->Combine.ModeRGB) {
+   switch(texUnit->_CurrentCombine->ModeRGB) {
    case GL_REPLACE: 
       blendop = TEXBLENDOP_ARG1;
       break;
@@ -1067,7 +263,7 @@
 
    blendop |= (rgb_shift << TEXOP_SCALE_SHIFT);
 
-   switch(texUnit->Combine.ModeA) {
+   switch(texUnit->_CurrentCombine->ModeA) {
    case GL_REPLACE: 
       ablendop = TEXBLENDOP_ARG1;
       break;
@@ -1090,16 +286,16 @@
       return;
    }
 
-   if ( (texUnit->Combine.ModeRGB == GL_DOT3_RGBA_EXT)
-       || (texUnit->Combine.ModeRGB == GL_DOT3_RGBA) ) {
+   if ( (texUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA_EXT)
+       || (texUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA) ) {
       ablendop = TEXBLENDOP_DOT3;
    }
 
    ablendop |= (alpha_shift << TEXOP_SCALE_SHIFT);
 
    /* Handle RGB args */
-   for(i = 0; i < 3; i++) {
-      switch(texUnit->Combine.SourceRGB[i]) {
+   for(i = 0; i < numColorArgs; i++) {
+      switch(texUnit->_CurrentCombine->SourceRGB[i]) {
       case GL_TEXTURE: 
         args_RGB[i] = texel_op;
         break;
@@ -1117,7 +313,7 @@
         
       }
 
-      switch(texUnit->Combine.OperandRGB[i]) {
+      switch(texUnit->_CurrentCombine->OperandRGB[i]) {
       case GL_SRC_COLOR: 
         args_RGB[i] |= 0;
         break;
@@ -1137,8 +333,8 @@
    }
 
    /* Handle A args */
-   for(i = 0; i < 3; i++) {
-      switch(texUnit->Combine.SourceA[i]) {
+   for(i = 0; i < numAlphaArgs; i++) {
+      switch(texUnit->_CurrentCombine->SourceA[i]) {
       case GL_TEXTURE: 
         args_A[i] = texel_op;
         break;
@@ -1156,7 +352,7 @@
         
       }
 
-      switch(texUnit->Combine.OperandA[i]) {
+      switch(texUnit->_CurrentCombine->OperandA[i]) {
       case GL_SRC_ALPHA: 
         args_A[i] |= 0;
         break;
@@ -1168,18 +364,12 @@
       }
    }
 
-   /* Native Arg1 == Arg0 in GL_EXT_texture_env_combine spec */
-   /* Native Arg2 == Arg1 in GL_EXT_texture_env_combine spec */
-   /* Native Arg0 == Arg2 in GL_EXT_texture_env_combine spec */
-
    /* When we render we need to figure out which is the last really enabled
     * tex unit, and put last stage on it
     */
 
    imesa->TexBlendColorPipeNum[unit] = 0;
 
-   /* Build color pipeline */
-
    imesa->TexBlend[unit][0] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
                               TEXPIPE_COLOR |
                               ENABLE_TEXOUTPUT_WRT_SEL |
@@ -1187,45 +377,29 @@
                               DISABLE_TEX_CNTRL_STAGE |
                               TEXOP_MODIFY_PARMS |
                               blendop);
-   imesa->TexBlend[unit][1] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
-                              TEXPIPE_COLOR |
-                              TEXBLEND_ARG1 |
-                              TEXBLENDARG_MODIFY_PARMS |
-                              args_RGB[0]);
-   imesa->TexBlend[unit][2] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
-                              TEXPIPE_COLOR |
-                              TEXBLEND_ARG2 |
-                              TEXBLENDARG_MODIFY_PARMS |
-                              args_RGB[1]);
-   imesa->TexBlend[unit][3] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
-                              TEXPIPE_COLOR |
-                              TEXBLEND_ARG0 |
-                              TEXBLENDARG_MODIFY_PARMS |
-                              args_RGB[2]);
-
-   /* Build Alpha pipeline */
-   imesa->TexBlend[unit][4] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
+   imesa->TexBlend[unit][1] = (STATE3D_MAP_BLEND_OP_CMD(unit) |
                               TEXPIPE_ALPHA |
                               ENABLE_TEXOUTPUT_WRT_SEL |
                               TEXOP_OUTPUT_CURRENT |
                               TEXOP_MODIFY_PARMS |
                               ablendop);
-   imesa->TexBlend[unit][5] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
-                              TEXPIPE_ALPHA |
-                              TEXBLEND_ARG1 |
-                              TEXBLENDARG_MODIFY_PARMS |
-                              args_A[0]);
-   imesa->TexBlend[unit][6] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
-                              TEXPIPE_ALPHA |
-                              TEXBLEND_ARG2 |
-                              TEXBLENDARG_MODIFY_PARMS |
-                              args_A[1]);
-   imesa->TexBlend[unit][7] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
-                              TEXPIPE_ALPHA |
-                              TEXBLEND_ARG0 |
-                              TEXBLENDARG_MODIFY_PARMS |
-                              args_A[2]);
+   j= 2;
+   for(i = 0; i < numColorArgs; i++) {
+      imesa->TexBlend[unit][j++] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
+                                   TEXPIPE_COLOR |
+                                   TEXBLENDARG_MODIFY_PARMS |
+                                   texcomb_arg[i] |
+                                   args_RGB[i]);
+   }
+   for(i = 0; i < numAlphaArgs; i++) {
+      imesa->TexBlend[unit][j++] = (STATE3D_MAP_BLEND_ARG_CMD(unit) |
+                                   TEXPIPE_ALPHA |
+                                   TEXBLENDARG_MODIFY_PARMS |
+                                   texcomb_arg[i] |
+                                   args_A[i]);
+   }
 
+   /* add blend color */
    {
       GLubyte r, g, b, a;
       GLfloat *fc = texUnit->EnvColor;
@@ -1235,13 +409,13 @@
       FLOAT_COLOR_TO_UBYTE_COLOR(b, fc[BCOMP]);
       FLOAT_COLOR_TO_UBYTE_COLOR(a, fc[ACOMP]);
 
-      imesa->TexBlend[unit][8] = STATE3D_COLOR_FACTOR_CMD(unit);
-      imesa->TexBlend[unit][9] =  ((a << 24) |
-                                  (r << 16) |
-                                  (g << 8) |
-                                  b);
+      imesa->TexBlend[unit][j++] = STATE3D_COLOR_FACTOR_CMD(unit);
+      imesa->TexBlend[unit][j++] =  ((a << 24) |
+                                    (r << 16) |
+                                    (g << 8) |
+                                    b);
    }
-   imesa->TexBlendWordsUsed[unit] = 10;
+   imesa->TexBlendWordsUsed[unit] = j;
 }
 
 
@@ -1251,51 +425,15 @@
 {
    i830ContextPtr imesa = I830_CONTEXT(ctx);
    const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
-   const struct gl_texture_object *tObj = texUnit->_Current;
-   i830TextureObjectPtr t = (i830TextureObjectPtr)tObj->DriverData;
-   GLuint col;
 
    imesa->TexBlendWordsUsed[unit] = 0;
 
    if (0) fprintf(stderr, "i830UpdateTexEnv called : %s\n",
                  _mesa_lookup_enum_by_nr(texUnit->EnvMode));
 
-   if(texUnit->EnvMode == GL_COMBINE) {
       i830SetTexEnvCombine(imesa,
                           texUnit,
                           unit);
-   } else {
-      i830SetBlend_GL1_2(imesa,
-                        unit,
-                        texUnit->EnvMode,
-                        t->image[0][0].internalFormat);
-
-      /* add blend color */
-      {
-        GLubyte r, g, b, a;
-        GLfloat *fc = texUnit->EnvColor;
-
-        FLOAT_COLOR_TO_UBYTE_COLOR(r, fc[RCOMP]);
-        FLOAT_COLOR_TO_UBYTE_COLOR(g, fc[GCOMP]);
-        FLOAT_COLOR_TO_UBYTE_COLOR(b, fc[BCOMP]);
-        FLOAT_COLOR_TO_UBYTE_COLOR(a, fc[ACOMP]);
-
-        col = ((a << 24) |
-               (r << 16) |
-               (g << 8) |
-               b);
-      }       
-
-      {
-        int i;
-
-        i = imesa->TexBlendWordsUsed[unit];
-        imesa->TexBlend[unit][i++] = STATE3D_COLOR_FACTOR_CMD(unit);     
-        imesa->TexBlend[unit][i++] = col;
-
-        imesa->TexBlendWordsUsed[unit] = i;
-      }
-   }
 
    I830_STATECHANGE( imesa, I830_UPLOAD_TEXBLEND_N(unit) );
 }

Reply via email to