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
TAG(quad)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
TAG(quad)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 
TAG(triangle)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
TAG(line)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
TAG(point)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 
TAG(fast_clipped_poly)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