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 #else
20 #define COPY_DWORDS( j, vb, vertsize, v ) \
21 do { \
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
TAG(quad)31 static __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", __func__);
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
TAG(quad)55 static __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", __func__);
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
TAG(triangle)83 static __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", __func__);
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
TAG(line)106 static __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
TAG(point)120 static __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
TAG(fast_clipped_poly)132 static void TAG(fast_clipped_poly)( struct gl_context *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 GLuint i,j;
140
141 if (DO_DEBUG_VERTS) {
142 fprintf(stderr, "%s\n", __func__);
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