mesa: begin implementation of GL_ARB_draw_buffers_blend
[mesa.git] / src / mesa / drivers / dri / mach64 / mach64_state.c
index d9b5725a638bac018d16b7e91da2408707775d68..c1a4e63204f7ddfeddd4ec8c3559e0d953cc134c 100644 (file)
@@ -1,4 +1,4 @@
-/* $XFree86$ */ /* -*- mode: c; c-basic-offset: 3 -*- */
+/* -*- mode: c; c-basic-offset: 3 -*- */
 /*
  * Copyright 2000 Gareth Hughes
  * All Rights Reserved.
 #include "mach64_vb.h"
 #include "mach64_tex.h"
 
-#include "context.h"
-#include "buffers.h"
-#include "enums.h"
-#include "colormac.h"
+#include "main/enums.h"
+#include "main/colormac.h"
 #include "swrast/swrast.h"
-#include "array_cache/acache.h"
+#include "vbo/vbo.h"
 #include "tnl/tnl.h"
 #include "swrast_setup/swrast_setup.h"
 
-#include "tnl/t_pipeline.h"
-
 
 /* =============================================================
  * Alpha blending
  */
 
-static void mach64UpdateAlphaMode( GLcontext *ctx )
+static void mach64UpdateAlphaMode( struct gl_context *ctx )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    GLuint a = mmesa->setup.alpha_tst_cntl;
@@ -106,7 +102,7 @@ static void mach64UpdateAlphaMode( GLcontext *ctx )
             MACH64_ALPHA_BLEND_DST_MASK |
             MACH64_ALPHA_BLEND_SAT);
 
-      switch ( ctx->Color.BlendSrcRGB ) {
+      switch ( ctx->Color.Blend[0].SrcRGB ) {
       case GL_ZERO:
         s |= MACH64_ALPHA_BLEND_SRC_ZERO;
         break;
@@ -139,7 +135,7 @@ static void mach64UpdateAlphaMode( GLcontext *ctx )
          FALLBACK( mmesa, MACH64_FALLBACK_BLEND_FUNC, GL_TRUE );
       }
 
-      switch ( ctx->Color.BlendDstRGB ) {
+      switch ( ctx->Color.Blend[0].DstRGB ) {
       case GL_ZERO:
         s |= MACH64_ALPHA_BLEND_DST_ZERO;
         break;
@@ -189,7 +185,7 @@ static void mach64UpdateAlphaMode( GLcontext *ctx )
    }
 }
 
-static void mach64DDAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref )
+static void mach64DDAlphaFunc( struct gl_context *ctx, GLenum func, GLfloat ref )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
@@ -197,7 +193,7 @@ static void mach64DDAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref )
    mmesa->new_state |= MACH64_NEW_ALPHA;
 }
 
-static void mach64DDBlendEquationSeparate( GLcontext *ctx, 
+static void mach64DDBlendEquationSeparate( struct gl_context *ctx, 
                                           GLenum modeRGB, GLenum modeA )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
@@ -218,7 +214,7 @@ static void mach64DDBlendEquationSeparate( GLcontext *ctx,
    mmesa->new_state |= MACH64_NEW_ALPHA;
 }
 
-static void mach64DDBlendFuncSeparate( GLcontext *ctx,
+static void mach64DDBlendFuncSeparate( struct gl_context *ctx,
                                       GLenum sfactorRGB, GLenum dfactorRGB,
                                       GLenum sfactorA, GLenum dfactorA )
 {
@@ -233,7 +229,7 @@ static void mach64DDBlendFuncSeparate( GLcontext *ctx,
  * Depth testing
  */
 
-static void mach64UpdateZMode( GLcontext *ctx )
+static void mach64UpdateZMode( struct gl_context *ctx )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    GLuint z = mmesa->setup.z_cntl;
@@ -289,7 +285,7 @@ static void mach64UpdateZMode( GLcontext *ctx )
    }
 }
 
-static void mach64DDDepthFunc( GLcontext *ctx, GLenum func )
+static void mach64DDDepthFunc( struct gl_context *ctx, GLenum func )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
@@ -297,7 +293,7 @@ static void mach64DDDepthFunc( GLcontext *ctx, GLenum func )
    mmesa->new_state |= MACH64_NEW_DEPTH;
 }
 
-static void mach64DDDepthMask( GLcontext *ctx, GLboolean flag )
+static void mach64DDDepthMask( struct gl_context *ctx, GLboolean flag )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
@@ -305,7 +301,7 @@ static void mach64DDDepthMask( GLcontext *ctx, GLboolean flag )
    mmesa->new_state |= MACH64_NEW_DEPTH;
 }
 
-static void mach64DDClearDepth( GLcontext *ctx, GLclampd d )
+static void mach64DDClearDepth( struct gl_context *ctx, GLclampd d )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
@@ -319,7 +315,7 @@ static void mach64DDClearDepth( GLcontext *ctx, GLclampd d )
  * Fog
  */
 
-static void mach64UpdateFogAttrib( GLcontext *ctx )
+static void mach64UpdateFogAttrib( struct gl_context *ctx )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
@@ -370,7 +366,7 @@ static void mach64UpdateFogAttrib( GLcontext *ctx )
 
 }
 
-static void mach64DDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param )
+static void mach64DDFogfv( struct gl_context *ctx, GLenum pname, const GLfloat *param )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
@@ -383,13 +379,13 @@ static void mach64DDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param )
  * Clipping
  */
 
-static void mach64UpdateClipping( GLcontext *ctx )
+static void mach64UpdateClipping( struct gl_context *ctx )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    mach64ScreenPtr mach64Screen = mmesa->mach64Screen;
 
    if ( mmesa->driDrawable ) {
-      __DRIdrawablePrivate *drawable = mmesa->driDrawable;
+      __DRIdrawable *drawable = mmesa->driDrawable;
       int x1 = 0;
       int y1 = 0;
       int x2 = drawable->w - 1;
@@ -456,7 +452,7 @@ static void mach64UpdateClipping( GLcontext *ctx )
    }
 }
 
-static void mach64DDScissor( GLcontext *ctx,
+static void mach64DDScissor( struct gl_context *ctx,
                             GLint x, GLint y, GLsizei w, GLsizei h )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
@@ -470,7 +466,7 @@ static void mach64DDScissor( GLcontext *ctx,
  * Culling
  */
 
-static void mach64UpdateCull( GLcontext *ctx )
+static void mach64UpdateCull( struct gl_context *ctx )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    GLfloat backface_sign = 1;
@@ -499,7 +495,7 @@ static void mach64UpdateCull( GLcontext *ctx )
 
 }
 
-static void mach64DDCullFace( GLcontext *ctx, GLenum mode )
+static void mach64DDCullFace( struct gl_context *ctx, GLenum mode )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
@@ -507,7 +503,7 @@ static void mach64DDCullFace( GLcontext *ctx, GLenum mode )
    mmesa->new_state |= MACH64_NEW_CULL;
 }
 
-static void mach64DDFrontFace( GLcontext *ctx, GLenum mode )
+static void mach64DDFrontFace( struct gl_context *ctx, GLenum mode )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
@@ -520,7 +516,7 @@ static void mach64DDFrontFace( GLcontext *ctx, GLenum mode )
  * Masks
  */
 
-static void mach64UpdateMasks( GLcontext *ctx )
+static void mach64UpdateMasks( struct gl_context *ctx )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    GLuint mask = 0xffffffff;
@@ -528,10 +524,10 @@ static void mach64UpdateMasks( GLcontext *ctx )
    /* mach64 can't color mask with alpha blending enabled */
    if ( !ctx->Color.BlendEnabled ) {
       mask = mach64PackColor( mmesa->mach64Screen->cpp,
-                             ctx->Color.ColorMask[RCOMP],
-                             ctx->Color.ColorMask[GCOMP],
-                             ctx->Color.ColorMask[BCOMP],
-                             ctx->Color.ColorMask[ACOMP] );
+                             ctx->Color.ColorMask[0][RCOMP],
+                             ctx->Color.ColorMask[0][GCOMP],
+                             ctx->Color.ColorMask[0][BCOMP],
+                             ctx->Color.ColorMask[0][ACOMP] );
    }
 
    if ( mmesa->setup.dp_write_mask != mask ) {
@@ -540,7 +536,7 @@ static void mach64UpdateMasks( GLcontext *ctx )
    }
 }
 
-static void mach64DDColorMask( GLcontext *ctx,
+static void mach64DDColorMask( struct gl_context *ctx,
                               GLboolean r, GLboolean g,
                               GLboolean b, GLboolean a )
 {
@@ -559,7 +555,7 @@ static void mach64DDColorMask( GLcontext *ctx,
  * sense to break them out of the core texture state update routines.
  */
 
-static void mach64UpdateSpecularLighting( GLcontext *ctx )
+static void mach64UpdateSpecularLighting( struct gl_context *ctx )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    GLuint a = mmesa->setup.alpha_tst_cntl;
@@ -582,7 +578,7 @@ static void mach64UpdateSpecularLighting( GLcontext *ctx )
    }
 }
 
-static void mach64DDLightModelfv( GLcontext *ctx, GLenum pname,
+static void mach64DDLightModelfv( struct gl_context *ctx, GLenum pname,
                                  const GLfloat *param )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
@@ -593,7 +589,7 @@ static void mach64DDLightModelfv( GLcontext *ctx, GLenum pname,
    }
 }
 
-static void mach64DDShadeModel( GLcontext *ctx, GLenum mode )
+static void mach64DDShadeModel( struct gl_context *ctx, GLenum mode )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    GLuint s = mmesa->setup.setup_cntl;
@@ -625,7 +621,7 @@ static void mach64DDShadeModel( GLcontext *ctx, GLenum mode )
  */
 
 
-void mach64CalcViewport( GLcontext *ctx )
+void mach64CalcViewport( struct gl_context *ctx )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    const GLfloat *v = ctx->Viewport._WindowMap.m;
@@ -643,16 +639,14 @@ void mach64CalcViewport( GLcontext *ctx )
    mmesa->SetupNewInputs = ~0;
 }
 
-static void mach64Viewport( GLcontext *ctx,
+static void mach64Viewport( struct gl_context *ctx,
                          GLint x, GLint y,
                          GLsizei width, GLsizei height )
 {
-   /* update size of Mesa/software ancillary buffers */
-   _mesa_ResizeBuffersMESA();
    mach64CalcViewport( ctx );
 }
 
-static void mach64DepthRange( GLcontext *ctx,
+static void mach64DepthRange( struct gl_context *ctx,
                            GLclampd nearval, GLclampd farval )
 {
    mach64CalcViewport( ctx );
@@ -663,7 +657,7 @@ static void mach64DepthRange( GLcontext *ctx,
  * Miscellaneous
  */
 
-static void mach64DDClearColor( GLcontext *ctx,
+static void mach64DDClearColor( struct gl_context *ctx,
                                const GLfloat color[4] )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
@@ -678,7 +672,7 @@ static void mach64DDClearColor( GLcontext *ctx,
                                        c[0], c[1], c[2], c[3] );
 }
 
-static void mach64DDLogicOpCode( GLcontext *ctx, GLenum opcode )
+static void mach64DDLogicOpCode( struct gl_context *ctx, GLenum opcode )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    
@@ -689,10 +683,10 @@ static void mach64DDLogicOpCode( GLcontext *ctx, GLenum opcode )
    }
 }
 
-void mach64SetCliprects( GLcontext *ctx, GLenum mode )
+void mach64SetCliprects( struct gl_context *ctx, GLenum mode )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
-   __DRIdrawablePrivate *dPriv = mmesa->driDrawable;
+   __DRIdrawable *dPriv = mmesa->driDrawable;
 
    switch ( mode ) {
    case GL_FRONT_LEFT:
@@ -723,48 +717,45 @@ void mach64SetCliprects( GLcontext *ctx, GLenum mode )
    mmesa->dirty |= MACH64_UPLOAD_CLIPRECTS;
 }
 
-static void mach64DDDrawBuffer( GLcontext *ctx, GLenum mode )
+static void mach64DDDrawBuffer( struct gl_context *ctx, GLenum mode )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
    FLUSH_BATCH( mmesa );
 
-   /*
-    * _DrawDestMask is easier to cope with than <mode>.
-    */
-   switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) {
-   case BUFFER_BIT_FRONT_LEFT:
+   if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) {
+      /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */
+      FALLBACK( mmesa, MACH64_FALLBACK_DRAW_BUFFER, GL_TRUE );
+      return;
+   }
+
+   switch ( ctx->DrawBuffer->_ColorDrawBufferIndexes[0] ) {
+   case BUFFER_FRONT_LEFT:
       FALLBACK( mmesa, MACH64_FALLBACK_DRAW_BUFFER, GL_FALSE );
       mach64SetCliprects( ctx, GL_FRONT_LEFT );
       if (MACH64_DEBUG & DEBUG_VERBOSE_MSG)
         fprintf(stderr,"%s: BUFFER_BIT_FRONT_LEFT\n", __FUNCTION__);
       break;
-   case BUFFER_BIT_BACK_LEFT:
+   case BUFFER_BACK_LEFT:
       FALLBACK( mmesa, MACH64_FALLBACK_DRAW_BUFFER, GL_FALSE );
       mach64SetCliprects( ctx, GL_BACK_LEFT );
       if (MACH64_DEBUG & DEBUG_VERBOSE_MSG)
         fprintf(stderr,"%s: BUFFER_BIT_BACK_LEFT\n", __FUNCTION__);
       break;
    default:
-      /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */
       FALLBACK( mmesa, MACH64_FALLBACK_DRAW_BUFFER, GL_TRUE );
       if (MACH64_DEBUG & DEBUG_VERBOSE_MSG)
         fprintf(stderr,"%s: fallback (mode=%d)\n", __FUNCTION__, mode);
       break;
    }
 
-   /* We want to update the s/w rast state too so that mach64SetBuffer()
-    * gets called.
-    */
-   _swrast_DrawBuffer(ctx, mode);
-
    mmesa->setup.dst_off_pitch = (((mmesa->drawPitch/8) << 22) |
                                 (mmesa->drawOffset >> 3));
 
    mmesa->dirty |= MACH64_UPLOAD_DST_OFF_PITCH;
 }
 
-static void mach64DDReadBuffer( GLcontext *ctx, GLenum mode )
+static void mach64DDReadBuffer( struct gl_context *ctx, GLenum mode )
 {
    /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */
 }
@@ -773,7 +764,7 @@ static void mach64DDReadBuffer( GLcontext *ctx, GLenum mode )
  * State enable/disable
  */
 
-static void mach64DDEnable( GLcontext *ctx, GLenum cap, GLboolean state )
+static void mach64DDEnable( struct gl_context *ctx, GLenum cap, GLboolean state )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
 
@@ -876,7 +867,7 @@ static void mach64DDEnable( GLcontext *ctx, GLenum cap, GLboolean state )
  * Render mode
  */
 
-static void mach64DDRenderMode( GLcontext *ctx, GLenum mode )
+static void mach64DDRenderMode( struct gl_context *ctx, GLenum mode )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    FALLBACK( mmesa, MACH64_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
@@ -980,7 +971,7 @@ static void mach64DDPrintState( const char *msg, GLuint flags )
 }
 
 /* Update the hardware state */
-void mach64DDUpdateHWState( GLcontext *ctx )
+void mach64DDUpdateHWState( struct gl_context *ctx )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
    int new_state = mmesa->new_state;
@@ -1027,11 +1018,11 @@ void mach64DDUpdateHWState( GLcontext *ctx )
 }
 
 
-static void mach64DDInvalidateState( GLcontext *ctx, GLuint new_state )
+static void mach64DDInvalidateState( 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 );
    MACH64_CONTEXT(ctx)->NewGLState |= new_state;
 }
@@ -1161,16 +1152,14 @@ void mach64DDInitState( mach64ContextPtr mmesa )
 
 /* Initialize the driver's state functions.
   */
-void mach64DDInitStateFuncs( GLcontext *ctx )
+void mach64DDInitStateFuncs( struct gl_context *ctx )
 {
    ctx->Driver.UpdateState             = mach64DDInvalidateState;
 
-   ctx->Driver.ClearIndex              = NULL;
    ctx->Driver.ClearColor              = mach64DDClearColor;
    ctx->Driver.DrawBuffer              = mach64DDDrawBuffer;
    ctx->Driver.ReadBuffer              = mach64DDReadBuffer;
 
-   ctx->Driver.IndexMask               = NULL;
    ctx->Driver.ColorMask               = mach64DDColorMask;
    ctx->Driver.AlphaFunc               = mach64DDAlphaFunc;
    ctx->Driver.BlendEquationSeparate   = mach64DDBlendEquationSeparate;
@@ -1191,26 +1180,7 @@ void mach64DDInitStateFuncs( GLcontext *ctx )
    ctx->Driver.RenderMode              = mach64DDRenderMode;
    ctx->Driver.Scissor                 = mach64DDScissor;
    ctx->Driver.ShadeModel              = mach64DDShadeModel;
-   ctx->Driver.ClearStencil            = NULL;
-   ctx->Driver.StencilFunc             = NULL;
-   ctx->Driver.StencilMask             = NULL;
-   ctx->Driver.StencilOp               = NULL;
    
    ctx->Driver.DepthRange              = mach64DepthRange;
    ctx->Driver.Viewport                        = mach64Viewport;
-   
-   /* Pixel path fallbacks.
-    */
-   ctx->Driver.Accum = _swrast_Accum;
-   ctx->Driver.Bitmap = _swrast_Bitmap;
-   ctx->Driver.CopyPixels = _swrast_CopyPixels;
-   ctx->Driver.DrawPixels = _swrast_DrawPixels;
-   ctx->Driver.ReadPixels = _swrast_ReadPixels;
-
-   /* 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;
 }