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