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#elif defined(HAVE_LE32_VERTS)
20#define COPY_DWORDS( j, vb, vertsize, v )				\
21do {									\
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 )				\
28do {									\
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
38static __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
62static __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
90static __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
113static __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
127static __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
139static 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