Merge branch 'master' of git+ssh://keithw@git.freedesktop.org/git/mesa/mesa into...
[mesa.git] / src / mesa / drivers / dri / savage / savagestate.c
index 567b9797336c8187f27b2266822312f212ed9a1e..741a9dda4f7899d870ff4af727cbb31656a665fe 100644 (file)
@@ -26,7 +26,6 @@
 #include <stdio.h>
 
 #include "mtypes.h"
-#include "buffers.h"
 #include "enums.h"
 #include "macros.h"
 #include "dd.h"
@@ -42,7 +41,7 @@
 #include "savage_bci.h"
 
 #include "swrast/swrast.h"
-#include "array_cache/acache.h"
+#include "vbo/vbo.h"
 #include "tnl/tnl.h"
 #include "swrast_setup/swrast_setup.h"
 
@@ -648,27 +647,19 @@ static void savageDDDrawBuffer(GLcontext *ctx, GLenum mode )
     case BUFFER_BIT_FRONT_LEFT:
         imesa->IsDouble = GL_FALSE;
        imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->frontOffset>>11;
-
-        imesa->NotFirstFrame = GL_FALSE;
-        savageXMesaSetFrontClipRects( imesa );
-       FALLBACK( ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_FALSE );
        break;
     case BUFFER_BIT_BACK_LEFT:
         imesa->IsDouble = GL_TRUE;
        imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->backOffset>>11;
-        imesa->NotFirstFrame = GL_FALSE;
-        savageXMesaSetBackClipRects( imesa );
-       FALLBACK( ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_FALSE );
        break;
     default:
        FALLBACK( ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_TRUE );
        return;
     }
     
-    /* We want to update the s/w rast state too so that r200SetBuffer() (?)
-     * gets called.
-     */
-    _swrast_DrawBuffer(ctx, mode);
+    imesa->NotFirstFrame = GL_FALSE;
+    savageXMesaSetClipRects(imesa);
+    FALLBACK(ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_FALSE);
 
     if (destCtrl != imesa->regs.s4.destCtrl.ui)
         imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
@@ -723,8 +714,6 @@ static void savageViewport( GLcontext *ctx,
                            GLint x, GLint y, 
                            GLsizei width, GLsizei height )
 {
-   /* update size of Mesa/software ancillary buffers */
-   _mesa_ResizeBuffersMESA();
    savageCalcViewport( ctx );
 }
 
@@ -874,40 +863,28 @@ static void savageDDColorMask_s3d(GLcontext *ctx,
        FALLBACK (ctx, SAVAGE_FALLBACK_COLORMASK, !(r && g && b));
 }
 
-/* Seperate specular not fully implemented in hardware...  Needs
- * some interaction with material state?  Just punt to software
- * in all cases?
- * FK: Don't fall back for now. Let's see the failure cases and
- *     fix them the right way. I don't see how this could be a
- *     hardware limitation.
- */
 static void savageUpdateSpecular_s4(GLcontext *ctx) {
     savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
     u_int32_t drawLocalCtrl = imesa->regs.s4.drawLocalCtrl.ui;
 
-    if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR &&
-       ctx->Light.Enabled) {
+    if (NEED_SECONDARY_COLOR(ctx)) {
        imesa->regs.s4.drawLocalCtrl.ni.specShadeEn = GL_TRUE;
-       /*FALLBACK (ctx, SAVAGE_FALLBACK_SPECULAR, GL_TRUE);*/
     } else {
        imesa->regs.s4.drawLocalCtrl.ni.specShadeEn = GL_FALSE;
-       /*FALLBACK (ctx, SAVAGE_FALLBACK_SPECULAR, GL_FALSE);*/
     }
 
     if (drawLocalCtrl != imesa->regs.s4.drawLocalCtrl.ui)
        imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
 }
+
 static void savageUpdateSpecular_s3d(GLcontext *ctx) {
     savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
     u_int32_t drawCtrl = imesa->regs.s3d.drawCtrl.ui;
 
-    if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR &&
-       ctx->Light.Enabled) {
+    if (NEED_SECONDARY_COLOR(ctx)) {
        imesa->regs.s3d.drawCtrl.ni.specShadeEn = GL_TRUE;
-       /*FALLBACK (ctx, SAVAGE_FALLBACK_SPECULAR, GL_TRUE);*/
     } else {
        imesa->regs.s3d.drawCtrl.ni.specShadeEn = GL_FALSE;
-       /*FALLBACK (ctx, SAVAGE_FALLBACK_SPECULAR, GL_FALSE);*/
     }
 
     if (drawCtrl != imesa->regs.s3d.drawCtrl.ui)
@@ -997,16 +974,17 @@ static void savageDDFogfv(GLcontext *ctx, GLenum pname, const GLfloat *param)
 }
 
 
-static void savageDDStencilFunc(GLcontext *ctx, GLenum func, GLint ref,
-                                GLuint mask)
+static void
+savageDDStencilFuncSeparate(GLcontext *ctx, GLenum face, GLenum func,
+                            GLint ref, GLuint mask)
 {
     savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
-    SCmpFunc a=0;
-    u_int32_t zBufCtrl = imesa->regs.s4.zBufCtrl.ui;
-    u_int32_t stencilCtrl = imesa->regs.s4.stencilCtrl.ui;
+    unsigned a=0;
+    const u_int32_t zBufCtrl = imesa->regs.s4.zBufCtrl.ui;
+    const u_int32_t stencilCtrl = imesa->regs.s4.stencilCtrl.ui;
 
-    imesa->regs.s4.zBufCtrl.ni.stencilRefVal = ctx->Stencil.Ref[0];
-    imesa->regs.s4.stencilCtrl.ni.readMask  = ctx->Stencil.ValueMask[0];
+    imesa->regs.s4.zBufCtrl.ni.stencilRefVal = ctx->Stencil.Ref[0] & 0xff;
+    imesa->regs.s4.stencilCtrl.ni.readMask  = ctx->Stencil.ValueMask[0] & 0xff;
 
     switch (ctx->Stencil.Function[0])
     {
@@ -1029,106 +1007,45 @@ static void savageDDStencilFunc(GLcontext *ctx, GLenum func, GLint ref,
        imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
 }
 
-static void savageDDStencilMask(GLcontext *ctx, GLuint mask)
+static void
+savageDDStencilMaskSeparate(GLcontext *ctx, GLenum face, GLuint mask)
 {
     savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
 
-    if (imesa->regs.s4.stencilCtrl.ni.writeMask != ctx->Stencil.WriteMask[0]) {
-       imesa->regs.s4.stencilCtrl.ni.writeMask = ctx->Stencil.WriteMask[0];
+    if (imesa->regs.s4.stencilCtrl.ni.writeMask != (ctx->Stencil.WriteMask[0] & 0xff)) {
+       imesa->regs.s4.stencilCtrl.ni.writeMask = (ctx->Stencil.WriteMask[0] & 0xff);
        imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
     }
 }
 
-static void savageDDStencilOp(GLcontext *ctx, GLenum fail, GLenum zfail,
-                              GLenum zpass)
+static unsigned get_stencil_op_value( GLenum op )
 {
-    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
-    u_int32_t stencilCtrl = imesa->regs.s4.stencilCtrl.ui;
-
-    switch (ctx->Stencil.FailFunc[0])
+    switch (op)
     {
-    case GL_KEEP:
-       imesa->regs.s4.stencilCtrl.ni.failOp = STC_FAIL_Keep;
-       break;
-    case GL_ZERO:
-       imesa->regs.s4.stencilCtrl.ni.failOp = STC_FAIL_Zero;
-       break;
-    case GL_REPLACE:
-       imesa->regs.s4.stencilCtrl.ni.failOp = STC_FAIL_Equal;
-       break;
-    case GL_INCR:
-       imesa->regs.s4.stencilCtrl.ni.failOp = STC_FAIL_IncClamp;
-       break;
-    case GL_DECR:
-       imesa->regs.s4.stencilCtrl.ni.failOp = STC_FAIL_DecClamp;
-       break;
-    case GL_INVERT:
-       imesa->regs.s4.stencilCtrl.ni.failOp = STC_FAIL_Invert;
-       break;
-    case GL_INCR_WRAP_EXT:
-       imesa->regs.s4.stencilCtrl.ni.failOp = STC_FAIL_Inc;
-       break;
-    case GL_DECR_WRAP_EXT:
-       imesa->regs.s4.stencilCtrl.ni.failOp = STC_FAIL_Dec;
-       break;
+    case GL_KEEP:      return STENCIL_Keep;
+    case GL_ZERO:      return STENCIL_Zero;
+    case GL_REPLACE:   return STENCIL_Equal;
+    case GL_INCR:      return STENCIL_IncClamp;
+    case GL_DECR:      return STENCIL_DecClamp;
+    case GL_INVERT:    return STENCIL_Invert;
+    case GL_INCR_WRAP: return STENCIL_Inc;
+    case GL_DECR_WRAP: return STENCIL_Dec;
     }
 
+    /* Should *never* get here. */
+    return STENCIL_Keep;
+}
 
-    switch (ctx->Stencil.ZFailFunc[0])
-    {
-    case GL_KEEP:
-       imesa->regs.s4.stencilCtrl.ni.passZfailOp = STC_FAIL_Keep;
-       break;
-    case GL_ZERO:
-       imesa->regs.s4.stencilCtrl.ni.passZfailOp = STC_FAIL_Zero;
-       break;
-    case GL_REPLACE:
-       imesa->regs.s4.stencilCtrl.ni.passZfailOp = STC_FAIL_Equal;
-       break;
-    case GL_INCR:
-       imesa->regs.s4.stencilCtrl.ni.passZfailOp = STC_FAIL_IncClamp;
-       break;
-    case GL_DECR:
-       imesa->regs.s4.stencilCtrl.ni.passZfailOp = STC_FAIL_DecClamp;
-       break;
-    case GL_INVERT:
-       imesa->regs.s4.stencilCtrl.ni.passZfailOp = STC_FAIL_Invert;
-       break;
-    case GL_INCR_WRAP_EXT:
-       imesa->regs.s4.stencilCtrl.ni.passZfailOp = STC_FAIL_Inc;
-       break;
-    case GL_DECR_WRAP_EXT:
-       imesa->regs.s4.stencilCtrl.ni.passZfailOp = STC_FAIL_Dec;
-       break;
-    }
+static void
+savageDDStencilOpSeparate(GLcontext *ctx, GLenum face, GLenum fail,
+                          GLenum zfail, GLenum zpass)
+{
+    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
+    const u_int32_t stencilCtrl = imesa->regs.s4.stencilCtrl.ui;
 
-    switch (ctx->Stencil.ZPassFunc[0])
-    {
-    case GL_KEEP:
-       imesa->regs.s4.stencilCtrl.ni.passZpassOp = STC_FAIL_Keep;
-       break;
-    case GL_ZERO:
-       imesa->regs.s4.stencilCtrl.ni.passZpassOp = STC_FAIL_Zero;
-       break;
-    case GL_REPLACE:
-       imesa->regs.s4.stencilCtrl.ni.passZpassOp = STC_FAIL_Equal;
-       break;
-    case GL_INCR:
-       imesa->regs.s4.stencilCtrl.ni.passZpassOp = STC_FAIL_IncClamp;
-       break;
-    case GL_DECR:
-       imesa->regs.s4.stencilCtrl.ni.passZpassOp = STC_FAIL_DecClamp;
-       break;
-    case GL_INVERT:
-       imesa->regs.s4.stencilCtrl.ni.passZpassOp = STC_FAIL_Invert;
-       break;
-    case GL_INCR_WRAP_EXT:
-       imesa->regs.s4.stencilCtrl.ni.passZpassOp = STC_FAIL_Inc;
-       break;
-    case GL_DECR_WRAP_EXT:
-       imesa->regs.s4.stencilCtrl.ni.passZpassOp = STC_FAIL_Dec;
-       break;
-    }
+    imesa->regs.s4.stencilCtrl.ni.failOp = get_stencil_op_value( ctx->Stencil.FailFunc[0] );
+    imesa->regs.s4.stencilCtrl.ni.passZfailOp = get_stencil_op_value( ctx->Stencil.ZFailFunc[0] );
+    imesa->regs.s4.stencilCtrl.ni.passZpassOp = get_stencil_op_value( ctx->Stencil.ZPassFunc[0] );
 
     if (stencilCtrl != imesa->regs.s4.stencilCtrl.ui)
        imesa->dirty |= SAVAGE_UPLOAD_GLOBAL;
@@ -1586,9 +1503,9 @@ static void savageDDInitState_s4( savageContextPtr imesa )
 
     imesa->regs.s4.stencilCtrl.ni.stencilEn       = GL_FALSE;
     imesa->regs.s4.stencilCtrl.ni.cmpFunc         = CF_Always;
-    imesa->regs.s4.stencilCtrl.ni.failOp          = STC_FAIL_Keep;
-    imesa->regs.s4.stencilCtrl.ni.passZfailOp     = STC_FAIL_Keep;
-    imesa->regs.s4.stencilCtrl.ni.passZpassOp     = STC_FAIL_Keep;
+    imesa->regs.s4.stencilCtrl.ni.failOp          = STENCIL_Keep;
+    imesa->regs.s4.stencilCtrl.ni.passZfailOp     = STENCIL_Keep;
+    imesa->regs.s4.stencilCtrl.ni.passZpassOp     = STENCIL_Keep;
     imesa->regs.s4.stencilCtrl.ni.writeMask       = 0xff;
     imesa->regs.s4.stencilCtrl.ni.readMask        = 0xff;
 
@@ -1726,8 +1643,6 @@ void savageDDInitState( savageContextPtr imesa ) {
         imesa->regs.s4.destCtrl.ni.dstWidthInTile =
             (imesa->savageScreen->width+31)>>5;
     }
-    imesa->drawMap = imesa->apertureBase[imesa->toggle];
-    imesa->readMap = imesa->apertureBase[imesa->toggle];
     imesa->NotFirstFrame = GL_FALSE;
 
     imesa->regs.s4.zBufOffset.ni.offset=imesa->savageScreen->depthOffset>>11;
@@ -1758,7 +1673,7 @@ static void savageDDInvalidateState( GLcontext *ctx, GLuint new_state )
 {
    _swrast_InvalidateState( ctx, new_state );
    _swsetup_InvalidateState( ctx, new_state );
-   _ac_InvalidateState( ctx, new_state );
+   _vbo_InvalidateState( ctx, new_state );
    _tnl_InvalidateState( ctx, new_state );
    SAVAGE_CONTEXT(ctx)->new_gl_state |= new_state;
 }
@@ -1777,11 +1692,6 @@ void savageDDInitStateFuncs(GLcontext *ctx)
     ctx->Driver.CullFace = 0;
     ctx->Driver.FrontFace = 0;
 #endif /* end #if HW_CULL */
-    ctx->Driver.PolygonMode=NULL;
-    ctx->Driver.PolygonStipple = 0;
-    ctx->Driver.LineStipple = 0;
-    ctx->Driver.LineWidth = 0;
-    ctx->Driver.LogicOpcode = 0;
     ctx->Driver.DrawBuffer = savageDDDrawBuffer;
     ctx->Driver.ReadBuffer = savageDDReadBuffer;
     ctx->Driver.ClearColor = savageDDClearColor;
@@ -1790,9 +1700,6 @@ void savageDDInitStateFuncs(GLcontext *ctx)
     ctx->Driver.Viewport = savageViewport;
     ctx->Driver.RenderMode = savageRenderMode;
 
-    ctx->Driver.ClearIndex = 0;
-    ctx->Driver.IndexMask = 0;
-
     if (SAVAGE_CONTEXT( ctx )->savageScreen->chipset >= S3_SAVAGE4) {
        ctx->Driver.Enable = savageDDEnable_s4;
        ctx->Driver.AlphaFunc = savageDDAlphaFunc_s4;
@@ -1802,9 +1709,9 @@ void savageDDInitStateFuncs(GLcontext *ctx)
        ctx->Driver.ColorMask = savageDDColorMask_s4;
        ctx->Driver.ShadeModel = savageDDShadeModel_s4;
        ctx->Driver.LightModelfv = savageDDLightModelfv_s4;
-       ctx->Driver.StencilFunc = savageDDStencilFunc;
-       ctx->Driver.StencilMask = savageDDStencilMask;
-       ctx->Driver.StencilOp = savageDDStencilOp;
+       ctx->Driver.StencilFuncSeparate = savageDDStencilFuncSeparate;
+       ctx->Driver.StencilMaskSeparate = savageDDStencilMaskSeparate;
+       ctx->Driver.StencilOpSeparate = savageDDStencilOpSeparate;
     } else {
        ctx->Driver.Enable = savageDDEnable_s3d;
        ctx->Driver.AlphaFunc = savageDDAlphaFunc_s3d;
@@ -1814,15 +1721,8 @@ void savageDDInitStateFuncs(GLcontext *ctx)
        ctx->Driver.ColorMask = savageDDColorMask_s3d;
        ctx->Driver.ShadeModel = savageDDShadeModel_s3d;
        ctx->Driver.LightModelfv = savageDDLightModelfv_s3d;
-       ctx->Driver.StencilFunc = 0;
-       ctx->Driver.StencilMask = 0;
-       ctx->Driver.StencilOp = 0;
+       ctx->Driver.StencilFuncSeparate = NULL;
+       ctx->Driver.StencilMaskSeparate = NULL;
+       ctx->Driver.StencilOpSeparate = NULL;
     }
-
-   /* Swrast hooks for imaging extensions:
-    */
-   ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
-   ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
-   ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
-   ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;
 }