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