SUBPIXEL fixes from Dieter
[mesa.git] / src / mesa / drivers / dri / radeon / radeon_maos_arrays.c
index cec05a89d7ed58316da2235f36c6ca99d288bd24..98f66898c73c7e9d0734f953c35d71af247b8b68 100644 (file)
@@ -1,4 +1,4 @@
-/* $XFree86$ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_maos_arrays.c,v 1.1 2002/10/30 12:51:55 alanh Exp $ */
 /**************************************************************************
 
 Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
@@ -36,14 +36,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "glheader.h"
 #include "imports.h"
 #include "mtypes.h"
-#include "mmath.h"
 #include "macros.h"
 
 #include "swrast_setup/swrast_setup.h"
 #include "math/m_translate.h"
 #include "tnl/tnl.h"
 #include "tnl/t_context.h"
-#include "tnl/t_imm_debug.h"
 
 #include "radeon_context.h"
 #include "radeon_ioctl.h"
@@ -51,6 +49,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "radeon_swtcl.h"
 #include "radeon_maos.h"
 
+#if 0
 /* Usage:
  *   - from radeon_tcl_render
  *   - call radeonEmitArrays to ensure uptodate arrays in dma
@@ -70,7 +69,7 @@ static void emit_ubyte_rgba3( GLcontext *ctx,
 
    if (RADEON_DEBUG & DEBUG_VERTS)
       fprintf(stderr, "%s count %d stride %d out %p\n",
-             __FUNCTION__, count, stride, out);
+             __FUNCTION__, count, stride, (void *)out);
 
    for (i = 0; i < count; i++) {
       out->red   = *data;
@@ -82,29 +81,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 radeon_dma_region *rvb,
                              char *data,
@@ -171,9 +147,52 @@ static void emit_ubyte_rgba( GLcontext *ctx,
       break;
    }
 }
+#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 radeon_dma_region *rvb,
+                      char *data,
+                      int stride,
+                      int count )
+{
+   int i;
+   int *out = (int *)(rvb->address + rvb->start);
+
+   if (RADEON_DEBUG & DEBUG_VERTS)
+      fprintf(stderr, "%s count %d stride %d\n",
+             __FUNCTION__, count, stride);
+
+   if (stride == 4)
+      COPY_DWORDS( out, data, count );
+   else
+      for (i = 0; i < count; i++) {
+        out[0] = *(int *)data;
+        out++;
+        data += stride;
+      }
+}
+
 
 static void emit_vec8( GLcontext *ctx,
                       struct radeon_dma_region *rvb,
@@ -210,7 +229,7 @@ static void emit_vec12( GLcontext *ctx,
 
    if (RADEON_DEBUG & DEBUG_VERTS)
       fprintf(stderr, "%s count %d stride %d out %p data %p\n",
-             __FUNCTION__, count, stride, out, data);
+             __FUNCTION__, count, stride, (void *)out, (void *)data);
 
    if (stride == 12)
       COPY_DWORDS( out, data, count*3 );
@@ -283,6 +302,9 @@ static void emit_vector( GLcontext *ctx,
    /* Emit the data
     */
    switch (size) {
+   case 1:
+      emit_vec4( ctx, rvb, data, stride, count );
+      break;
    case 2:
       emit_vec8( ctx, rvb, data, stride, count );
       break;
@@ -409,7 +431,7 @@ static void emit_tex_vector( GLcontext *ctx,
 
 
 
-/* Emit any changed arrays to new agp memory, re-emit a packet to
+/* Emit any changed arrays to new GART memory, re-emit a packet to
  * update the arrays.  
  */
 void radeonEmitArrays( GLcontext *ctx, GLuint inputs )
@@ -422,8 +444,10 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs )
    GLuint count = VB->Count;
    GLuint vtx;
    
+#if 0
    if (RADEON_DEBUG & DEBUG_VERTS) 
       _tnl_print_vert_flags( __FUNCTION__, inputs );
+#endif
 
    if (1) {
       if (!rmesa->tcl.obj.buf) 
@@ -439,6 +463,7 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs )
       case 3: vfmt |= RADEON_CP_VC_FRMT_Z;
       case 2: vfmt |= RADEON_CP_VC_FRMT_XY;
       default:
+         break;
       }
       component[nr++] = &rmesa->tcl.obj;
    }
@@ -458,64 +483,50 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs )
    }
 
    if (inputs & VERT_BIT_COLOR0) {
-      if (VB->ColorPtr[0]->Type == GL_UNSIGNED_BYTE) {
-        if (!rmesa->tcl.rgba.buf)
-           emit_ubyte_rgba( ctx, 
-                            &rmesa->tcl.rgba, 
-                            (char *)VB->ColorPtr[0]->Ptr,
-                            VB->ColorPtr[0]->Size,
-                            VB->ColorPtr[0]->StrideB,
-                            count);
-
-        vfmt |= RADEON_CP_VC_FRMT_PKCOLOR; 
+      int emitsize;
+      if (VB->ColorPtr[0]->size == 4 &&
+         (VB->ColorPtr[0]->stride != 0 ||
+          VB->ColorPtr[0]->data[0][3] != 1.0)) {
+        vfmt |= RADEON_CP_VC_FRMT_FPCOLOR | RADEON_CP_VC_FRMT_FPALPHA;
+        emitsize = 4;
       }
+
       else {
-        int emitsize;
-
-        if (VB->ColorPtr[0]->Size == 4 &&
-            (VB->ColorPtr[0]->StrideB != 0 ||
-             ((GLfloat *)VB->ColorPtr[0]->Ptr)[3] != 1.0)) { 
-           vfmt |= RADEON_CP_VC_FRMT_FPCOLOR | RADEON_CP_VC_FRMT_FPALPHA;
-           emitsize = 4;
-        }
-        else { 
-           vfmt |= RADEON_CP_VC_FRMT_FPCOLOR;
-           emitsize = 3;
-        }
-
-        if (!rmesa->tcl.rgba.buf)
-           emit_vector( ctx, 
-                        &(rmesa->tcl.rgba), 
-                        (char *)VB->ColorPtr[0]->Ptr,
-                        emitsize,
-                        VB->ColorPtr[0]->StrideB,
-                        count);
+        vfmt |= RADEON_CP_VC_FRMT_FPCOLOR;
+        emitsize = 3;
       }
 
+      if (!rmesa->tcl.rgba.buf)
+        emit_vector( ctx,
+                     &(rmesa->tcl.rgba),
+                     (char *)VB->ColorPtr[0]->data,
+                     emitsize,
+                     VB->ColorPtr[0]->stride,
+                     count);
+
+
       component[nr++] = &rmesa->tcl.rgba;
    }
 
 
    if (inputs & VERT_BIT_COLOR1) {
       if (!rmesa->tcl.spec.buf) {
-        if (VB->SecondaryColorPtr[0]->Type != GL_UNSIGNED_BYTE)
-           radeon_import_float_spec_colors( ctx );
-
-        emit_ubyte_rgba( ctx, 
-                         &rmesa->tcl.spec, 
-                         (char *)VB->SecondaryColorPtr[0]->Ptr,
-                         3,
-                         VB->SecondaryColorPtr[0]->StrideB,
-                         count);
+
+        emit_vector( ctx,
+                     &rmesa->tcl.spec,
+                     (char *)VB->SecondaryColorPtr[0]->data,
+                     3,
+                     VB->SecondaryColorPtr[0]->stride,
+                     count);
       }
 
-      vfmt |= RADEON_CP_VC_FRMT_PKSPEC; 
+      vfmt |= RADEON_CP_VC_FRMT_FPSPEC;
       component[nr++] = &rmesa->tcl.spec;
    }
 
    vtx = (rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &
          ~(RADEON_TCL_VTX_Q0|RADEON_TCL_VTX_Q1));
-      
+
    if (inputs & VERT_BIT_TEX0) {
       if (!rmesa->tcl.tex[0].buf)
         emit_tex_vector( ctx, 
@@ -568,8 +579,10 @@ void radeonReleaseArrays( GLcontext *ctx, GLuint newinputs )
 {
    radeonContextPtr rmesa = RADEON_CONTEXT( ctx );
 
+#if 0
    if (RADEON_DEBUG & DEBUG_VERTS) 
       _tnl_print_vert_flags( __FUNCTION__, newinputs );
+#endif
 
    if (newinputs & VERT_BIT_POS) 
      radeonReleaseDmaRegion( rmesa, &rmesa->tcl.obj, __FUNCTION__ );