Merge branch 'llvm-cliptest-viewport'
[mesa.git] / src / mesa / drivers / dri / tdfx / tdfx_state.c
index 59e6549e5ef8a73e6d5a7b859846f2f2057853bd..3f6822d4574d31d2ad448256c8cf161400c29b61 100644 (file)
@@ -23,7 +23,6 @@
  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c,v 1.7 2002/10/30 12:52:00 alanh Exp $ */
 
 /*
  * New fixes:
  *
  */
 
-#include "mtypes.h"
-#include "colormac.h"
-#include "texformat.h"
-#include "texstore.h"
-#include "teximage.h"
+#include "main/mtypes.h"
+#include "main/colormac.h"
 
 #include "swrast/swrast.h"
-#include "array_cache/acache.h"
+#include "vbo/vbo.h"
 #include "tnl/tnl.h"
 #include "tnl/t_pipeline.h"
 #include "swrast_setup/swrast_setup.h"
 
 #include "tdfx_context.h"
 #include "tdfx_state.h"
-#include "tdfx_vb.h"
 #include "tdfx_tex.h"
 #include "tdfx_texman.h"
 #include "tdfx_texstate.h"
-#include "tdfx_tris.h"
 #include "tdfx_render.h"
 
 
@@ -66,7 +60,7 @@
  * Alpha blending
  */
 
-static void tdfxUpdateAlphaMode( GLcontext *ctx )
+static void tdfxUpdateAlphaMode( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    GrCmpFnc_t func;
@@ -289,7 +283,7 @@ static void tdfxUpdateAlphaMode( GLcontext *ctx )
    }
 }
 
-static void tdfxDDAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref )
+static void tdfxDDAlphaFunc( struct gl_context *ctx, GLenum func, GLfloat ref )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
 
@@ -297,7 +291,7 @@ static void tdfxDDAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref )
    fxMesa->new_state |= TDFX_NEW_ALPHA;
 }
 
-static void tdfxDDBlendEquationSeparate( GLcontext *ctx, 
+static void tdfxDDBlendEquationSeparate( struct gl_context *ctx, 
                                         GLenum modeRGB, GLenum modeA )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
@@ -307,7 +301,7 @@ static void tdfxDDBlendEquationSeparate( GLcontext *ctx,
    fxMesa->new_state |= TDFX_NEW_ALPHA;
 }
 
-static void tdfxDDBlendFuncSeparate( GLcontext *ctx,
+static void tdfxDDBlendFuncSeparate( struct gl_context *ctx,
                                     GLenum sfactorRGB, GLenum dfactorRGB,
                                     GLenum sfactorA, GLenum dfactorA )
 {
@@ -327,7 +321,7 @@ static void tdfxDDBlendFuncSeparate( GLcontext *ctx,
  * Stipple
  */
 
-void tdfxUpdateStipple( GLcontext *ctx )
+void tdfxUpdateStipple( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
    GrStippleMode_t mode = GR_STIPPLE_DISABLE;
@@ -353,7 +347,7 @@ void tdfxUpdateStipple( GLcontext *ctx )
  * Depth testing
  */
 
-static void tdfxUpdateZMode( GLcontext *ctx )
+static void tdfxUpdateZMode( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
    GrCmpFnc_t func;
@@ -392,7 +386,7 @@ static void tdfxUpdateZMode( GLcontext *ctx )
    }
 }
 
-static void tdfxDDDepthFunc( GLcontext *ctx, GLenum func )
+static void tdfxDDDepthFunc( struct gl_context *ctx, GLenum func )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
 
@@ -400,7 +394,7 @@ static void tdfxDDDepthFunc( GLcontext *ctx, GLenum func )
    fxMesa->new_state |= TDFX_NEW_DEPTH;
 }
 
-static void tdfxDDDepthMask( GLcontext *ctx, GLboolean flag )
+static void tdfxDDDepthMask( struct gl_context *ctx, GLboolean flag )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
 
@@ -408,7 +402,7 @@ static void tdfxDDDepthMask( GLcontext *ctx, GLboolean flag )
    fxMesa->new_state |= TDFX_NEW_DEPTH;
 }
 
-static void tdfxDDClearDepth( GLcontext *ctx, GLclampd d )
+static void tdfxDDClearDepth( struct gl_context *ctx, GLclampd d )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
 
@@ -451,7 +445,7 @@ static GrStencil_t convertGLStencilOp( GLenum op )
 }
 
 
-static void tdfxUpdateStencil( GLcontext *ctx )
+static void tdfxUpdateStencil( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
 
@@ -460,7 +454,7 @@ static void tdfxUpdateStencil( GLcontext *ctx )
    }
 
    if (fxMesa->haveHwStencil) {
-      if (ctx->Stencil.Enabled) {
+      if (ctx->Stencil._Enabled) {
          fxMesa->Stencil.Function = ctx->Stencil.Function[0] - GL_NEVER + GR_CMP_NEVER;
          fxMesa->Stencil.RefValue = ctx->Stencil.Ref[0] & 0xff;
          fxMesa->Stencil.ValueMask = ctx->Stencil.ValueMask[0] & 0xff;
@@ -476,7 +470,7 @@ static void tdfxUpdateStencil( GLcontext *ctx )
 
 
 static void
-tdfxDDStencilFuncSeparate( GLcontext *ctx, GLenum face, GLenum func,
+tdfxDDStencilFuncSeparate( struct gl_context *ctx, GLenum face, GLenum func,
                            GLint ref, GLuint mask )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
@@ -486,7 +480,7 @@ tdfxDDStencilFuncSeparate( GLcontext *ctx, GLenum face, GLenum func,
 }
 
 static void
-tdfxDDStencilMaskSeparate( GLcontext *ctx, GLenum face, GLuint mask )
+tdfxDDStencilMaskSeparate( struct gl_context *ctx, GLenum face, GLuint mask )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
 
@@ -495,7 +489,7 @@ tdfxDDStencilMaskSeparate( GLcontext *ctx, GLenum face, GLuint mask )
 }
 
 static void
-tdfxDDStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum sfail,
+tdfxDDStencilOpSeparate( struct gl_context *ctx, GLenum face, GLenum sfail,
                          GLenum zfail, GLenum zpass )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
@@ -509,7 +503,7 @@ tdfxDDStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum sfail,
  * Fog - orthographic fog still not working
  */
 
-static void tdfxUpdateFogAttrib( GLcontext *ctx )
+static void tdfxUpdateFogAttrib( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    GrFogMode_t mode;
@@ -568,7 +562,7 @@ static void tdfxUpdateFogAttrib( GLcontext *ctx )
    }
 }
 
-static void tdfxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param )
+static void tdfxDDFogfv( struct gl_context *ctx, GLenum pname, const GLfloat *param )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
 
@@ -620,10 +614,10 @@ static int intersect_rect( drm_clip_rect_t *out,
  * Examine XF86 cliprect list and scissor state to recompute our
  * cliprect list.
  */
-void tdfxUpdateClipping( GLcontext *ctx )
+void tdfxUpdateClipping( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-   __DRIdrawablePrivate *dPriv = fxMesa->driDrawable;
+   __DRIdrawable *dPriv = fxMesa->driDrawable;
 
    if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
       fprintf( stderr, "%s()\n", __FUNCTION__ );
@@ -701,7 +695,7 @@ void tdfxUpdateClipping( GLcontext *ctx )
  * Culling
  */
 
-void tdfxUpdateCull( GLcontext *ctx )
+void tdfxUpdateCull( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    GrCullMode_t mode = GR_CULL_DISABLE;
@@ -743,7 +737,7 @@ void tdfxUpdateCull( GLcontext *ctx )
    }
 }
 
-static void tdfxDDCullFace( GLcontext *ctx, GLenum mode )
+static void tdfxDDCullFace( struct gl_context *ctx, GLenum mode )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
 
@@ -751,7 +745,7 @@ static void tdfxDDCullFace( GLcontext *ctx, GLenum mode )
    fxMesa->new_state |= TDFX_NEW_CULL;
 }
 
-static void tdfxDDFrontFace( GLcontext *ctx, GLenum mode )
+static void tdfxDDFrontFace( struct gl_context *ctx, GLenum mode )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
 
@@ -764,7 +758,7 @@ static void tdfxDDFrontFace( GLcontext *ctx, GLenum mode )
  * Line drawing.
  */
 
-static void tdfxUpdateLine( GLcontext *ctx )
+static void tdfxUpdateLine( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
 
@@ -777,7 +771,7 @@ static void tdfxUpdateLine( GLcontext *ctx )
 }
 
 
-static void tdfxDDLineWidth( GLcontext *ctx, GLfloat width )
+static void tdfxDDLineWidth( struct gl_context *ctx, GLfloat width )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
    FLUSH_BATCH( fxMesa );
@@ -789,7 +783,7 @@ static void tdfxDDLineWidth( GLcontext *ctx, GLfloat width )
  * Color Attributes
  */
 
-static void tdfxDDColorMask( GLcontext *ctx,
+static void tdfxDDColorMask( struct gl_context *ctx,
                             GLboolean r, GLboolean g,
                             GLboolean b, GLboolean a )
 {
@@ -816,7 +810,7 @@ static void tdfxDDColorMask( GLcontext *ctx,
 }
 
 
-static void tdfxDDClearColor( GLcontext *ctx,
+static void tdfxDDClearColor( struct gl_context *ctx,
                              const GLfloat color[4] )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
@@ -835,7 +829,7 @@ static void tdfxDDClearColor( GLcontext *ctx,
  * Light Model
  */
 
-static void tdfxDDLightModelfv( GLcontext *ctx, GLenum pname,
+static void tdfxDDLightModelfv( struct gl_context *ctx, GLenum pname,
                                const GLfloat *param )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
@@ -847,7 +841,7 @@ static void tdfxDDLightModelfv( GLcontext *ctx, GLenum pname,
    }
 }
 
-static void tdfxDDShadeModel( GLcontext *ctx, GLenum mode )
+static void tdfxDDShadeModel( struct gl_context *ctx, GLenum mode )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
 
@@ -862,7 +856,7 @@ static void tdfxDDShadeModel( GLcontext *ctx, GLenum mode )
  */
 
 static void
-tdfxDDScissor(GLcontext * ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+tdfxDDScissor(struct gl_context * ctx, GLint x, GLint y, GLsizei w, GLsizei h)
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    FLUSH_BATCH( fxMesa );
@@ -873,7 +867,7 @@ tdfxDDScissor(GLcontext * ctx, GLint x, GLint y, GLsizei w, GLsizei h)
  * Render
  */
 
-static void tdfxUpdateRenderAttrib( GLcontext *ctx )
+static void tdfxUpdateRenderAttrib( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    FLUSH_BATCH( fxMesa );
@@ -884,7 +878,7 @@ static void tdfxUpdateRenderAttrib( GLcontext *ctx )
  * Viewport
  */
 
-void tdfxUpdateViewport( GLcontext *ctx )
+void tdfxUpdateViewport( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    const GLfloat *v = ctx->Viewport._WindowMap.m;
@@ -901,7 +895,7 @@ void tdfxUpdateViewport( GLcontext *ctx )
 }
 
 
-static void tdfxDDViewport( GLcontext *ctx, GLint x, GLint y,
+static void tdfxDDViewport( struct gl_context *ctx, GLint x, GLint y,
                            GLsizei w, GLsizei h )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
@@ -910,7 +904,7 @@ static void tdfxDDViewport( GLcontext *ctx, GLint x, GLint y,
 }
 
 
-static void tdfxDDDepthRange( GLcontext *ctx, GLclampd nearVal, GLclampd farVal )
+static void tdfxDDDepthRange( struct gl_context *ctx, GLclampd nearVal, GLclampd farVal )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    FLUSH_BATCH( fxMesa );
@@ -922,7 +916,7 @@ static void tdfxDDDepthRange( GLcontext *ctx, GLclampd nearVal, GLclampd farVal
  * State enable/disable
  */
 
-static void tdfxDDEnable( GLcontext *ctx, GLenum cap, GLboolean state )
+static void tdfxDDEnable( struct gl_context *ctx, GLenum cap, GLboolean state )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
 
@@ -1023,7 +1017,7 @@ static void tdfxDDEnable( GLcontext *ctx, GLenum cap, GLboolean state )
 
 /* Set the buffer used for drawing */
 /* XXX support for separate read/draw buffers hasn't been tested */
-static void tdfxDDDrawBuffer( GLcontext *ctx, GLenum mode )
+static void tdfxDDDrawBuffer( struct gl_context *ctx, GLenum mode )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
 
@@ -1033,21 +1027,23 @@ static void tdfxDDDrawBuffer( GLcontext *ctx, GLenum mode )
 
    FLUSH_BATCH( fxMesa );
 
-   /*
-    * _ColorDrawBufferMask is easier to cope with than <mode>.
-    */
-   switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) {
-   case BUFFER_BIT_FRONT_LEFT:
+   if (ctx->DrawBuffer->_NumColorDrawBuffers > 1) {
+      FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_TRUE );
+      return;
+   }
+
+   switch ( ctx->DrawBuffer->_ColorDrawBufferIndexes[0] ) {
+   case BUFFER_FRONT_LEFT:
       fxMesa->DrawBuffer = fxMesa->ReadBuffer = GR_BUFFER_FRONTBUFFER;
       fxMesa->new_state |= TDFX_NEW_RENDER;
       FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE );
       break;
-   case BUFFER_BIT_BACK_LEFT:
+   case BUFFER_BACK_LEFT:
       fxMesa->DrawBuffer = fxMesa->ReadBuffer = GR_BUFFER_BACKBUFFER;
       fxMesa->new_state |= TDFX_NEW_RENDER;
       FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE );
       break;
-   case 0:
+   case -1:
       FX_grColorMaskv( ctx, false4 );
       FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE );
       break;
@@ -1058,7 +1054,7 @@ static void tdfxDDDrawBuffer( GLcontext *ctx, GLenum mode )
 }
 
 
-static void tdfxDDReadBuffer( GLcontext *ctx, GLenum mode )
+static void tdfxDDReadBuffer( struct gl_context *ctx, GLenum mode )
 {
    /* XXX ??? */
 }
@@ -1068,7 +1064,7 @@ static void tdfxDDReadBuffer( GLcontext *ctx, GLenum mode )
  * Polygon stipple
  */
 
-static void tdfxDDPolygonStipple( GLcontext *ctx, const GLubyte *mask )
+static void tdfxDDPolygonStipple( struct gl_context *ctx, const GLubyte *mask )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    const GLubyte *m = mask;
@@ -1123,7 +1119,7 @@ static void tdfxDDPolygonStipple( GLcontext *ctx, const GLubyte *mask )
 
 
 
-static void tdfxDDRenderMode( GLcontext *ctx, GLenum mode )
+static void tdfxDDRenderMode( struct gl_context *ctx, GLenum mode )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    FALLBACK( fxMesa, TDFX_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
@@ -1154,7 +1150,7 @@ static void tdfxDDPrintState( const char *msg, GLuint flags )
 
 
 
-void tdfxDDUpdateHwState( GLcontext *ctx )
+void tdfxDDUpdateHwState( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
    int new_state = fxMesa->new_state;
@@ -1230,11 +1226,11 @@ void tdfxDDUpdateHwState( GLcontext *ctx )
 }
 
 
-static void tdfxDDInvalidateState( GLcontext *ctx, GLuint new_state )
+static void tdfxDDInvalidateState( struct gl_context *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 );
    TDFX_CONTEXT(ctx)->new_gl_state |= new_state;
 }
@@ -1246,7 +1242,7 @@ static void tdfxDDInvalidateState( GLcontext *ctx, GLuint new_state )
  */
 void tdfxInitState( tdfxContextPtr fxMesa )
 {
-   GLcontext *ctx = fxMesa->glCtx;
+   struct gl_context *ctx = fxMesa->glCtx;
    GLint i;
 
    fxMesa->ColorCombine.Function       = GR_COMBINE_FUNCTION_LOCAL;
@@ -1394,7 +1390,7 @@ void tdfxInitState( tdfxContextPtr fxMesa )
 
 
 
-void tdfxDDInitStateFuncs( GLcontext *ctx )
+void tdfxDDInitStateFuncs( struct gl_context *ctx )
 {
    tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);