(Andreas Stenglein) fix projected textures with swtcl, they need the w coordinate...
authorRoland Scheidegger <rscheidegger@gmx.ch>
Thu, 10 Feb 2005 18:28:44 +0000 (18:28 +0000)
committerRoland Scheidegger <rscheidegger@gmx.ch>
Thu, 10 Feb 2005 18:28:44 +0000 (18:28 +0000)
src/mesa/drivers/dri/r200/r200_swtcl.c
src/mesa/drivers/dri/r200/r200_tcl.c

index 43f836507818757465b95f8e17fa1d2b64cbc600..141bcde16179b907cc0b954016736f09a4dd6efd 100644 (file)
@@ -106,7 +106,7 @@ static void r200SetVertexFormat( GLcontext *ctx )
    /* EMIT_ATTR's must be in order as they tell t_vertex.c how to
     * build up a hardware vertex.
     */
-   if ( !rmesa->swtcl.needproj ) {
+   if ( !rmesa->swtcl.needproj || (index & _TNL_BITS_TEX_ANY)) { /* need w coord for projected textures */
       EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F, R200_VTX_XY | R200_VTX_Z0 | R200_VTX_W0 );
       offset = 4;
    }
@@ -230,11 +230,18 @@ void r200ChooseVertexState( GLcontext *ctx )
        || (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
       rmesa->swtcl.needproj = GL_TRUE;
       vte |= R200_VTX_XY_FMT | R200_VTX_Z_FMT;
-      vap |= R200_VAP_FORCE_W_TO_ONE;
+      vte &= ~R200_VTX_W0_FMT;
+      if (tnl->render_inputs & _TNL_BITS_TEX_ANY) {
+        vap &= ~R200_VAP_FORCE_W_TO_ONE;
+      }
+      else {
+        vap |= R200_VAP_FORCE_W_TO_ONE;
+      }
    }
    else {
       rmesa->swtcl.needproj = GL_FALSE;
       vte &= ~(R200_VTX_XY_FMT | R200_VTX_Z_FMT);
+      vte |= R200_VTX_W0_FMT;
       vap &= ~R200_VAP_FORCE_W_TO_ONE;
    }
 
@@ -751,6 +758,7 @@ r200PointsBitmap( GLcontext *ctx, GLint px, GLint py,
       GLuint vap = rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL];
 
       vte &= ~(R200_VTX_XY_FMT | R200_VTX_Z_FMT);
+      vte |= R200_VTX_W0_FMT;
       vap &= ~R200_VAP_FORCE_W_TO_ONE;
 
       rmesa->swtcl.vertex_size = 5;
index 04c40d47c2ef74799770a5654d6d0bc2f838a631..0e7c71054e7fe3ba0b54f846d622b2707439e842 100644 (file)
@@ -560,6 +560,7 @@ static void transition_to_hwtnl( GLcontext *ctx )
    
    R200_STATECHANGE( rmesa, vte );
    rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] &= ~(R200_VTX_XY_FMT|R200_VTX_Z_FMT);
+   rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] |= R200_VTX_W0_FMT;
 
    if (R200_DEBUG & DEBUG_FALLBACKS) 
       fprintf(stderr, "R200 end tcl fallback\n");