Rev 59 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
59 | pj | 1 | /* $Id: ss_vb.c,v 1.1 2003-02-28 11:54:35 pj Exp $ */ |
2 | |||
3 | /* |
||
4 | * Mesa 3-D graphics library |
||
5 | * Version: 4.1 |
||
6 | * |
||
7 | * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. |
||
8 | * |
||
9 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
10 | * copy of this software and associated documentation files (the "Software"), |
||
11 | * to deal in the Software without restriction, including without limitation |
||
12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
13 | * and/or sell copies of the Software, and to permit persons to whom the |
||
14 | * Software is furnished to do so, subject to the following conditions: |
||
15 | * |
||
16 | * The above copyright notice and this permission notice shall be included |
||
17 | * in all copies or substantial portions of the Software. |
||
18 | * |
||
19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
20 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
22 | * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
||
23 | * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||
24 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
25 | * |
||
26 | * Authors: |
||
27 | * Keith Whitwell <keith@tungstengraphics.com> |
||
28 | */ |
||
29 | |||
30 | #include "glheader.h" |
||
31 | #include "colormac.h" |
||
32 | #include "context.h" |
||
33 | #include "macros.h" |
||
34 | #include "imports.h" |
||
35 | |||
36 | #include "swrast/swrast.h" |
||
37 | #include "tnl/t_context.h" |
||
38 | #include "math/m_vector.h" |
||
39 | #include "math/m_translate.h" |
||
40 | |||
41 | #include "ss_context.h" |
||
42 | #include "ss_vb.h" |
||
43 | |||
44 | static void do_import( struct vertex_buffer *VB, |
||
45 | struct gl_client_array *to, |
||
46 | struct gl_client_array *from ) |
||
47 | { |
||
48 | GLuint count = VB->Count; |
||
49 | |||
50 | if (!to->Ptr) { |
||
51 | to->Ptr = ALIGN_MALLOC( VB->Size * 4 * sizeof(GLchan), 32 ); |
||
52 | to->Type = CHAN_TYPE; |
||
53 | } |
||
54 | |||
55 | /* No need to transform the same value 3000 times. |
||
56 | */ |
||
57 | if (!from->StrideB) { |
||
58 | to->StrideB = 0; |
||
59 | count = 1; |
||
60 | } |
||
61 | else |
||
62 | to->StrideB = 4 * sizeof(GLchan); |
||
63 | |||
64 | _math_trans_4chan( (GLchan (*)[4]) to->Ptr, |
||
65 | from->Ptr, |
||
66 | from->StrideB, |
||
67 | from->Type, |
||
68 | from->Size, |
||
69 | 0, |
||
70 | count); |
||
71 | } |
||
72 | |||
73 | static void import_float_colors( GLcontext *ctx ) |
||
74 | { |
||
75 | struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; |
||
76 | struct gl_client_array *to = &SWSETUP_CONTEXT(ctx)->ChanColor; |
||
77 | do_import( VB, to, VB->ColorPtr[0] ); |
||
78 | VB->ColorPtr[0] = to; |
||
79 | } |
||
80 | |||
81 | static void import_float_spec_colors( GLcontext *ctx ) |
||
82 | { |
||
83 | struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; |
||
84 | struct gl_client_array *to = &SWSETUP_CONTEXT(ctx)->ChanSecondaryColor; |
||
85 | do_import( VB, to, VB->SecondaryColorPtr[0] ); |
||
86 | VB->SecondaryColorPtr[0] = to; |
||
87 | } |
||
88 | |||
89 | |||
90 | /* Provides a RasterSetup function which prebuilds vertices for the |
||
91 | * software rasterizer. This is required for the triangle functions |
||
92 | * in this module, but not the rest of the swrast module. |
||
93 | */ |
||
94 | |||
95 | |||
96 | #define COLOR 0x1 |
||
97 | #define INDEX 0x2 |
||
98 | #define TEX0 0x4 |
||
99 | #define MULTITEX 0x8 |
||
100 | #define SPEC 0x10 |
||
101 | #define FOG 0x20 |
||
102 | #define POINT 0x40 |
||
103 | #define MAX_SETUPFUNC 0x80 |
||
104 | |||
105 | static setup_func setup_tab[MAX_SETUPFUNC]; |
||
106 | static interp_func interp_tab[MAX_SETUPFUNC]; |
||
107 | static copy_pv_func copy_pv_tab[MAX_SETUPFUNC]; |
||
108 | |||
109 | |||
110 | #define IND (0) |
||
111 | #define TAG(x) x##_none |
||
112 | #include "ss_vbtmp.h" |
||
113 | |||
114 | #define IND (COLOR) |
||
115 | #define TAG(x) x##_color |
||
116 | #include "ss_vbtmp.h" |
||
117 | |||
118 | #define IND (COLOR|SPEC) |
||
119 | #define TAG(x) x##_color_spec |
||
120 | #include "ss_vbtmp.h" |
||
121 | |||
122 | #define IND (COLOR|FOG) |
||
123 | #define TAG(x) x##_color_fog |
||
124 | #include "ss_vbtmp.h" |
||
125 | |||
126 | #define IND (COLOR|SPEC|FOG) |
||
127 | #define TAG(x) x##_color_spec_fog |
||
128 | #include "ss_vbtmp.h" |
||
129 | |||
130 | #define IND (COLOR|TEX0) |
||
131 | #define TAG(x) x##_color_tex0 |
||
132 | #include "ss_vbtmp.h" |
||
133 | |||
134 | #define IND (COLOR|TEX0|SPEC) |
||
135 | #define TAG(x) x##_color_tex0_spec |
||
136 | #include "ss_vbtmp.h" |
||
137 | |||
138 | #define IND (COLOR|TEX0|FOG) |
||
139 | #define TAG(x) x##_color_tex0_fog |
||
140 | #include "ss_vbtmp.h" |
||
141 | |||
142 | #define IND (COLOR|TEX0|SPEC|FOG) |
||
143 | #define TAG(x) x##_color_tex0_spec_fog |
||
144 | #include "ss_vbtmp.h" |
||
145 | |||
146 | #define IND (COLOR|MULTITEX) |
||
147 | #define TAG(x) x##_color_multitex |
||
148 | #include "ss_vbtmp.h" |
||
149 | |||
150 | #define IND (COLOR|MULTITEX|SPEC) |
||
151 | #define TAG(x) x##_color_multitex_spec |
||
152 | #include "ss_vbtmp.h" |
||
153 | |||
154 | #define IND (COLOR|MULTITEX|FOG) |
||
155 | #define TAG(x) x##_color_multitex_fog |
||
156 | #include "ss_vbtmp.h" |
||
157 | |||
158 | #define IND (COLOR|MULTITEX|SPEC|FOG) |
||
159 | #define TAG(x) x##_color_multitex_spec_fog |
||
160 | #include "ss_vbtmp.h" |
||
161 | |||
162 | #define IND (COLOR|POINT) |
||
163 | #define TAG(x) x##_color_point |
||
164 | #include "ss_vbtmp.h" |
||
165 | |||
166 | #define IND (COLOR|SPEC|POINT) |
||
167 | #define TAG(x) x##_color_spec_point |
||
168 | #include "ss_vbtmp.h" |
||
169 | |||
170 | #define IND (COLOR|FOG|POINT) |
||
171 | #define TAG(x) x##_color_fog_point |
||
172 | #include "ss_vbtmp.h" |
||
173 | |||
174 | #define IND (COLOR|SPEC|FOG|POINT) |
||
175 | #define TAG(x) x##_color_spec_fog_point |
||
176 | #include "ss_vbtmp.h" |
||
177 | |||
178 | #define IND (COLOR|TEX0|POINT) |
||
179 | #define TAG(x) x##_color_tex0_point |
||
180 | #include "ss_vbtmp.h" |
||
181 | |||
182 | #define IND (COLOR|TEX0|SPEC|POINT) |
||
183 | #define TAG(x) x##_color_tex0_spec_point |
||
184 | #include "ss_vbtmp.h" |
||
185 | |||
186 | #define IND (COLOR|TEX0|FOG|POINT) |
||
187 | #define TAG(x) x##_color_tex0_fog_point |
||
188 | #include "ss_vbtmp.h" |
||
189 | |||
190 | #define IND (COLOR|TEX0|SPEC|FOG|POINT) |
||
191 | #define TAG(x) x##_color_tex0_spec_fog_point |
||
192 | #include "ss_vbtmp.h" |
||
193 | |||
194 | #define IND (COLOR|MULTITEX|POINT) |
||
195 | #define TAG(x) x##_color_multitex_point |
||
196 | #include "ss_vbtmp.h" |
||
197 | |||
198 | #define IND (COLOR|MULTITEX|SPEC|POINT) |
||
199 | #define TAG(x) x##_color_multitex_spec_point |
||
200 | #include "ss_vbtmp.h" |
||
201 | |||
202 | #define IND (COLOR|MULTITEX|FOG|POINT) |
||
203 | #define TAG(x) x##_color_multitex_fog_point |
||
204 | #include "ss_vbtmp.h" |
||
205 | |||
206 | #define IND (COLOR|MULTITEX|SPEC|FOG|POINT) |
||
207 | #define TAG(x) x##_color_multitex_spec_fog_point |
||
208 | #include "ss_vbtmp.h" |
||
209 | |||
210 | #define IND (INDEX) |
||
211 | #define TAG(x) x##_index |
||
212 | #include "ss_vbtmp.h" |
||
213 | |||
214 | #define IND (INDEX|FOG) |
||
215 | #define TAG(x) x##_index_fog |
||
216 | #include "ss_vbtmp.h" |
||
217 | |||
218 | #define IND (INDEX|POINT) |
||
219 | #define TAG(x) x##_index_point |
||
220 | #include "ss_vbtmp.h" |
||
221 | |||
222 | #define IND (INDEX|FOG|POINT) |
||
223 | #define TAG(x) x##_index_fog_point |
||
224 | #include "ss_vbtmp.h" |
||
225 | |||
226 | |||
227 | /*********************************************************************** |
||
228 | * Additional setup and interp for back color and edgeflag. |
||
229 | ***********************************************************************/ |
||
230 | |||
231 | #define GET_COLOR(ptr, idx) (((GLchan (*)[4])((ptr)->Ptr))[idx]) |
||
232 | |||
233 | static void interp_extras( GLcontext *ctx, |
||
234 | GLfloat t, |
||
235 | GLuint dst, GLuint out, GLuint in, |
||
236 | GLboolean force_boundary ) |
||
237 | { |
||
238 | struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; |
||
239 | |||
240 | if (VB->ColorPtr[1]) { |
||
241 | INTERP_4CHAN( t, |
||
242 | GET_COLOR(VB->ColorPtr[1], dst), |
||
243 | GET_COLOR(VB->ColorPtr[1], out), |
||
244 | GET_COLOR(VB->ColorPtr[1], in) ); |
||
245 | |||
246 | if (VB->SecondaryColorPtr[1]) { |
||
247 | INTERP_3CHAN( t, |
||
248 | GET_COLOR(VB->SecondaryColorPtr[1], dst), |
||
249 | GET_COLOR(VB->SecondaryColorPtr[1], out), |
||
250 | GET_COLOR(VB->SecondaryColorPtr[1], in) ); |
||
251 | } |
||
252 | } |
||
253 | else if (VB->IndexPtr[1]) { |
||
254 | VB->IndexPtr[1]->data[dst] = (GLuint) (GLint) |
||
255 | LINTERP( t, |
||
256 | (GLfloat) VB->IndexPtr[1]->data[out], |
||
257 | (GLfloat) VB->IndexPtr[1]->data[in] ); |
||
258 | } |
||
259 | |||
260 | if (VB->EdgeFlag) { |
||
261 | VB->EdgeFlag[dst] = VB->EdgeFlag[out] || force_boundary; |
||
262 | } |
||
263 | |||
264 | interp_tab[SWSETUP_CONTEXT(ctx)->SetupIndex](ctx, t, dst, out, in, |
||
265 | force_boundary); |
||
266 | } |
||
267 | |||
268 | static void copy_pv_extras( GLcontext *ctx, GLuint dst, GLuint src ) |
||
269 | { |
||
270 | struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; |
||
271 | |||
272 | if (VB->ColorPtr[1]) { |
||
273 | COPY_CHAN4( GET_COLOR(VB->ColorPtr[1], dst), |
||
274 | GET_COLOR(VB->ColorPtr[1], src) ); |
||
275 | |||
276 | if (VB->SecondaryColorPtr[1]) { |
||
277 | COPY_3V( GET_COLOR(VB->SecondaryColorPtr[1], dst), |
||
278 | GET_COLOR(VB->SecondaryColorPtr[1], src) ); |
||
279 | } |
||
280 | } |
||
281 | else if (VB->IndexPtr[1]) { |
||
282 | VB->IndexPtr[1]->data[dst] = VB->IndexPtr[1]->data[src]; |
||
283 | } |
||
284 | |||
285 | copy_pv_tab[SWSETUP_CONTEXT(ctx)->SetupIndex](ctx, dst, src); |
||
286 | } |
||
287 | |||
288 | |||
289 | |||
290 | |||
291 | /*********************************************************************** |
||
292 | * Initialization |
||
293 | ***********************************************************************/ |
||
294 | |||
295 | static void |
||
296 | emit_invalid( GLcontext *ctx, GLuint start, GLuint end, GLuint newinputs ) |
||
297 | { |
||
298 | _mesa_debug(ctx, "swrast_setup: invalid setup function\n"); |
||
299 | (void) (ctx && start && end && newinputs); |
||
300 | } |
||
301 | |||
302 | |||
303 | static void |
||
304 | interp_invalid( GLcontext *ctx, GLfloat t, |
||
305 | GLuint edst, GLuint eout, GLuint ein, |
||
306 | GLboolean force_boundary ) |
||
307 | { |
||
308 | _mesa_debug(ctx, "swrast_setup: invalid interp function\n"); |
||
309 | (void) (ctx && t && edst && eout && ein && force_boundary); |
||
310 | } |
||
311 | |||
312 | |||
313 | static void |
||
314 | copy_pv_invalid( GLcontext *ctx, GLuint edst, GLuint esrc ) |
||
315 | { |
||
316 | _mesa_debug(ctx, "swrast_setup: invalid copy_pv function\n"); |
||
317 | (void) (ctx && edst && esrc ); |
||
318 | } |
||
319 | |||
320 | |||
321 | static void init_standard( void ) |
||
322 | { |
||
323 | GLuint i; |
||
324 | |||
325 | for (i = 0 ; i < Elements(setup_tab) ; i++) { |
||
326 | setup_tab[i] = emit_invalid; |
||
327 | interp_tab[i] = interp_invalid; |
||
328 | copy_pv_tab[i] = copy_pv_invalid; |
||
329 | } |
||
330 | |||
331 | init_none(); |
||
332 | init_color(); |
||
333 | init_color_spec(); |
||
334 | init_color_fog(); |
||
335 | init_color_spec_fog(); |
||
336 | init_color_tex0(); |
||
337 | init_color_tex0_spec(); |
||
338 | init_color_tex0_fog(); |
||
339 | init_color_tex0_spec_fog(); |
||
340 | init_color_multitex(); |
||
341 | init_color_multitex_spec(); |
||
342 | init_color_multitex_fog(); |
||
343 | init_color_multitex_spec_fog(); |
||
344 | init_color_point(); |
||
345 | init_color_spec_point(); |
||
346 | init_color_fog_point(); |
||
347 | init_color_spec_fog_point(); |
||
348 | init_color_tex0_point(); |
||
349 | init_color_tex0_spec_point(); |
||
350 | init_color_tex0_fog_point(); |
||
351 | init_color_tex0_spec_fog_point(); |
||
352 | init_color_multitex_point(); |
||
353 | init_color_multitex_spec_point(); |
||
354 | init_color_multitex_fog_point(); |
||
355 | init_color_multitex_spec_fog_point(); |
||
356 | init_index(); |
||
357 | init_index_fog(); |
||
358 | init_index_point(); |
||
359 | init_index_fog_point(); |
||
360 | } |
||
361 | |||
362 | |||
363 | /* debug only */ |
||
364 | #if 0 |
||
365 | static void |
||
366 | printSetupFlags(const GLcontext *ctx, char *msg, GLuint flags ) |
||
367 | { |
||
368 | _mesa_debug(ctx, "%s(%x): %s%s%s%s%s%s%s\n", |
||
369 | msg, |
||
370 | (int) flags, |
||
371 | (flags & COLOR) ? "color, " : "", |
||
372 | (flags & INDEX) ? "index, " : "", |
||
373 | (flags & TEX0) ? "tex0, " : "", |
||
374 | (flags & MULTITEX) ? "multitex, " : "", |
||
375 | (flags & SPEC) ? "spec, " : "", |
||
376 | (flags & FOG) ? "fog, " : "", |
||
377 | (flags & POINT) ? "point, " : ""); |
||
378 | } |
||
379 | #endif |
||
380 | |||
381 | void |
||
382 | _swsetup_choose_rastersetup_func(GLcontext *ctx) |
||
383 | { |
||
384 | SScontext *swsetup = SWSETUP_CONTEXT(ctx); |
||
385 | TNLcontext *tnl = TNL_CONTEXT(ctx); |
||
386 | int funcindex = 0; |
||
387 | |||
388 | if (ctx->RenderMode == GL_RENDER) { |
||
389 | if (ctx->Visual.rgbMode) { |
||
390 | funcindex = COLOR; |
||
391 | |||
392 | if (ctx->Texture._EnabledUnits > 1) |
||
393 | funcindex |= MULTITEX; /* a unit above unit[0] is enabled */ |
||
394 | else if (ctx->Texture._EnabledUnits == 1) |
||
395 | funcindex |= TEX0; /* only unit 0 is enabled */ |
||
396 | |||
397 | if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) |
||
398 | funcindex |= SPEC; |
||
399 | } |
||
400 | else { |
||
401 | funcindex = INDEX; |
||
402 | } |
||
403 | |||
404 | if (ctx->Point._Attenuated || |
||
405 | (ctx->VertexProgram.Enabled && ctx->VertexProgram.PointSizeEnabled)) |
||
406 | funcindex |= POINT; |
||
407 | |||
408 | if (ctx->Fog.Enabled) |
||
409 | funcindex |= FOG; |
||
410 | } |
||
411 | else if (ctx->RenderMode == GL_FEEDBACK) { |
||
412 | if (ctx->Visual.rgbMode) |
||
413 | funcindex = (COLOR | TEX0); /* is feedback color subject to fogging? */ |
||
414 | else |
||
415 | funcindex = INDEX; |
||
416 | } |
||
417 | else |
||
418 | funcindex = 0; |
||
419 | |||
420 | swsetup->SetupIndex = funcindex; |
||
421 | tnl->Driver.Render.BuildVertices = setup_tab[funcindex]; |
||
422 | |||
423 | if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) { |
||
424 | tnl->Driver.Render.Interp = interp_extras; |
||
425 | tnl->Driver.Render.CopyPV = copy_pv_extras; |
||
426 | } |
||
427 | else { |
||
428 | tnl->Driver.Render.Interp = interp_tab[funcindex]; |
||
429 | tnl->Driver.Render.CopyPV = copy_pv_tab[funcindex]; |
||
430 | } |
||
431 | |||
432 | ASSERT(tnl->Driver.Render.BuildVertices); |
||
433 | ASSERT(tnl->Driver.Render.BuildVertices != emit_invalid); |
||
434 | } |
||
435 | |||
436 | |||
437 | void |
||
438 | _swsetup_vb_init( GLcontext *ctx ) |
||
439 | { |
||
440 | (void) ctx; |
||
441 | init_standard(); |
||
442 | /* |
||
443 | printSetupFlags(ctx); |
||
444 | */ |
||
445 | } |
||
446 |