Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
58 pj 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
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", __FUNCTION__);
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
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", __FUNCTION__);
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
 
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", __FUNCTION__);
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
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
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
 
132
static void TAG(fast_clipped_poly)( GLcontext *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
   int i,j;
140
 
141
   if (DO_DEBUG_VERTS) {
142
      fprintf(stderr, "%s\n", __FUNCTION__);
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