• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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