enable generic arrays for r200 hw vertex programs by assigning unused color and textu...
[mesa.git] / src / mesa / drivers / dri / r200 / r200_tcl.c
index 2530e1b1046679a2de0632aa3d0dc22bd33314e7..3334d1e15661f6c74758aed0a9092762439fdc32 100644 (file)
@@ -68,7 +68,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define HAVE_ELTS        1
 
 
-#define HW_POINTS           ((ctx->_TriangleCaps & DD_POINT_SIZE) ? \
+#define HW_POINTS           ((ctx->Point.PointSprite || \
+                               ((ctx->_TriangleCaps & (DD_POINT_SIZE | DD_POINT_ATTEN)) && \
+                               !(ctx->_TriangleCaps & (DD_POINT_SMOOTH)))) ? \
                                R200_VF_PRIM_POINT_SPRITES : R200_VF_PRIM_POINTS)
 #define HW_LINES            R200_VF_PRIM_LINES
 #define HW_LINE_LOOP        0
@@ -268,6 +270,17 @@ void r200TclPrimitive( GLcontext *ctx,
 
    if (newprim != rmesa->tcl.hw_primitive ||
        !discrete_prim[hw_prim&0xf]) {
+      /* need to disable perspective-correct texturing for point sprites */
+      if ((prim & PRIM_MODE_MASK) == GL_POINTS && ctx->Point.PointSprite) {
+        if (rmesa->hw.set.cmd[SET_RE_CNTL] & R200_PERSPECTIVE_ENABLE) {
+           R200_STATECHANGE( rmesa, set );
+           rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_PERSPECTIVE_ENABLE;
+        }
+      }
+      else if (!(rmesa->hw.set.cmd[SET_RE_CNTL] & R200_PERSPECTIVE_ENABLE)) {
+        R200_STATECHANGE( rmesa, set );
+        rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_PERSPECTIVE_ENABLE;
+      }
       R200_NEWPRIM( rmesa );
       rmesa->tcl.hw_primitive = newprim;
    }
@@ -416,60 +429,43 @@ static GLboolean r200_run_tcl_render( GLcontext *ctx,
       }
    }
    else {
-      GLuint out_vtxfmt0 = 0;
-      GLuint out_vtxfmt1 = 0;
+      /* vtx_tcl_output_vtxfmt_0/1 need to match configuration of "fragment
+        part", since using some vertex interpolator later which is not in
+        out_vtxfmt0/1 will lock up. It seems to be ok to write in vertex
+        prog to a not enabled output however, so just don't mess with it.
+        We only need to change compsel. */
       GLuint out_compsel = 0;
       GLuint vp_out = rmesa->curr_vp_hw->mesa_program.Base.OutputsWritten;
+#if 0
       /* can't handle other inputs, generic attribs etc. currently - should never arrive here */
       assert ((rmesa->curr_vp_hw->mesa_program.Base.InputsRead &
         ~(VERT_BIT_POS | VERT_BIT_NORMAL | VERT_BIT_COLOR0 | VERT_BIT_COLOR1 |
          VERT_BIT_FOG | VERT_BIT_TEX0 | VERT_BIT_TEX1 | VERT_BIT_TEX2 |
          VERT_BIT_TEX3 | VERT_BIT_TEX4 | VERT_BIT_TEX5)) == 0);
+#endif
       inputs |= rmesa->curr_vp_hw->mesa_program.Base.InputsRead;
-      /* FIXME: this is a mess. Not really sure how to set up TCL_OUTPUT_VTXFMT
-        in "undefined" cases (e.g. output needed later but not written by vertex program or vice versa)
-        - however misconfiguration here will almost certainly lock up the chip.
-        I think at the very least we need to enable tcl outputs which we write to. Maybe even need to
-        fix up a vertex program so an output needed later always gets written?
-        For now just set the compsel and output_vtxfmt to the outputs written.
-        However, for simplicity we assume always all 4 values are written which may not be correct
-        (but I don't know if it could lead to lockups). */
       assert(vp_out & (1 << VERT_RESULT_HPOS));
-      out_vtxfmt0 = R200_VTX_XY | R200_VTX_Z0 | R200_VTX_W0;
-      /* FIXME: need to always enable color_0 otherwise doom3's shadow vp (?) will lock up (?) */
-      out_vtxfmt0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT;
       out_compsel = R200_OUTPUT_XYZW;
       if (vp_out & (1 << VERT_RESULT_COL0)) {
-        out_vtxfmt0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT;
         out_compsel |= R200_OUTPUT_COLOR_0;
       }
       if (vp_out & (1 << VERT_RESULT_COL1)) {
-        out_vtxfmt0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT;
         out_compsel |= R200_OUTPUT_COLOR_1;
       }
-      /* FIXME: probably not everything is set up for fogc and psiz to work correctly */
       if (vp_out & (1 << VERT_RESULT_FOGC)) {
-        out_vtxfmt0 |= R200_VTX_DISCRETE_FOG;
          out_compsel |= R200_OUTPUT_DISCRETE_FOG;
       }
       if (vp_out & (1 << VERT_RESULT_PSIZ)) {
-        out_vtxfmt0 |= R200_VTX_POINT_SIZE;
         out_compsel |= R200_OUTPUT_PT_SIZE;
       }
       for (i = VERT_RESULT_TEX0; i < VERT_RESULT_TEX6; i++) {
         if (vp_out & (1 << i)) {
-           out_vtxfmt1 |= 4  << ((i - VERT_RESULT_TEX0) * 3);
            out_compsel |= R200_OUTPUT_TEX_0 << (i - VERT_RESULT_TEX0);
         }
       }
-      if ((rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] != out_vtxfmt0) ||
-        (rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_1] != out_vtxfmt1) ||
-        (rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] != out_compsel)) {
+      if (rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] != out_compsel) {
         R200_STATECHANGE( rmesa, vtx );
-        rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] = out_vtxfmt0;
-        rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_1] = out_vtxfmt1;
         rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] = out_compsel;
-        /* FIXME: should restore this when disabling vertex programs maybe? */
       }
    }
 
@@ -545,7 +541,6 @@ static void transition_to_swtnl( GLcontext *ctx )
     * need to put the card into D3D mode to make it work:
     */
    R200_STATECHANGE( rmesa, vap );
-   /* not sure if it's strictly necessary to disable VAP_PROG_VTX_SHADER_ENABLE in addition to VAP_TCL_ENABLE) */
    rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] &= ~(R200_VAP_TCL_ENABLE|R200_VAP_PROG_VTX_SHADER_ENABLE);
 }
 
@@ -584,7 +579,7 @@ static void transition_to_hwtnl( GLcontext *ctx )
       rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~R200_FOG_USE_MASK;
       rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |= R200_FOG_USE_VTX_FOG;
    }
-   
+
    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;