t_dd_triemit.h revision 5df82c82bd53db90eb72c5aad4dd20cf6f1116b1
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 ) \ 11do { \ 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 ) \ 21do { \ 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 31static __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", __FUNCTION__); 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 55static __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", __FUNCTION__); 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 83static __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", __FUNCTION__); 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 106static __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 120static __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 132static void TAG(fast_clipped_poly)( GLcontext *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 int i,j; 140 141 if (DO_DEBUG_VERTS) { 142 fprintf(stderr, "%s\n", __FUNCTION__); 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