mesa: begin implementation of GL_ARB_draw_buffers_blend
[mesa.git] / src / mesa / drivers / dri / i810 / i810state.c
index e203c74f52ddf479cb0a9c59b4849b84018b1ccd..6040abf7fac40e73a55782e2095cfb2c7c519b16 100644 (file)
@@ -1,11 +1,16 @@
 
 #include <stdio.h>
 
-#include "glheader.h"
-#include "context.h"
-#include "macros.h"
-#include "dd.h"
-#include "colormac.h"
+#include "main/glheader.h"
+#include "main/context.h"
+#include "main/macros.h"
+#include "main/dd.h"
+#include "main/colormac.h"
+#include "swrast/swrast.h"
+#include "tnl/tnl.h"
+#include "tnl/t_pipeline.h"
+#include "vbo/vbo.h"
+#include "swrast_setup/swrast_setup.h"
 
 #include "texmem.h"
 
 #include "i810context.h"
 #include "i810state.h"
 #include "i810tex.h"
-#include "i810vb.h"
-#include "i810tris.h"
 #include "i810ioctl.h"
 
-#include "swrast/swrast.h"
-#include "tnl/tnl.h"
-#include "vbo/vbo.h"
-#include "swrast_setup/swrast_setup.h"
-
-#include "tnl/t_pipeline.h"
 
-static __inline__ GLuint i810PackColor(GLuint format,
+static INLINE GLuint i810PackColor(GLuint format,
                                       GLubyte r, GLubyte g,
                                       GLubyte b, GLubyte a)
 {
@@ -46,7 +43,7 @@ static __inline__ GLuint i810PackColor(GLuint format,
 }
 
 
-static void i810AlphaFunc(GLcontext *ctx, GLenum func, GLfloat ref)
+static void i810AlphaFunc(struct gl_context *ctx, GLenum func, GLfloat ref)
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    GLuint a = (ZA_UPDATE_ALPHAFUNC|ZA_UPDATE_ALPHAREF);
@@ -73,7 +70,7 @@ static void i810AlphaFunc(GLcontext *ctx, GLenum func, GLfloat ref)
    imesa->Setup[I810_CTXREG_ZA] |= a;
 }
 
-static void i810BlendEquationSeparate(GLcontext *ctx,
+static void i810BlendEquationSeparate(struct gl_context *ctx,
                                      GLenum modeRGB, GLenum modeA)
 {
    assert( modeRGB == modeA );
@@ -90,7 +87,7 @@ static void i810BlendEquationSeparate(GLcontext *ctx,
              ctx->Color.LogicOp != GL_COPY));
 }
 
-static void i810BlendFuncSeparate( GLcontext *ctx, GLenum sfactorRGB,
+static void i810BlendFuncSeparate( struct gl_context *ctx, GLenum sfactorRGB,
                                     GLenum dfactorRGB, GLenum sfactorA,
                                     GLenum dfactorA )
 {
@@ -98,7 +95,7 @@ static void i810BlendFuncSeparate( GLcontext *ctx, GLenum sfactorRGB,
    GLuint a = SDM_UPDATE_SRC_BLEND | SDM_UPDATE_DST_BLEND;
    GLboolean fallback = GL_FALSE;
 
-   switch (ctx->Color.BlendSrcRGB) {
+   switch (ctx->Color.Blend[0].SrcRGB) {
    case GL_ZERO:                a |= SDM_SRC_ZERO; break;
    case GL_ONE:                 a |= SDM_SRC_ONE; break;
    case GL_SRC_COLOR:           a |= SDM_SRC_SRC_COLOR; break;
@@ -127,7 +124,7 @@ static void i810BlendFuncSeparate( GLcontext *ctx, GLenum sfactorRGB,
       return;
    }
 
-   switch (ctx->Color.BlendDstRGB) {
+   switch (ctx->Color.Blend[0].DstRGB) {
    case GL_ZERO:                a |= SDM_DST_ZERO; break;
    case GL_ONE:                 a |= SDM_DST_ONE; break;
    case GL_SRC_COLOR:           a |= SDM_DST_SRC_COLOR; break;
@@ -159,7 +156,7 @@ static void i810BlendFuncSeparate( GLcontext *ctx, GLenum sfactorRGB,
 
 
 
-static void i810DepthFunc(GLcontext *ctx, GLenum func)
+static void i810DepthFunc(struct gl_context *ctx, GLenum func)
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    int zmode;
@@ -181,7 +178,7 @@ static void i810DepthFunc(GLcontext *ctx, GLenum func)
    imesa->Setup[I810_CTXREG_LCS] |= zmode;
 }
 
-static void i810DepthMask(GLcontext *ctx, GLboolean flag)
+static void i810DepthMask(struct gl_context *ctx, GLboolean flag)
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    I810_STATECHANGE(imesa, I810_UPLOAD_CTX);
@@ -199,7 +196,7 @@ static void i810DepthMask(GLcontext *ctx, GLboolean flag)
  * The i810 supports a 4x4 stipple natively, GL wants 32x32.
  * Fortunately stipple is usually a repeating pattern.
  */
-static void i810PolygonStipple( GLcontext *ctx, const GLubyte *mask )
+static void i810PolygonStipple( struct gl_context *ctx, const GLubyte *mask )
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    const GLubyte *m = mask;
@@ -253,7 +250,7 @@ static void i810PolygonStipple( GLcontext *ctx, const GLubyte *mask )
  */
 
 
-static void i810Scissor( GLcontext *ctx, GLint x, GLint y,
+static void i810Scissor( struct gl_context *ctx, GLint x, GLint y,
                         GLsizei w, GLsizei h )
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
@@ -270,7 +267,7 @@ static void i810Scissor( GLcontext *ctx, GLint x, GLint y,
 }
 
 
-static void i810LogicOp( GLcontext *ctx, GLenum opcode )
+static void i810LogicOp( struct gl_context *ctx, GLenum opcode )
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    FALLBACK( imesa, I810_FALLBACK_LOGICOP,
@@ -279,30 +276,32 @@ static void i810LogicOp( GLcontext *ctx, GLenum opcode )
 
 /* Fallback to swrast for select and feedback.
  */
-static void i810RenderMode( GLcontext *ctx, GLenum mode )
+static void i810RenderMode( struct gl_context *ctx, GLenum mode )
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    FALLBACK( imesa, I810_FALLBACK_RENDERMODE, (mode != GL_RENDER) );
 }
 
 
-void i810DrawBuffer(GLcontext *ctx, GLenum mode )
+void i810DrawBuffer(struct gl_context *ctx, GLenum mode )
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    int front = 0;
   
-   /*
-    * _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( imesa, I810_FALLBACK_DRAW_BUFFER, GL_TRUE );
+      return;
+   }
+
+   switch ( ctx->DrawBuffer->_ColorDrawBufferIndexes[0]) {
+   case BUFFER_FRONT_LEFT:
      front = 1;
      break;
-   case BUFFER_BIT_BACK_LEFT:
+   case BUFFER_BACK_LEFT:
      front = 0;
      break;
    default:
-      /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */
       FALLBACK( imesa, I810_FALLBACK_DRAW_BUFFER, GL_TRUE );
       return;
    }
@@ -329,13 +328,13 @@ void i810DrawBuffer(GLcontext *ctx, GLenum mode )
 }
 
 
-static void i810ReadBuffer(GLcontext *ctx, GLenum mode )
+static void i810ReadBuffer(struct gl_context *ctx, GLenum mode )
 {
    /* XXX anything? */
 }
 
 
-static void i810ClearColor(GLcontext *ctx, const GLfloat color[4] )
+static void i810ClearColor(struct gl_context *ctx, const GLfloat color[4] )
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    GLubyte c[4];
@@ -352,7 +351,7 @@ static void i810ClearColor(GLcontext *ctx, const GLfloat color[4] )
  * Culling - the i810 isn't quite as clean here as the rest of
  *           its interfaces, but it's not bad.
  */
-static void i810CullFaceFrontFace(GLcontext *ctx, GLenum unused)
+static void i810CullFaceFrontFace(struct gl_context *ctx, GLenum unused)
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    GLuint mode = LCS_CULL_BOTH;
@@ -376,7 +375,7 @@ static void i810CullFaceFrontFace(GLcontext *ctx, GLenum unused)
 }
 
 
-static void i810LineWidth( GLcontext *ctx, GLfloat widthf )
+static void i810LineWidth( struct gl_context *ctx, GLfloat widthf )
 {
    i810ContextPtr imesa = I810_CONTEXT( ctx );
    /* AA, non-AA limits are same */
@@ -395,7 +394,7 @@ static void i810LineWidth( GLcontext *ctx, GLfloat widthf )
    }
 }
 
-static void i810PointSize( GLcontext *ctx, GLfloat sz )
+static void i810PointSize( struct gl_context *ctx, GLfloat sz )
 {
    i810ContextPtr imesa = I810_CONTEXT( ctx );
    /* AA, non-AA limits are same */
@@ -418,7 +417,7 @@ static void i810PointSize( GLcontext *ctx, GLfloat sz )
  * Color masks
  */
 
-static void i810ColorMask(GLcontext *ctx,
+static void i810ColorMask(struct gl_context *ctx,
                          GLboolean r, GLboolean g,
                          GLboolean b, GLboolean a )
 {
@@ -445,7 +444,7 @@ static void i810ColorMask(GLcontext *ctx,
 
 /* Seperate specular not fully implemented on the i810.
  */
-static void i810LightModelfv(GLcontext *ctx, GLenum pname,
+static void i810LightModelfv(struct gl_context *ctx, GLenum pname,
                               const GLfloat *param)
 {
    if (pname == GL_LIGHT_MODEL_COLOR_CONTROL)
@@ -459,7 +458,7 @@ static void i810LightModelfv(GLcontext *ctx, GLenum pname,
 
 /* But the 815 has it...
  */
-static void i810LightModelfv_i815(GLcontext *ctx, GLenum pname,
+static void i810LightModelfv_i815(struct gl_context *ctx, GLenum pname,
                                    const GLfloat *param)
 {
    if (pname == GL_LIGHT_MODEL_COLOR_CONTROL)
@@ -476,7 +475,7 @@ static void i810LightModelfv_i815(GLcontext *ctx, GLenum pname,
 
 /* In Mesa 3.5 we can reliably do native flatshading.
  */
-static void i810ShadeModel(GLcontext *ctx, GLenum mode)
+static void i810ShadeModel(struct gl_context *ctx, GLenum mode)
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    I810_STATECHANGE(imesa, I810_UPLOAD_CTX);
@@ -491,7 +490,7 @@ static void i810ShadeModel(GLcontext *ctx, GLenum mode)
 /* =============================================================
  * Fog
  */
-static void i810Fogfv(GLcontext *ctx, GLenum pname, const GLfloat *param)
+static void i810Fogfv(struct gl_context *ctx, GLenum pname, const GLfloat *param)
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
 
@@ -509,7 +508,7 @@ static void i810Fogfv(GLcontext *ctx, GLenum pname, const GLfloat *param)
 
 /* =============================================================
  */
-static void i810Enable(GLcontext *ctx, GLenum cap, GLboolean state)
+static void i810Enable(struct gl_context *ctx, GLenum cap, GLboolean state)
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
 
@@ -640,7 +639,7 @@ static void i810Enable(GLcontext *ctx, GLenum cap, GLboolean state)
 
 void i810EmitDrawingRectangle( i810ContextPtr imesa )
 {
-   __DRIdrawablePrivate *dPriv = imesa->driDrawable;
+   __DRIdrawable *dPriv = imesa->driDrawable;
    i810ScreenPrivate *i810Screen = imesa->i810Screen;
    int x0 = imesa->drawX;
    int y0 = imesa->drawY;
@@ -673,7 +672,7 @@ void i810EmitDrawingRectangle( i810ContextPtr imesa )
 
 
 
-static void i810CalcViewport( GLcontext *ctx )
+static void i810CalcViewport( struct gl_context *ctx )
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    const GLfloat *v = ctx->Viewport._WindowMap.m;
@@ -690,14 +689,14 @@ static void i810CalcViewport( GLcontext *ctx )
    m[MAT_TZ] =   v[MAT_TZ] * (1.0 / 0xffff);
 }
 
-static void i810Viewport( GLcontext *ctx,
+static void i810Viewport( struct gl_context *ctx,
                          GLint x, GLint y,
                          GLsizei width, GLsizei height )
 {
    i810CalcViewport( ctx );
 }
 
-static void i810DepthRange( GLcontext *ctx,
+static void i810DepthRange( struct gl_context *ctx,
                            GLclampd nearval, GLclampd farval )
 {
    i810CalcViewport( ctx );
@@ -719,7 +718,7 @@ void i810PrintDirty( const char *msg, GLuint state )
 
 
 
-void i810InitState( GLcontext *ctx )
+void i810InitState( struct gl_context *ctx )
 {
    i810ContextPtr imesa = I810_CONTEXT(ctx);
    i810ScreenPrivate *i810Screen = imesa->i810Screen;
@@ -954,7 +953,7 @@ void i810InitState( GLcontext *ctx )
 }
 
 
-static void i810InvalidateState( GLcontext *ctx, GLuint new_state )
+static void i810InvalidateState( struct gl_context *ctx, GLuint new_state )
 {
    _swrast_InvalidateState( ctx, new_state );
    _swsetup_InvalidateState( ctx, new_state );
@@ -964,7 +963,7 @@ static void i810InvalidateState( GLcontext *ctx, GLuint new_state )
 }
 
 
-void i810InitStateFuncs(GLcontext *ctx)
+void i810InitStateFuncs(struct gl_context *ctx)
 {
    /* Callbacks for internal Mesa events.
     */