All elements of pre-DRI_NEW_INTERFACE_ONLY are removed. This allows
[mesa.git] / src / mesa / drivers / dri / mga / mgastate.c
index 29815008be97a73d74233b99b747901793907f9d..72d5c9fb0829675e0d689f13815e380f87151e03 100644 (file)
@@ -28,6 +28,7 @@
 
 
 #include "mtypes.h"
+#include "buffers.h"
 #include "colormac.h"
 #include "dd.h"
 
 #include "tnl/t_pipeline.h"
 #include "swrast_setup/swrast_setup.h"
 
+#include "xmlpool.h"
 
 static void updateSpecularLighting( GLcontext *ctx );
 
-
-/* Some outstanding problems with accelerating logic ops...
- */
-#if defined(ACCEL_ROP)
 static const GLuint mgarop_NoBLK[16] = {
    DC_atype_rpl  | 0x00000000, DC_atype_rstr | 0x00080000,
    DC_atype_rstr | 0x00040000, DC_atype_rpl  | 0x000c0000,
@@ -65,8 +63,6 @@ static const GLuint mgarop_NoBLK[16] = {
    DC_atype_rpl  | 0x00030000, DC_atype_rstr | 0x000b0000,
    DC_atype_rstr | 0x00070000, DC_atype_rpl  | 0x000f0000
 };
-#endif
-
 
 /* =============================================================
  * Alpha blending
@@ -111,27 +107,36 @@ static void mgaDDAlphaFunc(GLcontext *ctx, GLenum func, GLfloat ref)
       break;
    }
 
-   FLUSH_BATCH( mmesa );
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
    mmesa->hw.alpha_func = a | MGA_FIELD( AC_atref, refByte );
-   mmesa->dirty |= MGA_UPLOAD_CONTEXT;
 }
 
-static void mgaDDBlendEquation(GLcontext *ctx, GLenum mode)
+static void updateBlendLogicOp(GLcontext *ctx)
 {
-   FLUSH_BATCH( MGA_CONTEXT(ctx) );
+   mgaContextPtr mmesa = MGA_CONTEXT(ctx);
 
-   /* BlendEquation sets ColorLogicOpEnabled in an unexpected 
-    * manner.  
-    */
-   FALLBACK( ctx, MGA_FALLBACK_LOGICOP,
-            (ctx->Color.ColorLogicOpEnabled && 
-             ctx->Color.LogicOp != GL_COPY));
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
+
+   mmesa->hw.blend_func_enable =
+      (ctx->Color.BlendEnabled && !ctx->Color._LogicOpEnabled) ? ~0 : 0;
+
+   FALLBACK( ctx, MGA_FALLBACK_BLEND,
+             ctx->Color.BlendEnabled && !ctx->Color._LogicOpEnabled &&
+             mmesa->hw.blend_func == (AC_src_src_alpha_sat | AC_dst_zero) );
 }
 
-static void mgaDDBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor)
+static void mgaDDBlendEquationSeparate(GLcontext *ctx, 
+                                      GLenum modeRGB, GLenum modeA)
+{
+   assert( modeRGB == modeA );
+   updateBlendLogicOp( ctx );
+}
+
+static void mgaDDBlendFuncSeparate( GLcontext *ctx, GLenum sfactorRGB,
+                                   GLenum dfactorRGB, GLenum sfactorA,
+                                   GLenum dfactorA )
 {
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);
-   mgaScreenPrivate *mgaScreen = mmesa->mgaScreen;
    GLuint   src;
    GLuint   dst;
 
@@ -150,11 +155,11 @@ static void mgaDDBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor)
    case GL_ONE_MINUS_SRC_ALPHA:
       src = AC_src_om_src_alpha; break;
    case GL_DST_ALPHA:
-      src = (mgaScreen->cpp == 4) 
+      src = (ctx->Visual.alphaBits > 0)
          ? AC_src_dst_alpha : AC_src_one;
       break;
    case GL_ONE_MINUS_DST_ALPHA:
-      src = (mgaScreen->cpp == 4)
+      src = (ctx->Visual.alphaBits > 0)
          ? AC_src_om_dst_alpha : AC_src_zero;
       break;
    case GL_SRC_ALPHA_SATURATE:
@@ -178,28 +183,23 @@ static void mgaDDBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor)
    case GL_ONE_MINUS_SRC_COLOR:
       dst = AC_dst_om_src_color; break;
    case GL_DST_ALPHA:
-      dst = (mgaScreen->cpp == 4)
+      dst = (ctx->Visual.alphaBits > 0)
          ? AC_dst_dst_alpha : AC_dst_one;
       break;
    case GL_ONE_MINUS_DST_ALPHA:
-      dst = (mgaScreen->cpp == 4)
+      dst = (ctx->Visual.alphaBits > 0)
          ? AC_dst_om_dst_alpha : AC_dst_zero;
       break;
    }
 
-   FLUSH_BATCH( mmesa );
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
    mmesa->hw.blend_func = (src | dst);
-   mmesa->dirty |= MGA_UPLOAD_CONTEXT;
-}
 
-static void mgaDDBlendFuncSeparate( GLcontext *ctx, GLenum sfactorRGB,
-                                   GLenum dfactorRGB, GLenum sfactorA,
-                                   GLenum dfactorA )
-{
-   mgaDDBlendFunc( ctx, sfactorRGB, dfactorRGB );
+   FALLBACK( ctx, MGA_FALLBACK_BLEND,
+             ctx->Color.BlendEnabled && !ctx->Color._LogicOpEnabled &&
+             mmesa->hw.blend_func == (AC_src_src_alpha_sat | AC_dst_zero) );
 }
 
-
 /* =============================================================
  * Depth testing
  */
@@ -233,10 +233,9 @@ static void mgaDDDepthFunc(GLcontext *ctx, GLenum func)
       zmode = 0; break;
    }
 
-   FLUSH_BATCH( mmesa );
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
    mmesa->hw.zmode &= DC_zmode_MASK;
    mmesa->hw.zmode |= zmode;
-   mmesa->dirty |= MGA_UPLOAD_CONTEXT;
 }
 
 static void mgaDDDepthMask(GLcontext *ctx, GLboolean flag)
@@ -244,10 +243,9 @@ static void mgaDDDepthMask(GLcontext *ctx, GLboolean flag)
    mgaContextPtr mmesa = MGA_CONTEXT( ctx );
 
 
-   FLUSH_BATCH( mmesa );
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
    mmesa->hw.zmode &= DC_atype_MASK;
    mmesa->hw.zmode |= (flag) ? DC_atype_zi : DC_atype_i;
-   mmesa->dirty |= MGA_UPLOAD_CONTEXT;
 }
 
 
@@ -302,8 +300,8 @@ void mgaUpdateClipping(const GLcontext *ctx)
       int x1 = mmesa->driDrawable->x + ctx->Scissor.X;
       int y1 = mmesa->driDrawable->y + mmesa->driDrawable->h
         - (ctx->Scissor.Y + ctx->Scissor.Height);
-      int x2 = x1 + ctx->Scissor.Width - 1;
-      int y2 = y1 + ctx->Scissor.Height - 1;
+      int x2 = x1 + ctx->Scissor.Width;
+      int y2 = y1 + ctx->Scissor.Height;
 
       if (x1 < 0) x1 = 0;
       if (y1 < 0) y1 = 0;
@@ -343,8 +341,7 @@ static void mgaDDCullFaceFrontFace(GLcontext *ctx, GLenum unused)
 {
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);
 
-
-   FLUSH_BATCH( mmesa );
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
    if (ctx->Polygon.CullFlag && 
        ctx->Polygon.CullFaceMode != GL_FRONT_AND_BACK) 
    {
@@ -363,8 +360,6 @@ static void mgaDDCullFaceFrontFace(GLcontext *ctx, GLenum unused)
       mmesa->hw.cull = _CULL_DISABLE;
       mmesa->hw.cull_dualtex = _CULL_DISABLE;
    }
-
-   mmesa->dirty |= MGA_UPLOAD_CONTEXT;
 }
 
 
@@ -489,13 +484,11 @@ static void updateSpecularLighting( GLcontext *ctx )
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);
    unsigned int specen;
 
-   specen = (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) ? TMC_specen_enable : 0;
+   specen = NEED_SECONDARY_COLOR(ctx) ? TMC_specen_enable : 0;
 
    if ( specen != mmesa->hw.specen ) {
       mmesa->hw.specen = specen;
       mmesa->dirty |= MGA_UPLOAD_TEX0 | MGA_UPLOAD_TEX1;
-      
-      mgaChooseVertexState( ctx );
    }
 }
 
@@ -527,7 +520,7 @@ static void mgaDDStencilFunc(GLcontext *ctx, GLenum func, GLint ref,
    GLuint  stencil;
    GLuint  stencilctl;
 
-   stencil = (ref << S_sref_SHIFT) | (mask << S_smsk_SHIFT);
+   stencil = MGA_FIELD( S_sref, ref ) | MGA_FIELD( S_smsk, mask );
    switch (func)
    {
    case GL_NEVER:
@@ -557,22 +550,20 @@ static void mgaDDStencilFunc(GLcontext *ctx, GLenum func, GLint ref,
       break;
    }
 
-   FLUSH_BATCH( mmesa );
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
    mmesa->hw.stencil &= (S_sref_MASK & S_smsk_MASK);
    mmesa->hw.stencil |= stencil;
    mmesa->hw.stencilctl &= SC_smode_MASK;
    mmesa->hw.stencilctl |= stencilctl;
-   mmesa->dirty |= MGA_UPLOAD_CONTEXT;
 }
 
 static void mgaDDStencilMask(GLcontext *ctx, GLuint mask)
 {
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);
 
-   FLUSH_BATCH( mmesa );
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
    mmesa->hw.stencil &= S_swtmsk_MASK;
-   mmesa->hw.stencil |= (mask << S_swtmsk_SHIFT);
-   mmesa->dirty |= MGA_UPLOAD_CONTEXT;
+   mmesa->hw.stencil |= MGA_FIELD( S_swtmsk, mask );
 }
 
 static void mgaDDStencilOp(GLcontext *ctx, GLenum fail, GLenum zfail,
@@ -672,11 +663,10 @@ static void mgaDDStencilOp(GLcontext *ctx, GLenum fail, GLenum zfail,
       break;
    }
 
-   FLUSH_BATCH( mmesa );
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
    mmesa->hw.stencilctl &= (SC_sfailop_MASK & SC_szfailop_MASK 
                            & SC_szpassop_MASK);
    mmesa->hw.stencilctl |= stencilctl;
-   mmesa->dirty |= MGA_UPLOAD_CONTEXT;
 }
 
 
@@ -706,6 +696,8 @@ static void mgaViewport( GLcontext *ctx,
                          GLint x, GLint y, 
                          GLsizei width, GLsizei height )
 {
+   /* update size of Mesa/software ancillary buffers */
+   _mesa_ResizeBuffersMESA();
    mgaCalcViewport( ctx );
 }
 
@@ -747,14 +739,8 @@ static void mgaDDLogicOp( GLcontext *ctx, GLenum opcode )
 {
    mgaContextPtr mmesa = MGA_CONTEXT( ctx );
 
-   FLUSH_BATCH( mmesa );
-#if defined(ACCEL_ROP)
+   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
    mmesa->hw.rop = mgarop_NoBLK[ opcode & 0x0f ];
-   mmesa->dirty |= MGA_UPLOAD_CONTEXT;
-#else
-   FALLBACK( ctx, MGA_FALLBACK_LOGICOP,
-            (ctx->Color.ColorLogicOpEnabled && opcode != GL_COPY) );
-#endif
 }
 
 
@@ -763,7 +749,7 @@ static void mgaXMesaSetFrontClipRects( mgaContextPtr mmesa )
    __DRIdrawablePrivate *driDrawable = mmesa->driDrawable;
 
    if (driDrawable->numClipRects == 0) {
-       static XF86DRIClipRectRec zeroareacliprect = {0,0,0,0};
+       static drm_clip_rect_t zeroareacliprect = {0,0,0,0};
        mmesa->numClipRects = 1;
        mmesa->pClipRects = &zeroareacliprect;
    } else {
@@ -785,7 +771,7 @@ static void mgaXMesaSetBackClipRects( mgaContextPtr mmesa )
    if (driDrawable->numBackClipRects == 0)
    {
       if (driDrawable->numClipRects == 0) {
-         static XF86DRIClipRectRec zeroareacliprect = {0,0,0,0};
+         static drm_clip_rect_t zeroareacliprect = {0,0,0,0};
          mmesa->numClipRects = 1;
          mmesa->pClipRects = &zeroareacliprect;
       } else {
@@ -809,7 +795,7 @@ static void mgaXMesaSetBackClipRects( mgaContextPtr mmesa )
 void mgaUpdateRects( mgaContextPtr mmesa, GLuint buffers )
 {
    __DRIdrawablePrivate *driDrawable = mmesa->driDrawable;
-   MGASAREAPrivPtr sarea = mmesa->sarea;
+   drm_mga_sarea_t *sarea = mmesa->sarea;
 
 
    DRI_VALIDATE_DRAWABLE_INFO(mmesa->driScreen, driDrawable); 
@@ -820,10 +806,9 @@ void mgaUpdateRects( mgaContextPtr mmesa, GLuint buffers )
    else
       mgaXMesaSetBackClipRects( mmesa );
 
-#ifndef _SOLO
    sarea->req_drawable = driDrawable->draw;
    sarea->req_draw_buffer = mmesa->draw_buffer;
-#endif
+
    mgaUpdateClipping( mmesa->glCtx );
    mgaCalcViewport( mmesa->glCtx );
 
@@ -840,15 +825,15 @@ static void mgaDDDrawBuffer(GLcontext *ctx, GLenum mode )
    /*
     * _DrawDestMask is easier to cope with than <mode>.
     */
-   switch ( ctx->Color._DrawDestMask ) {
-   case FRONT_LEFT_BIT:
+   switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) {
+   case BUFFER_BIT_FRONT_LEFT:
       mmesa->setup.dstorg = mmesa->mgaScreen->frontOffset;
       mmesa->dirty |= MGA_UPLOAD_CONTEXT;
       mmesa->draw_buffer = MGA_FRONT;
       mgaXMesaSetFrontClipRects( mmesa );
       FALLBACK( ctx, MGA_FALLBACK_DRAW_BUFFER, GL_FALSE );
       break;
-   case BACK_LEFT_BIT:
+   case BUFFER_BIT_BACK_LEFT:
       mmesa->setup.dstorg = mmesa->mgaScreen->backOffset;
       mmesa->draw_buffer = MGA_BACK;
       mmesa->dirty |= MGA_UPLOAD_CONTEXT;
@@ -884,27 +869,24 @@ static void mgaDDEnable(GLcontext *ctx, GLenum cap, GLboolean state)
    mgaContextPtr mmesa = MGA_CONTEXT( ctx );
 
    switch(cap) {
+   case GL_DITHER:
+      MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
+      if (!ctx->Color.DitherFlag)
+        mmesa->setup.maccess |= MA_nodither_enable;
+      else
+        mmesa->setup.maccess &= ~MA_nodither_enable;
+      break;
    case GL_LIGHTING:
    case GL_COLOR_SUM_EXT:
       FLUSH_BATCH( mmesa );
       updateSpecularLighting( ctx );
       break;
    case GL_ALPHA_TEST:
-      FLUSH_BATCH( mmesa );
+      MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
       mmesa->hw.alpha_func_enable = (state) ? ~0 : 0;
       break;
-   case GL_BLEND:
-      FLUSH_BATCH( mmesa );
-      mmesa->hw.blend_func_enable = (state) ? ~0 : 0;
-
-      /* For some reason enable(GL_BLEND) affects ColorLogicOpEnabled.
-       */
-      FALLBACK( ctx, MGA_FALLBACK_LOGICOP,
-               (ctx->Color.ColorLogicOpEnabled && 
-                ctx->Color.LogicOp != GL_COPY));
-      break;
    case GL_DEPTH_TEST:
-      FLUSH_BATCH( mmesa );
+      MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
       FALLBACK (ctx, MGA_FALLBACK_DEPTH,
                ctx->Depth.Func == GL_NEVER && ctx->Depth.Test);
       break;
@@ -921,8 +903,6 @@ static void mgaDDEnable(GLcontext *ctx, GLenum cap, GLboolean state)
         mmesa->setup.maccess |= MA_fogen_enable;
       else
         mmesa->setup.maccess &= ~MA_fogen_enable;
-      
-      mgaChooseVertexState( ctx );
       break;
    case GL_CULL_FACE:
       mgaDDCullFaceFrontFace( ctx, 0 );
@@ -933,22 +913,20 @@ static void mgaDDEnable(GLcontext *ctx, GLenum cap, GLboolean state)
       break;
    case GL_POLYGON_STIPPLE:
       if (mmesa->haveHwStipple && mmesa->raster_primitive == GL_TRIANGLES) {
-        FLUSH_BATCH(mmesa);
-        mmesa->dirty |= MGA_UPLOAD_CONTEXT;
+        MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
         mmesa->setup.dwgctl &= ~(0xf<<20);
         if (state)
            mmesa->setup.dwgctl |= mmesa->poly_stipple;
       }
       break;
+
+   case GL_BLEND:
    case GL_COLOR_LOGIC_OP:
-      FLUSH_BATCH( mmesa );
-#if !defined(ACCEL_ROP)
-      FALLBACK( ctx, MGA_FALLBACK_LOGICOP, 
-               (state && ctx->Color.LogicOp != GL_COPY));
-#endif
+      updateBlendLogicOp( ctx );
       break;
+
    case GL_STENCIL_TEST:
-      FLUSH_BATCH( mmesa );
+      MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );
       if (mmesa->hw_stencil) {
         mmesa->hw.stencil_enable = ( state ) ? ~0 : 0;
       }
@@ -983,7 +961,7 @@ static void mgaDDPrintDirty( const char *msg, GLuint state )
  */
 void mgaEmitHwStateLocked( mgaContextPtr mmesa )
 {
-   MGASAREAPrivPtr sarea = mmesa->sarea;
+   drm_mga_sarea_t *sarea = mmesa->sarea;
    GLcontext * ctx = mmesa->glCtx;
 
    if (MGA_DEBUG & DEBUG_VERBOSE_MSG)
@@ -1013,70 +991,50 @@ void mgaEmitHwStateLocked( mgaContextPtr mmesa )
       mmesa->setup.dwgctl |= (ctx->Depth.Test)
          ? mmesa->hw.zmode : (DC_zmode_nozcmp | DC_atype_i);
 
-#if defined(ACCEL_ROP)
       mmesa->setup.dwgctl &= DC_bop_MASK;
-      mmesa->setup.dwgctl |= (ctx->Color.ColorLogicOpEnabled)
+      mmesa->setup.dwgctl |= (ctx->Color._LogicOpEnabled)
          ? mmesa->hw.rop : mgarop_NoBLK[ GL_COPY & 0x0f ];
-#endif
 
       mmesa->setup.alphactrl &= AC_src_MASK & AC_dst_MASK & AC_atmode_MASK
-         & AC_atref_MASK & AC_alphasel_MASK;
+        & AC_atref_MASK & AC_alphasel_MASK;
       mmesa->setup.alphactrl |= 
-         ((mmesa->hw.alpha_func & mmesa->hw.alpha_func_enable)
-          | ((mmesa->hw.blend_func & mmesa->hw.blend_func_enable)
-             | ((AC_src_one | AC_dst_zero) & ~mmesa->hw.blend_func_enable))
-          | mmesa->hw.alpha_sel
-          | (AC_amode_alpha_channel
-             | AC_astipple_disable 
-             | AC_aten_disable 
-             | AC_atmode_noacmp));
-
-      memcpy( &sarea->ContextState, &mmesa->setup, sizeof(mmesa->setup));
+        (mmesa->hw.alpha_func & mmesa->hw.alpha_func_enable) |
+        (mmesa->hw.blend_func & mmesa->hw.blend_func_enable) |
+        ((AC_src_one | AC_dst_zero) & ~mmesa->hw.blend_func_enable) |
+        mmesa->hw.alpha_sel;
+
+      memcpy( &sarea->context_state, &mmesa->setup, sizeof(mmesa->setup));
    }
 
    if ((mmesa->dirty & MGA_UPLOAD_TEX0) && mmesa->CurrentTexObj[0]) {
-      memcpy(&sarea->TexState[0],
+      memcpy(&sarea->tex_state[0],
             &mmesa->CurrentTexObj[0]->setup,
-            sizeof(sarea->TexState[0]));
+            sizeof(sarea->tex_state[0]));
    }
 
    if ((mmesa->dirty & MGA_UPLOAD_TEX1) && mmesa->CurrentTexObj[1]) {
-      memcpy(&sarea->TexState[1],
+      memcpy(&sarea->tex_state[1],
             &mmesa->CurrentTexObj[1]->setup,
-            sizeof(sarea->TexState[1]));
+            sizeof(sarea->tex_state[1]));
    }
 
-   if (mmesa->dualtex_env) {
-      sarea->TexState[0].texctl2 |= TMC_dualtex_enable;
-      memcpy( &sarea->TexState[1], &sarea->TexState[0],
-             sizeof(sarea->TexState[0]) );
-      mmesa->dirty |= MGA_UPLOAD_TEX1|MGA_UPLOAD_TEX0;
-   } else if ( (sarea->TexState[0].texctl2 & TMC_borderen_MASK) !=
-               (sarea->TexState[1].texctl2 & TMC_borderen_MASK) ) {
-      const int borderen = sarea->TexState[1].texctl2 & ~TMC_borderen_MASK;
-
-      memcpy( &sarea->TexState[1], &sarea->TexState[0],
-             sizeof(sarea->TexState[0]) );
-      sarea->TexState[1].texctl2 |= borderen;
-      mmesa->dirty |= MGA_UPLOAD_TEX1|MGA_UPLOAD_TEX0;
+   if (mmesa->dirty & (MGA_UPLOAD_TEX0 | MGA_UPLOAD_TEX1)) {
+      sarea->tex_state[0].texctl2 &= ~TMC_specen_enable;
+      sarea->tex_state[1].texctl2 &= ~TMC_specen_enable;
+      sarea->tex_state[0].texctl2 |= mmesa->hw.specen;
+      sarea->tex_state[1].texctl2 |= mmesa->hw.specen;
    }
 
    if (mmesa->dirty & MGA_UPLOAD_PIPE) {
 /*        mmesa->sarea->wacceptseq = mmesa->hw_primitive; */
-      mmesa->sarea->WarpPipe = mmesa->vertex_format;
+      mmesa->sarea->warp_pipe = mmesa->vertex_format;
       mmesa->sarea->vertsize = mmesa->vertex_size;
    }
 
    mmesa->sarea->dirty |= mmesa->dirty;
    mmesa->dirty &= MGA_UPLOAD_CLIPRECTS;
-
-   sarea->TexState[0].texctl2 &= ~TMC_specen_enable;
-   sarea->TexState[1].texctl2 &= ~TMC_specen_enable;
-   sarea->TexState[0].texctl2 |= mmesa->hw.specen;
-   sarea->TexState[1].texctl2 |= mmesa->hw.specen;
 }
 
-
 /* =============================================================
  */
 
@@ -1155,6 +1113,9 @@ void mgaInitState( mgaContextPtr mmesa )
                           MA_tlutload_disable |
                           MA_nodither_disable |
                           MA_dit555_disable);
+   if (driQueryOptioni (&mmesa->optionCache, "color_reduction") !=
+       DRI_CONF_COLOR_REDUCTION_DITHER)
+      mmesa->setup.maccess |= MA_nodither_enable;
 
    switch (mmesa->mgaScreen->cpp) {
    case 2:
@@ -1182,14 +1143,20 @@ void mgaInitState( mgaContextPtr mmesa )
    }
 
    mmesa->hw.blend_func = AC_src_one | AC_dst_zero;
+   mmesa->hw.blend_func_enable = 0;
+   mmesa->hw.alpha_func = AC_atmode_noacmp | MGA_FIELD( AC_atref, 0x00 );
+   mmesa->hw.alpha_func_enable = 0;
+   mmesa->hw.rop = mgarop_NoBLK[ GL_COPY & 0x0f ];
    mmesa->hw.zmode = DC_zmode_zlt | DC_atype_zi;
-   mmesa->hw.stencil = (0x0ff << S_smsk_SHIFT) | (0x0ff << S_swtmsk_SHIFT);
+   mmesa->hw.stencil = MGA_FIELD( S_sref, 0x00) | MGA_FIELD( S_smsk, 0xff ) |
+      MGA_FIELD( S_swtmsk, 0xff );
    mmesa->hw.stencilctl = SC_smode_salways | SC_sfailop_keep 
-       | SC_szfailop_keep | SC_szpassop_keep;
+      | SC_szfailop_keep | SC_szpassop_keep;
    mmesa->hw.stencil_enable = 0;
    mmesa->hw.cull = _CULL_DISABLE;
    mmesa->hw.cull_dualtex = _CULL_DISABLE;
    mmesa->hw.specen = 0;
+   mmesa->hw.alpha_sel = AC_alphasel_diffused;
 
    mmesa->setup.dwgctl = (DC_opcod_trap |
                          DC_linear_xy |
@@ -1197,22 +1164,17 @@ void mgaInitState( mgaContextPtr mmesa )
                          DC_arzero_disable |
                          DC_sgnzero_disable |
                          DC_shftzero_enable |
-                         (0xC << DC_bop_SHIFT) |
-                         (0x0 << DC_trans_SHIFT) |
+                         MGA_FIELD( DC_bop, 0xC ) |
+                         MGA_FIELD( DC_trans, 0x0 ) |
                          DC_bltmod_bmonolef |
                          DC_pattern_disable |
                          DC_transc_disable |
                          DC_clipdis_disable);
 
-
    mmesa->setup.plnwt = ~0;
-   mmesa->setup.alphactrl = ( AC_src_one |
-                             AC_dst_zero |
-                             AC_amode_FCOL |
-                             AC_astipple_disable |
-                             AC_aten_disable |
-                             AC_atmode_noacmp |
-                             AC_alphasel_fromtex );
+   mmesa->setup.alphactrl = (AC_amode_alpha_channel |
+                            AC_astipple_disable |
+                            AC_aten_disable);
 
    mmesa->setup.fogcolor = PACK_COLOR_888((GLubyte)(ctx->Fog.Color[0]*255.0F),
                                          (GLubyte)(ctx->Fog.Color[1]*255.0F),
@@ -1224,9 +1186,8 @@ void mgaInitState( mgaContextPtr mmesa )
    mmesa->setup.fcol = 0;
    mmesa->dirty |= MGA_UPLOAD_CONTEXT;
 
-   mmesa->envcolor = 0;
-   mmesa->blend_flags = MGA_BLEND_RGB_ZERO | MGA_BLEND_ALPHA_ZERO;
-   mmesa->dualtex_env = GL_FALSE;
+   mmesa->envcolor[0] = 0;
+   mmesa->envcolor[1] = 0;
 }
 
 
@@ -1236,8 +1197,7 @@ void mgaDDInitStateFuncs( GLcontext *ctx )
    ctx->Driver.Enable = mgaDDEnable;
    ctx->Driver.LightModelfv = mgaDDLightModelfv;
    ctx->Driver.AlphaFunc = mgaDDAlphaFunc;
-   ctx->Driver.BlendEquation = mgaDDBlendEquation;
-   ctx->Driver.BlendFunc = mgaDDBlendFunc;
+   ctx->Driver.BlendEquationSeparate = mgaDDBlendEquationSeparate;
    ctx->Driver.BlendFuncSeparate = mgaDDBlendFuncSeparate;
    ctx->Driver.DepthFunc = mgaDDDepthFunc;
    ctx->Driver.DepthMask = mgaDDDepthMask;