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