Home | History | Annotate | Download | only in tnl_dd
      1 #ifndef DO_DEBUG_VERTS
      2 #define DO_DEBUG_VERTS 0
      3 #endif
      4 
      5 #ifndef PRINT_VERTEX
      6 #define PRINT_VERTEX(x)
      7 #endif
      8 
      9 #if defined(USE_X86_ASM)
     10 #define COPY_DWORDS( j, vb, vertsize, v )				\
     11 do {									\
     12 	int __tmp;							\
     13 	__asm__ __volatile__( "rep ; movsl"				\
     14 			      : "=%c" (j), "=D" (vb), "=S" (__tmp)	\
     15 			      : "0" (vertsize),				\
     16 			        "D" ((long)vb),				\
     17 			        "S" ((long)v) );			\
     18 } while (0)
     19 #elif defined(HAVE_LE32_VERTS)
     20 #define COPY_DWORDS( j, vb, vertsize, v )				\
     21 do {									\
     22    for ( j = 0 ; j < vertsize ; j++ )					\
     23       vb[j] = CPU_TO_LE32(((GLuint *)v)[j]);				\
     24    vb += vertsize;							\
     25 } while (0)
     26 #else
     27 #define COPY_DWORDS( j, vb, vertsize, v )				\
     28 do {									\
     29    for ( j = 0 ; j < vertsize ; j++ )					\
     30       vb[j] = ((GLuint *)v)[j];						\
     31    vb += vertsize;							\
     32 } while (0)
     33 #endif
     34 
     35 
     36 
     37 #if HAVE_QUADS
     38 static __inline void TAG(quad)( CTX_ARG,
     39 				VERTEX *v0,
     40 				VERTEX *v1,
     41 				VERTEX *v2,
     42 				VERTEX *v3 )
     43 {
     44    GLuint vertsize = GET_VERTEX_DWORDS();
     45    GLuint *vb = (GLuint *)ALLOC_VERTS( 4, vertsize);
     46    GLuint j;
     47 
     48    if (DO_DEBUG_VERTS) {
     49       fprintf(stderr, "%s\n", __FUNCTION__);
     50       PRINT_VERTEX(v0);
     51       PRINT_VERTEX(v1);
     52       PRINT_VERTEX(v2);
     53       PRINT_VERTEX(v3);
     54    }
     55 
     56    COPY_DWORDS( j, vb, vertsize, v0 );
     57    COPY_DWORDS( j, vb, vertsize, v1 );
     58    COPY_DWORDS( j, vb, vertsize, v2 );
     59    COPY_DWORDS( j, vb, vertsize, v3 );
     60 }
     61 #else
     62 static __inline void TAG(quad)( CTX_ARG,
     63 				VERTEX *v0,
     64 				VERTEX *v1,
     65 				VERTEX *v2,
     66 				VERTEX *v3 )
     67 {
     68    GLuint vertsize = GET_VERTEX_DWORDS();
     69    GLuint *vb = (GLuint *)ALLOC_VERTS(  6, vertsize);
     70    GLuint j;
     71 
     72    if (DO_DEBUG_VERTS) {
     73       fprintf(stderr, "%s\n", __FUNCTION__);
     74       PRINT_VERTEX(v0);
     75       PRINT_VERTEX(v1);
     76       PRINT_VERTEX(v2);
     77       PRINT_VERTEX(v3);
     78    }
     79 
     80    COPY_DWORDS( j, vb, vertsize, v0 );
     81    COPY_DWORDS( j, vb, vertsize, v1 );
     82    COPY_DWORDS( j, vb, vertsize, v3 );
     83    COPY_DWORDS( j, vb, vertsize, v1 );
     84    COPY_DWORDS( j, vb, vertsize, v2 );
     85    COPY_DWORDS( j, vb, vertsize, v3 );
     86 }
     87 #endif
     88 
     89 
     90 static __inline void TAG(triangle)( CTX_ARG,
     91 				    VERTEX *v0,
     92 				    VERTEX *v1,
     93 				    VERTEX *v2 )
     94 {
     95    GLuint vertsize = GET_VERTEX_DWORDS();
     96    GLuint *vb = (GLuint *)ALLOC_VERTS( 3, vertsize);
     97    GLuint j;
     98 
     99    if (DO_DEBUG_VERTS) {
    100       fprintf(stderr, "%s\n", __FUNCTION__);
    101       PRINT_VERTEX(v0);
    102       PRINT_VERTEX(v1);
    103       PRINT_VERTEX(v2);
    104    }
    105 
    106    COPY_DWORDS( j, vb, vertsize, v0 );
    107    COPY_DWORDS( j, vb, vertsize, v1 );
    108    COPY_DWORDS( j, vb, vertsize, v2 );
    109 }
    110 
    111 
    112 #if HAVE_LINES
    113 static __inline void TAG(line)( CTX_ARG,
    114 				VERTEX *v0,
    115 				VERTEX *v1 )
    116 {
    117    GLuint vertsize = GET_VERTEX_DWORDS();
    118    GLuint *vb = (GLuint *)ALLOC_VERTS( 2, vertsize);
    119    GLuint j;
    120 
    121    COPY_DWORDS( j, vb, vertsize, v0 );
    122    COPY_DWORDS( j, vb, vertsize, v1 );
    123 }
    124 #endif
    125 
    126 #if HAVE_POINTS
    127 static __inline void TAG(point)( CTX_ARG,
    128 				 VERTEX *v0 )
    129 {
    130    GLuint vertsize = GET_VERTEX_DWORDS();
    131    GLuint *vb = (GLuint *)ALLOC_VERTS( 1, vertsize);
    132    int j;
    133 
    134    COPY_DWORDS( j, vb, vertsize, v0 );
    135 }
    136 #endif
    137 
    138 
    139 static void TAG(fast_clipped_poly)( struct gl_context *ctx, const GLuint *elts,
    140 				    GLuint n )
    141 {
    142    LOCAL_VARS
    143    GLuint vertsize = GET_VERTEX_DWORDS();
    144    GLuint *vb = (GLuint *)ALLOC_VERTS( (n-2) * 3, vertsize );
    145    const GLuint *start = (const GLuint *)VERT(elts[0]);
    146    GLuint i,j;
    147 
    148    if (DO_DEBUG_VERTS) {
    149       fprintf(stderr, "%s\n", __FUNCTION__);
    150       PRINT_VERTEX(VERT(elts[0]));
    151       PRINT_VERTEX(VERT(elts[1]));
    152    }
    153 
    154    for (i = 2 ; i < n ; i++) {
    155       if (DO_DEBUG_VERTS) {
    156 	 PRINT_VERTEX(VERT(elts[i]));
    157       }
    158 
    159       COPY_DWORDS( j, vb, vertsize, VERT(elts[i-1]) );
    160       COPY_DWORDS( j, vb, vertsize, VERT(elts[i]) );
    161       COPY_DWORDS( j, vb, vertsize, start );
    162    }
    163 }
    164 
    165