Convert all uses of CARD32 and CARD8 to int32_t and int8_t.
[mesa.git] / src / mesa / drivers / dri / radeon / radeon_maos_vbtmp.h
1 /*
2 * Mesa 3-D graphics library
3 * Version: 4.1
4 *
5 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Keith Whitwell <keith@tungstengraphics.com>
26 */
27
28 #ifndef LOCALVARS
29 #define LOCALVARS
30 #endif
31
32 #undef TCL_DEBUG
33 #ifndef TCL_DEBUG
34 #define TCL_DEBUG 0
35 #endif
36
37 static void TAG(emit)( GLcontext *ctx,
38 GLuint start, GLuint end,
39 void *dest )
40 {
41 LOCALVARS
42 struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
43 GLuint (*tc0)[4], (*tc1)[4], (*tc2)[4];
44 GLfloat (*col)[4], (*spec)[4];
45 GLfloat (*fog)[4];
46 GLuint (*norm)[4];
47 GLuint tc0_stride, tc1_stride, col_stride, spec_stride, fog_stride;
48 GLuint tc2_stride, norm_stride;
49 GLuint fill_tex = 0;
50 GLuint (*coord)[4];
51 GLuint coord_stride; /* object coordinates */
52 GLubyte dummy[4];
53 int i;
54
55 union emit_union *v = (union emit_union *)dest;
56
57 if (RADEON_DEBUG & DEBUG_VERTS)
58 fprintf(stderr, "%s\n", __FUNCTION__);
59
60 coord = (GLuint (*)[4])VB->ObjPtr->data;
61 coord_stride = VB->ObjPtr->stride;
62
63 if (DO_TEX2) {
64 if (VB->TexCoordPtr[2]) {
65 const GLuint t2 = GET_TEXSOURCE(2);
66 tc2 = (GLuint (*)[4])VB->TexCoordPtr[t2]->data;
67 tc2_stride = VB->TexCoordPtr[t2]->stride;
68 if (DO_PTEX && VB->TexCoordPtr[t2]->size < 4) {
69 fill_tex |= (1<<2);
70 }
71 } else {
72 tc2 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX2];
73 tc2_stride = 0;
74 }
75 }
76
77 if (DO_TEX1) {
78 if (VB->TexCoordPtr[1]) {
79 const GLuint t1 = GET_TEXSOURCE(1);
80 tc1 = (GLuint (*)[4])VB->TexCoordPtr[t1]->data;
81 tc1_stride = VB->TexCoordPtr[t1]->stride;
82 if (DO_PTEX && VB->TexCoordPtr[t1]->size < 4) {
83 fill_tex |= (1<<1);
84 }
85 } else {
86 tc1 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX1];
87 tc1_stride = 0;
88 }
89 }
90
91 if (DO_TEX0) {
92 if (VB->TexCoordPtr[0]) {
93 const GLuint t0 = GET_TEXSOURCE(0);
94 tc0_stride = VB->TexCoordPtr[t0]->stride;
95 tc0 = (GLuint (*)[4])VB->TexCoordPtr[t0]->data;
96 if (DO_PTEX && VB->TexCoordPtr[t0]->size < 4) {
97 fill_tex |= (1<<0);
98 }
99 } else {
100 tc0 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX0];
101 tc0_stride = 0;
102 }
103
104 }
105
106 if (DO_NORM) {
107 if (VB->NormalPtr) {
108 norm_stride = VB->NormalPtr->stride;
109 norm = (GLuint (*)[4])VB->NormalPtr->data;
110 } else {
111 norm_stride = 0;
112 norm = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
113 }
114 }
115
116 if (DO_RGBA) {
117 if (VB->ColorPtr[0]) {
118 col = VB->ColorPtr[0]->data;
119 col_stride = VB->ColorPtr[0]->stride;
120 } else {
121 col = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
122 col_stride = 0;
123 }
124 }
125
126 if (DO_SPEC) {
127 if (VB->SecondaryColorPtr[0]) {
128 spec = VB->SecondaryColorPtr[0]->data;
129 spec_stride = VB->SecondaryColorPtr[0]->stride;
130 } else {
131 spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
132 spec_stride = 0;
133 }
134 }
135
136 if (DO_FOG) {
137 if (VB->FogCoordPtr) {
138 fog = VB->FogCoordPtr->data;
139 fog_stride = VB->FogCoordPtr->stride;
140 } else {
141 fog = (GLfloat (*)[4])&dummy; fog[0][0] = 0.0F;
142 fog_stride = 0;
143 }
144 }
145
146
147 if (start) {
148 coord = (GLuint (*)[4])((GLubyte *)coord + start * coord_stride);
149 if (DO_TEX0)
150 tc0 = (GLuint (*)[4])((GLubyte *)tc0 + start * tc0_stride);
151 if (DO_TEX1)
152 tc1 = (GLuint (*)[4])((GLubyte *)tc1 + start * tc1_stride);
153 if (DO_TEX2)
154 tc2 = (GLuint (*)[4])((GLubyte *)tc2 + start * tc2_stride);
155 if (DO_NORM)
156 norm = (GLuint (*)[4])((GLubyte *)norm + start * norm_stride);
157 if (DO_RGBA)
158 STRIDE_4F(col, start * col_stride);
159 if (DO_SPEC)
160 STRIDE_4F(spec, start * spec_stride);
161 if (DO_FOG)
162 STRIDE_4F(fog, start * fog_stride);
163 }
164
165
166 {
167 for (i=start; i < end; i++) {
168
169 v[0].ui = coord[0][0];
170 v[1].ui = coord[0][1];
171 v[2].ui = coord[0][2];
172 if (DO_W) {
173 v[3].ui = coord[0][3];
174 v += 4;
175 }
176 else
177 v += 3;
178 coord = (GLuint (*)[4])((GLubyte *)coord + coord_stride);
179
180 if (DO_NORM) {
181 v[0].ui = norm[0][0];
182 v[1].ui = norm[0][1];
183 v[2].ui = norm[0][2];
184 v += 3;
185 norm = (GLuint (*)[4])((GLubyte *)norm + norm_stride);
186 }
187 if (DO_RGBA) {
188 UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.red, col[0][0]);
189 UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.green, col[0][1]);
190 UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.blue, col[0][2]);
191 UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.alpha, col[0][3]);
192 STRIDE_4F(col, col_stride);
193 v++;
194 }
195 if (DO_SPEC || DO_FOG) {
196 if (DO_SPEC) {
197 UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.red, spec[0][0]);
198 UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.green, spec[0][1]);
199 UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.blue, spec[0][2]);
200 STRIDE_4F(spec, spec_stride);
201 }
202 if (DO_FOG) {
203 UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.alpha, fog[0][0]);
204 fog = (GLfloat (*)[4])((GLubyte *)fog + fog_stride);
205 }
206 if (TCL_DEBUG) fprintf(stderr, "%x ", v[0].ui);
207 v++;
208 }
209 if (DO_TEX0) {
210 v[0].ui = tc0[0][0];
211 v[1].ui = tc0[0][1];
212 if (TCL_DEBUG) fprintf(stderr, "t0: %.2f %.2f ", v[0].f, v[1].f);
213 if (DO_PTEX) {
214 if (fill_tex & (1<<0))
215 v[2].f = 1.0;
216 else
217 v[2].ui = tc0[0][3];
218 if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[2].f);
219 v += 3;
220 }
221 else
222 v += 2;
223 tc0 = (GLuint (*)[4])((GLubyte *)tc0 + tc0_stride);
224 }
225 if (DO_TEX1) {
226 v[0].ui = tc1[0][0];
227 v[1].ui = tc1[0][1];
228 if (TCL_DEBUG) fprintf(stderr, "t1: %.2f %.2f ", v[0].f, v[1].f);
229 if (DO_PTEX) {
230 if (fill_tex & (1<<1))
231 v[2].f = 1.0;
232 else
233 v[2].ui = tc1[0][3];
234 if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[2].f);
235 v += 3;
236 }
237 else
238 v += 2;
239 tc1 = (GLuint (*)[4])((GLubyte *)tc1 + tc1_stride);
240 }
241 if (DO_TEX2) {
242 v[0].ui = tc2[0][0];
243 v[1].ui = tc2[0][1];
244 if (DO_PTEX) {
245 if (fill_tex & (1<<2))
246 v[2].f = 1.0;
247 else
248 v[2].ui = tc2[0][3];
249 v += 3;
250 }
251 else
252 v += 2;
253 tc2 = (GLuint (*)[4])((GLubyte *)tc2 + tc2_stride);
254 }
255 if (TCL_DEBUG) fprintf(stderr, "\n");
256 }
257 }
258 }
259
260
261
262 static void TAG(init)( void )
263 {
264 int sz = 3;
265 if (DO_W) sz++;
266 if (DO_NORM) sz += 3;
267 if (DO_RGBA) sz++;
268 if (DO_SPEC || DO_FOG) sz++;
269 if (DO_TEX0) sz += 2;
270 if (DO_TEX0 && DO_PTEX) sz++;
271 if (DO_TEX1) sz += 2;
272 if (DO_TEX1 && DO_PTEX) sz++;
273 if (DO_TEX2) sz += 2;
274 if (DO_TEX2 && DO_PTEX) sz++;
275
276 setup_tab[IDX].emit = TAG(emit);
277 setup_tab[IDX].vertex_format = IND;
278 setup_tab[IDX].vertex_size = sz;
279 }
280
281
282 #undef IND
283 #undef TAG
284 #undef IDX