Add support for GL_EXT_blend_[func|equation]_separate. Fix GL_EXT_blend_color. Remove...
[mesa.git] / src / mesa / drivers / dri / r200 / r200_maos_arrays.c
index 6c6013054abcc9a758a371de4423baeb8d07fb3b..301b265396afb82b45147a93f123cb9b36be3d51 100644 (file)
@@ -50,6 +50,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r200_swtcl.h"
 #include "r200_maos.h"
 
+
+#if 0
 /* Usage:
  *   - from r200_tcl_render
  *   - call r200EmitArrays to ensure uptodate arrays in dma
@@ -81,29 +83,6 @@ static void emit_ubyte_rgba3( GLcontext *ctx,
    }
 }
 
-
-#if defined(USE_X86_ASM)
-#define COPY_DWORDS( dst, src, nr )                                    \
-do {                                                                   \
-       int __tmp;                                                      \
-       __asm__ __volatile__( "rep ; movsl"                             \
-                             : "=%c" (__tmp), "=D" (dst), "=S" (__tmp) \
-                             : "0" (nr),                               \
-                               "D" ((long)dst),                        \
-                               "S" ((long)src) );                      \
-} while (0)
-#else
-#define COPY_DWORDS( dst, src, nr )            \
-do {                                           \
-   int j;                                      \
-   for ( j = 0 ; j < nr ; j++ )                        \
-      dst[j] = ((int *)src)[j];                        \
-   dst += nr;                                  \
-} while (0)
-#endif
-
-
-
 static void emit_ubyte_rgba4( GLcontext *ctx,
                              struct r200_dma_region *rvb,
                              char *data,
@@ -129,7 +108,6 @@ static void emit_ubyte_rgba4( GLcontext *ctx,
 }
 
 
-#if 0
 static void emit_ubyte_rgba( GLcontext *ctx,
                             struct r200_dma_region *rvb,
                             char *data,
@@ -176,6 +154,30 @@ static void emit_ubyte_rgba( GLcontext *ctx,
 #endif
 
 
+#if defined(USE_X86_ASM)
+#define COPY_DWORDS( dst, src, nr )                                    \
+do {                                                                   \
+       int __tmp;                                                      \
+       __asm__ __volatile__( "rep ; movsl"                             \
+                             : "=%c" (__tmp), "=D" (dst), "=S" (__tmp) \
+                             : "0" (nr),                               \
+                               "D" ((long)dst),                        \
+                               "S" ((long)src) );                      \
+} while (0)
+#else
+#define COPY_DWORDS( dst, src, nr )            \
+do {                                           \
+   int j;                                      \
+   for ( j = 0 ; j < nr ; j++ )                        \
+      dst[j] = ((int *)src)[j];                        \
+   dst += nr;                                  \
+} while (0)
+#endif
+
+
+
+
+
 static void emit_vec4( GLcontext *ctx,
                       struct r200_dma_region *rvb,
                       char *data,
@@ -235,7 +237,7 @@ static void emit_vec12( GLcontext *ctx,
 
    if (R200_DEBUG & DEBUG_VERTS)
       fprintf(stderr, "%s count %d stride %d out %p data %p\n",
-             __FUNCTION__, count, stride, out, (void *)data);
+             __FUNCTION__, count, stride, (void *)out, (void *)data);
 
    if (stride == 12)
       COPY_DWORDS( out, data, count*3 );
@@ -341,6 +343,8 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
    GLuint nr = 0;
    GLuint vfmt0 = 0, vfmt1 = 0;
    GLuint count = VB->Count;
+   GLuint i;
+   GLuint re_cntl;
    
    if (1) {
       if (!rmesa->tcl.obj.buf) 
@@ -420,30 +424,34 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs )
 /*    vtx = (rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] & */
 /*       ~(R200_TCL_VTX_Q0|R200_TCL_VTX_Q1)); */
       
-   if (inputs & VERT_BIT_TEX0) {
-      if (!rmesa->tcl.tex[0].buf)
-        emit_vector( ctx, 
-                     &(rmesa->tcl.tex[0]), 
-                     (char *)VB->TexCoordPtr[0]->data,
-                     VB->TexCoordPtr[0]->size,
-                     VB->TexCoordPtr[0]->stride,
-                     count );
-
-      vfmt1 |= VB->TexCoordPtr[0]->size << R200_VTX_TEX0_COMP_CNT_SHIFT;
-      component[nr++] = &rmesa->tcl.tex[0];
+   re_cntl = rmesa->hw.set.cmd[SET_RE_CNTL] & ~(R200_VTX_STQ0_D3D |
+                                               R200_VTX_STQ1_D3D |
+                                               R200_VTX_STQ2_D3D |
+                                               R200_VTX_STQ3_D3D |
+                                               R200_VTX_STQ4_D3D |
+                                               R200_VTX_STQ5_D3D );
+   for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) {
+      if (inputs & (VERT_BIT_TEX0 << i)) {
+        if (!rmesa->tcl.tex[i].buf)
+            emit_vector( ctx, 
+                         &(rmesa->tcl.tex[i]),
+                         (char *)VB->TexCoordPtr[i]->data,
+                         VB->TexCoordPtr[i]->size,
+                         VB->TexCoordPtr[i]->stride,
+                         count );
+
+        if ( ctx->Texture.Unit[i]._ReallyEnabled == TEXTURE_CUBE_BIT ) {
+           re_cntl |= R200_VTX_STQ0_D3D << (2 * i);
+        }
+
+        vfmt1 |= VB->TexCoordPtr[i]->size << (i * 3);
+        component[nr++] = &rmesa->tcl.tex[i];
+      }
    }
 
-   if (inputs & VERT_BIT_TEX1) {
-      if (!rmesa->tcl.tex[1].buf)
-        emit_vector( ctx, 
-                     &(rmesa->tcl.tex[1]), 
-                     (char *)VB->TexCoordPtr[1]->data,
-                     VB->TexCoordPtr[1]->size,
-                     VB->TexCoordPtr[1]->stride,
-                     count );
-        
-      vfmt1 |= VB->TexCoordPtr[1]->size << R200_VTX_TEX1_COMP_CNT_SHIFT;
-      component[nr++] = &rmesa->tcl.tex[1];
+   if ( re_cntl != rmesa->hw.set.cmd[SET_RE_CNTL] ) {
+      R200_STATECHANGE( rmesa, set );
+      rmesa->hw.set.cmd[SET_RE_CNTL] = re_cntl;
    }
 
    if (vfmt0 != rmesa->hw.vtx.cmd[VTX_VTXFMT_0] ||