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