Fix a possible segfault caused by the SGI_make_current_read changes.
[mesa.git] / src / mesa / drivers / dri / i830 / i830_state.c
index 9e8952f09b12fee774829fb3d62576a989fc56e7..8bfe392682b788fac12c06341d750064df0903bc 100644 (file)
@@ -359,19 +359,22 @@ static void i830BlendColor(GLcontext *ctx, const GLfloat color[4])
                                          b);
 }
 
-static void i830BlendEquation(GLcontext *ctx, GLenum mode) 
+static void i830BlendEquationSeparate(GLcontext *ctx,
+                                     GLenum modeRGB, GLenum modeA)
 {
    i830ContextPtr imesa = I830_CONTEXT(ctx);
    int func = ENABLE_ALPHA_BLENDFUNC;
 
    if (I830_DEBUG&DEBUG_DRI)
      fprintf(stderr, "%s %s\n", __FUNCTION__,
-            _mesa_lookup_enum_by_nr(mode));
+            _mesa_lookup_enum_by_nr(modeRGB));
+
+   assert( modeRGB == modeA );
 
    /* This will catch a logicop blend equation */
    i830EvalLogicOpBlendState(ctx);
 
-   switch(mode) {
+   switch(modeRGB) {
    case GL_FUNC_ADD_EXT: 
       func |= BLENDFUNC_ADD; 
       break;
@@ -828,14 +831,14 @@ static void i830DrawBuffer(GLcontext *ctx, GLenum mode )
     * _DrawDestMask is easier to cope with than <mode>.
     */
    switch ( ctx->Color._DrawDestMask ) {
-   case FRONT_LEFT_BIT:
+   case DD_FRONT_LEFT_BIT:
       I830_FIREVERTICES(imesa);
       I830_STATECHANGE(imesa, I830_UPLOAD_BUFFERS);
       imesa->BufferSetup[I830_DESTREG_CBUFADDR] = imesa->i830Screen->fbOffset;
       i830XMesaSetFrontClipRects( imesa );
       FALLBACK( imesa, I830_FALLBACK_DRAW_BUFFER, GL_FALSE );
       break;
-   case BACK_LEFT_BIT:
+   case DD_BACK_LEFT_BIT:
       I830_FIREVERTICES(imesa);
       I830_STATECHANGE(imesa, I830_UPLOAD_BUFFERS);
       imesa->BufferSetup[I830_DESTREG_CBUFADDR] = 
@@ -976,7 +979,7 @@ static void update_specular( GLcontext *ctx )
    I830_STATECHANGE(imesa, I830_UPLOAD_CTX);
    imesa->Setup[I830_CTXREG_ENABLES_1] &= ~ENABLE_SPEC_ADD_MASK;
 
-   if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
+   if (NEED_SECONDARY_COLOR(ctx))
       imesa->Setup[I830_CTXREG_ENABLES_1] |= ENABLE_SPEC_ADD;
    else
       imesa->Setup[I830_CTXREG_ENABLES_1] |= DISABLE_SPEC_ADD;
@@ -1263,15 +1266,19 @@ static void i830DepthRange( GLcontext *ctx,
 
 void i830PrintDirty( const char *msg, GLuint state )
 {
-   fprintf(stderr, "%s (0x%x): %s%s%s%s%s%s%s\n",
+   fprintf(stderr, "%s (0x%x): %s%s%s%s%s%s%s%s%s%s%s\n",
           msg,
           (unsigned int) state,
           (state & I830_UPLOAD_TEX0)  ? "upload-tex0, " : "",
           (state & I830_UPLOAD_TEX1)  ? "upload-tex1, " : "",
+          (state & I830_UPLOAD_TEX2)  ? "upload-tex2, " : "",
+          (state & I830_UPLOAD_TEX3)  ? "upload-tex3, " : "",
           (state & I830_UPLOAD_CTX)        ? "upload-ctx, " : "",
           (state & I830_UPLOAD_BUFFERS)    ? "upload-bufs, " : "",
           (state & I830_UPLOAD_TEXBLEND0)  ? "upload-blend0, " : "",
           (state & I830_UPLOAD_TEXBLEND1)  ? "upload-blend1, " : "",
+          (state & I830_UPLOAD_TEXBLEND2)  ? "upload-blend2, " : "",
+          (state & I830_UPLOAD_TEXBLEND3)  ? "upload-blend3, " : "",
           (state & I830_UPLOAD_STIPPLE)  ? "stipple, " : ""
           );
 }
@@ -1285,24 +1292,44 @@ void i830EmitHwStateLocked( i830ContextPtr imesa )
    if (I830_DEBUG & DEBUG_STATE)
       i830PrintDirty( __FUNCTION__, imesa->dirty );
 
-   if ((imesa->dirty & I830_UPLOAD_TEX0_IMAGE) && imesa->CurrentTexObj[0])
-      i830UploadTexImagesLocked(imesa, imesa->CurrentTexObj[0]);
-   if ((imesa->dirty & I830_UPLOAD_TEX1_IMAGE) && imesa->CurrentTexObj[1])
-      i830UploadTexImagesLocked(imesa, imesa->CurrentTexObj[1]);
+   for ( i = 0 ; i < imesa->glCtx->Const.MaxTextureUnits ; i++ ) {
+      if ( ((imesa->dirty & I830_UPLOAD_TEX_N_IMAGE( i )) != 0)
+         && (imesa->CurrentTexObj[i] != NULL) ) {
+        i830UploadTexImagesLocked(imesa, imesa->CurrentTexObj[i]);
+      }
+   }
+
    if (imesa->dirty & I830_UPLOAD_CTX) {
       memcpy( imesa->sarea->ContextState,
             imesa->Setup, sizeof(imesa->Setup) );
    }
 
-   for (i = 0; i < I830_TEXTURE_COUNT; i++) {
+   for ( i = 0 ; i < imesa->glCtx->Const.MaxTextureUnits ; i++ ) {
       if ((imesa->dirty & I830_UPLOAD_TEX_N(i)) && imesa->CurrentTexObj[i]) {
+        unsigned * TexState;
+        
         imesa->sarea->dirty |= I830_UPLOAD_TEX_N(i);
-        memcpy(imesa->sarea->TexState[i],
-               imesa->CurrentTexObj[i]->Setup,
+        
+        switch( i ) {
+        case 0:
+        case 1:
+           TexState = imesa->sarea->TexState[i];
+           break;
+
+        case 2:
+           TexState = imesa->sarea->TexState2;
+           break;
+
+        case 3:
+           TexState = imesa->sarea->TexState3;
+           break;
+        }
+
+        memcpy(TexState, imesa->CurrentTexObj[i]->Setup,
                sizeof(imesa->sarea->TexState[i]));
          
-        imesa->sarea->TexState[i][I830_TEXREG_TM0S3] &= ~TM0S3_LOD_BIAS_MASK;
-        imesa->sarea->TexState[i][I830_TEXREG_TM0S3] |= imesa->LodBias[i];
+        TexState[I830_TEXREG_TM0S3] &= ~TM0S3_LOD_BIAS_MASK;
+        TexState[I830_TEXREG_TM0S3] |= imesa->LodBias[i];
 
         /* Update the LRU usage */
         if (imesa->CurrentTexObj[i]->base.memBlock)
@@ -1312,13 +1339,34 @@ void i830EmitHwStateLocked( i830ContextPtr imesa )
    }
    /* Need to figure out if texturing state, or enable changed. */
 
-   for (i = 0; i < I830_TEXBLEND_COUNT; i++) {
+   for ( i = 0 ; i < imesa->glCtx->Const.MaxTextureUnits ; i++ ) {
       if (imesa->dirty & I830_UPLOAD_TEXBLEND_N(i)) {
+        unsigned * TexBlendState;
+        unsigned * words_used;
+        
         imesa->sarea->dirty |= I830_UPLOAD_TEXBLEND_N(i);
-        memcpy(imesa->sarea->TexBlendState[i],imesa->TexBlend[i],
+
+        switch( i ) {
+        case 0:
+        case 1:
+           TexBlendState = imesa->sarea->TexBlendState[i];
+           words_used = & imesa->sarea->TexBlendStateWordsUsed[i];
+           break;
+
+        case 2:
+           TexBlendState = imesa->sarea->TexBlendState2;
+           words_used = & imesa->sarea->TexBlendStateWordsUsed2;
+           break;
+
+        case 3:
+           TexBlendState = imesa->sarea->TexBlendState3;
+           words_used = & imesa->sarea->TexBlendStateWordsUsed3;
+           break;
+        }
+
+        memcpy(TexBlendState, imesa->TexBlend[i],
                imesa->TexBlendWordsUsed[i] * 4);
-        imesa->sarea->TexBlendStateWordsUsed[i] =
-          imesa->TexBlendWordsUsed[i];
+        *words_used = imesa->TexBlendWordsUsed[i];
       }
    }
 
@@ -1362,7 +1410,7 @@ void i830DDInitState( GLcontext *ctx )
 {
    i830ContextPtr imesa = I830_CONTEXT(ctx);   
    i830ScreenPrivate *i830Screen = imesa->i830Screen;
-   int i, j;
+   int i;
 
    imesa->clear_red = 0;
    imesa->clear_green = 0;
@@ -1375,11 +1423,10 @@ void i830DDInitState( GLcontext *ctx )
    imesa->mask_alpha = GL_FALSE;
 
    /* Zero all texture state */
-   for (i = 0; i < I830_TEXBLEND_COUNT; i++) {
-      for (j = 0; j < I830_TEXBLEND_SIZE; j++) {
-        imesa->TexBlend[i][j] = 0;
-        imesa->Init_TexBlend[i][j] = 0;
-      }
+   for (i = 0; i < I830_MAX_TEXTURE_UNITS; i++) {
+      (void) memset( imesa->TexBlend[i], 0, sizeof( imesa->TexBlend[i] ) );
+      (void) memset( imesa->Init_TexBlend[i], 0, sizeof( imesa->Init_TexBlend[i] ) );
+
       imesa->TexBlendWordsUsed[i] = 0;
       imesa->Init_TexBlendWordsUsed[i] = 0;
       imesa->TexBlendColorPipeNum[i] = 0;
@@ -1643,7 +1690,7 @@ void i830DDInitStateFuncs(GLcontext *ctx)
    /* API callbacks
     */
    ctx->Driver.AlphaFunc = i830AlphaFunc;
-   ctx->Driver.BlendEquation = i830BlendEquation;
+   ctx->Driver.BlendEquationSeparate = i830BlendEquationSeparate;
    ctx->Driver.BlendFuncSeparate = i830BlendFuncSeparate;
    ctx->Driver.BlendColor = i830BlendColor;
    ctx->Driver.ClearColor = i830ClearColor;