comment reorg.
[mesa.git] / src / mesa / drivers / glide / fxsetup.h
1 /*
2 * Mesa 3-D graphics library
3 * Version: 4.0
4 *
5 * Copyright (C) 1999-2001 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
25 /* Authors:
26 * David Bucciarelli
27 * Brian Paul
28 * Daryll Strauss
29 * Keith Whitwell
30 * Daniel Borca
31 * Hiroshi Morii
32 */
33
34 /* fxsetup.c - 3Dfx VooDoo rendering mode setup functions */
35 /* This code belongs to fxsetup.c, but I didn't want to clutter
36 * the original code with Napalm specifics, in order to keep things
37 * clear -- especially for backward compatibility. I should have
38 * put it into another .c file, but I didn't want to export so many
39 * things...
40 * The point is, Napalm uses a different technique for texture env.
41 * SST1 Single texturing:
42 * setup standard grTexCombine
43 * fiddle with grColorCombine/grAlphaCombine
44 * SST1 Multi texturing:
45 * fiddle with grTexCombine/grColorCombine/grAlphaCombine
46 * Napalm Single texturing:
47 * setup standard grColorCombineExt/grAlphaCombineExt
48 * fiddle with grTexColorCombine/grTexAlphaCombine
49 * Napalm Multi texturing:
50 * setup standard grColorCombineExt/grAlphaCombineExt
51 * fiddle with grTexColorCombine/grTexAlphaCombine
52 */
53
54 /*
55 * These macros are used below when handling COMBINE_EXT.
56 */
57 #define TEXENV_OPERAND_INVERTED(operand) \
58 (((operand) == GL_ONE_MINUS_SRC_ALPHA) \
59 || ((operand) == GL_ONE_MINUS_SRC_COLOR))
60 #define TEXENV_OPERAND_ALPHA(operand) \
61 (((operand) == GL_SRC_ALPHA) || ((operand) == GL_ONE_MINUS_SRC_ALPHA))
62 #define TEXENV_SETUP_ARG_A(param, source, operand, iteratedAlpha) \
63 switch (source) { \
64 case GL_TEXTURE: \
65 param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \
66 break; \
67 case GL_CONSTANT_EXT: \
68 param = GR_CMBX_TMU_CALPHA; \
69 break; \
70 case GL_PRIMARY_COLOR_EXT: \
71 param = GR_CMBX_ITALPHA; \
72 break; \
73 case GL_PREVIOUS_EXT: \
74 param = iteratedAlpha; \
75 break; \
76 default: \
77 /* \
78 * This is here just to keep from getting \
79 * compiler warnings. \
80 */ \
81 param = GR_CMBX_ZERO; \
82 break; \
83 }
84
85 #define TEXENV_SETUP_ARG_RGB(param, source, operand, iteratedColor, iteratedAlpha) \
86 if (!TEXENV_OPERAND_ALPHA(operand)) { \
87 switch (source) { \
88 case GL_TEXTURE: \
89 param = GR_CMBX_LOCAL_TEXTURE_RGB; \
90 break; \
91 case GL_CONSTANT_EXT: \
92 param = GR_CMBX_TMU_CCOLOR; \
93 break; \
94 case GL_PRIMARY_COLOR_EXT: \
95 param = GR_CMBX_ITRGB; \
96 break; \
97 case GL_PREVIOUS_EXT: \
98 param = iteratedColor; \
99 break; \
100 default: \
101 /* \
102 * This is here just to keep from getting \
103 * compiler warnings. \
104 */ \
105 param = GR_CMBX_ZERO; \
106 break; \
107 } \
108 } else { \
109 switch (source) { \
110 case GL_TEXTURE: \
111 param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \
112 break; \
113 case GL_CONSTANT_EXT: \
114 param = GR_CMBX_TMU_CALPHA; \
115 break; \
116 case GL_PRIMARY_COLOR_EXT: \
117 param = GR_CMBX_ITALPHA; \
118 break; \
119 case GL_PREVIOUS_EXT: \
120 param = iteratedAlpha; \
121 break; \
122 default: \
123 /* \
124 * This is here just to keep from getting \
125 * compiler warnings. \
126 */ \
127 param = GR_CMBX_ZERO; \
128 break; \
129 } \
130 }
131
132 #define TEXENV_SETUP_MODE_RGB(param, operand) \
133 switch (operand) { \
134 case GL_SRC_COLOR: \
135 case GL_SRC_ALPHA: \
136 param = GR_FUNC_MODE_X; \
137 break; \
138 case GL_ONE_MINUS_SRC_ALPHA: \
139 case GL_ONE_MINUS_SRC_COLOR: \
140 param = GR_FUNC_MODE_ONE_MINUS_X; \
141 break; \
142 default: \
143 param = GR_FUNC_MODE_ZERO; \
144 break; \
145 }
146
147 #define TEXENV_SETUP_MODE_A(param, operand) \
148 switch (operand) { \
149 case GL_SRC_ALPHA: \
150 param = GR_FUNC_MODE_X; \
151 break; \
152 case GL_ONE_MINUS_SRC_ALPHA: \
153 param = GR_FUNC_MODE_ONE_MINUS_X; \
154 break; \
155 default: \
156 param = GR_FUNC_MODE_ZERO; \
157 break; \
158 }
159
160 static void
161 fxSetupTextureEnvNapalm_NoLock(GLcontext * ctx, GLuint textureset, GLuint tmu, GLboolean iterated)
162 {
163 fxMesaContext fxMesa = FX_CONTEXT(ctx);
164 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[textureset];
165 struct tdfx_combine_alpha_ext alphaComb;
166 struct tdfx_combine_color_ext colorComb;
167 const GLfloat *envColor = texUnit->EnvColor;
168 GrCombineLocal_t localc, locala; /* fragmentColor/Alpha */
169 GLint ifmt;
170 tfxTexInfo *ti;
171 struct gl_texture_object *tObj = texUnit->_Current;
172
173 if (TDFX_DEBUG & VERBOSE_DRIVER) {
174 fprintf(stderr, "fxSetupTextureEnvNapalm_NoLock(unit %u, TMU %u, iterated %d)\n",
175 textureset, tmu, iterated);
176 }
177
178 ti = fxTMGetTexInfo(tObj);
179
180 ifmt = ti->baseLevelInternalFormat;
181
182 if (iterated) {
183 /* we don't have upstream TMU */
184 locala = GR_CMBX_ITALPHA;
185 localc = GR_CMBX_ITRGB;
186 } else {
187 /* we have upstream TMU */
188 locala = GR_CMBX_OTHER_TEXTURE_ALPHA;
189 localc = GR_CMBX_OTHER_TEXTURE_RGB;
190 }
191
192 alphaComb.InvertD = FXFALSE;
193 alphaComb.Shift = 0;
194 alphaComb.Invert = FXFALSE;
195 colorComb.InvertD = FXFALSE;
196 colorComb.Shift = 0;
197 colorComb.Invert = FXFALSE;
198
199 switch (texUnit->EnvMode) {
200 case GL_DECAL:
201 alphaComb.SourceA = locala;
202 alphaComb.ModeA = GR_FUNC_MODE_X;
203 alphaComb.SourceB = GR_CMBX_ZERO;
204 alphaComb.ModeB = GR_FUNC_MODE_X;
205 alphaComb.SourceC = GR_CMBX_ZERO;
206 alphaComb.InvertC = FXTRUE;
207 alphaComb.SourceD = GR_CMBX_ZERO;
208
209 colorComb.SourceA = GR_CMBX_LOCAL_TEXTURE_RGB;
210 colorComb.ModeA = GR_FUNC_MODE_X;
211 colorComb.SourceB = localc;
212 colorComb.ModeB = GR_FUNC_MODE_NEGATIVE_X;
213 colorComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA;
214 colorComb.InvertC = FXFALSE;
215 colorComb.SourceD = GR_CMBX_B;
216 break;
217 case GL_MODULATE:
218 if (ifmt == GL_LUMINANCE || ifmt == GL_RGB) {
219 alphaComb.SourceA = locala;
220 alphaComb.ModeA = GR_FUNC_MODE_X;
221 alphaComb.SourceB = GR_CMBX_ZERO;
222 alphaComb.ModeB = GR_FUNC_MODE_X;
223 alphaComb.SourceC = GR_CMBX_ZERO;
224 alphaComb.InvertC = FXTRUE;
225 alphaComb.SourceD = GR_CMBX_ZERO;
226 } else {
227 alphaComb.SourceA = locala;
228 alphaComb.ModeA = GR_FUNC_MODE_X;
229 alphaComb.SourceB = GR_CMBX_ZERO;
230 alphaComb.ModeB = GR_FUNC_MODE_X;
231 alphaComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA;
232 alphaComb.InvertC = FXFALSE;
233 alphaComb.SourceD = GR_CMBX_ZERO;
234 }
235
236 if (ifmt == GL_ALPHA) {
237 colorComb.SourceA = localc;
238 colorComb.ModeA = GR_FUNC_MODE_X;
239 colorComb.SourceB = GR_CMBX_ZERO;
240 colorComb.ModeB = GR_FUNC_MODE_X;
241 colorComb.SourceC = GR_CMBX_ZERO;
242 colorComb.InvertC = FXTRUE;
243 colorComb.SourceD = GR_CMBX_ZERO;
244 } else {
245 colorComb.SourceA = localc;
246 colorComb.ModeA = GR_FUNC_MODE_X;
247 colorComb.SourceB = GR_CMBX_ZERO;
248 colorComb.ModeB = GR_FUNC_MODE_X;
249 colorComb.SourceC = GR_CMBX_LOCAL_TEXTURE_RGB;
250 colorComb.InvertC = FXFALSE;
251 colorComb.SourceD = GR_CMBX_ZERO;
252 }
253 break;
254 case GL_BLEND:
255 if (ifmt == GL_INTENSITY) {
256 alphaComb.SourceA = GR_CMBX_TMU_CALPHA;
257 alphaComb.ModeA = GR_FUNC_MODE_X;
258 alphaComb.SourceB = locala;
259 alphaComb.ModeB = GR_FUNC_MODE_X;
260 alphaComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA;
261 alphaComb.InvertC = FXFALSE;
262 alphaComb.SourceD = GR_CMBX_ZERO;
263 } else {
264 alphaComb.SourceA = locala;
265 alphaComb.ModeA = GR_FUNC_MODE_X;
266 alphaComb.SourceB = GR_CMBX_ZERO;
267 alphaComb.ModeB = GR_FUNC_MODE_X;
268 alphaComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA;
269 alphaComb.InvertC = FXFALSE;
270 alphaComb.SourceD = GR_CMBX_ZERO;
271 }
272
273 if (ifmt == GL_ALPHA) {
274 colorComb.SourceA = localc;
275 colorComb.ModeA = GR_FUNC_MODE_X;
276 colorComb.SourceB = GR_CMBX_ZERO;
277 colorComb.ModeB = GR_FUNC_MODE_X;
278 colorComb.SourceC = GR_CMBX_ZERO;
279 colorComb.InvertC = FXTRUE;
280 colorComb.SourceD = GR_CMBX_ZERO;
281 } else {
282 colorComb.SourceA = GR_CMBX_TMU_CCOLOR;
283 colorComb.ModeA = GR_FUNC_MODE_X;
284 colorComb.SourceB = localc;
285 colorComb.ModeB = GR_FUNC_MODE_NEGATIVE_X;
286 colorComb.SourceC = GR_CMBX_LOCAL_TEXTURE_RGB;
287 colorComb.InvertC = FXFALSE;
288 colorComb.SourceD = GR_CMBX_B;
289 }
290
291 fxMesa->Glide.grConstantColorValueExt(tmu,
292 (((GLuint)(envColor[0] * 255.0f)) ) |
293 (((GLuint)(envColor[1] * 255.0f)) << 8) |
294 (((GLuint)(envColor[2] * 255.0f)) << 16) |
295 (((GLuint)(envColor[3] * 255.0f)) << 24));
296 break;
297 case GL_REPLACE:
298 if (ifmt == GL_LUMINANCE || ifmt == GL_RGB) {
299 alphaComb.SourceA = locala;
300 alphaComb.ModeA = GR_FUNC_MODE_X;
301 alphaComb.SourceB = GR_CMBX_ZERO;
302 alphaComb.ModeB = GR_FUNC_MODE_X;
303 alphaComb.SourceC = GR_CMBX_ZERO;
304 alphaComb.InvertC = FXTRUE;
305 alphaComb.SourceD = GR_CMBX_ZERO;
306 } else {
307 alphaComb.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA;
308 alphaComb.ModeA = GR_FUNC_MODE_X;
309 alphaComb.SourceB = GR_CMBX_ZERO;
310 alphaComb.ModeB = GR_FUNC_MODE_X;
311 alphaComb.SourceC = GR_CMBX_ZERO;
312 alphaComb.InvertC = FXTRUE;
313 alphaComb.SourceD = GR_CMBX_ZERO;
314 }
315
316 if (ifmt == GL_ALPHA) {
317 colorComb.SourceA = localc;
318 colorComb.ModeA = GR_FUNC_MODE_X;
319 colorComb.SourceB = GR_CMBX_ZERO;
320 colorComb.ModeB = GR_FUNC_MODE_X;
321 colorComb.SourceC = GR_CMBX_ZERO;
322 colorComb.InvertC = FXTRUE;
323 colorComb.SourceD = GR_CMBX_ZERO;
324 } else {
325 colorComb.SourceA = GR_CMBX_LOCAL_TEXTURE_RGB;
326 colorComb.ModeA = GR_FUNC_MODE_X;
327 colorComb.SourceB = GR_CMBX_ZERO;
328 colorComb.ModeB = GR_FUNC_MODE_X;
329 colorComb.SourceC = GR_CMBX_ZERO;
330 colorComb.InvertC = FXTRUE;
331 colorComb.SourceD = GR_CMBX_ZERO;
332 }
333 break;
334 case GL_ADD:
335 if (ifmt == GL_LUMINANCE || ifmt == GL_RGB) {
336 alphaComb.SourceA = locala;
337 alphaComb.ModeA = GR_FUNC_MODE_X;
338 alphaComb.SourceB = GR_CMBX_ZERO;
339 alphaComb.ModeB = GR_FUNC_MODE_X;
340 alphaComb.SourceC = GR_CMBX_ZERO;
341 alphaComb.InvertC = FXTRUE;
342 alphaComb.SourceD = GR_CMBX_ZERO;
343 } else if (ifmt == GL_INTENSITY) {
344 alphaComb.SourceA = locala;
345 alphaComb.ModeA = GR_FUNC_MODE_X;
346 alphaComb.SourceB = GR_CMBX_LOCAL_TEXTURE_ALPHA;
347 alphaComb.ModeB = GR_FUNC_MODE_X;
348 alphaComb.SourceC = GR_CMBX_ZERO;
349 alphaComb.InvertC = FXTRUE;
350 alphaComb.SourceD = GR_CMBX_ZERO;
351 } else {
352 alphaComb.SourceA = locala;
353 alphaComb.ModeA = GR_FUNC_MODE_X;
354 alphaComb.SourceB = GR_CMBX_ZERO;
355 alphaComb.ModeB = GR_FUNC_MODE_X;
356 alphaComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA;
357 alphaComb.InvertC = FXFALSE;
358 alphaComb.SourceD = GR_CMBX_ZERO;
359 }
360
361 if (ifmt == GL_ALPHA) {
362 colorComb.SourceA = localc;
363 colorComb.ModeA = GR_FUNC_MODE_X;
364 colorComb.SourceB = GR_CMBX_ZERO;
365 colorComb.ModeB = GR_FUNC_MODE_X;
366 colorComb.SourceC = GR_CMBX_ZERO;
367 colorComb.InvertC = FXTRUE;
368 colorComb.SourceD = GR_CMBX_ZERO;
369 } else {
370 colorComb.SourceA = localc;
371 colorComb.ModeA = GR_FUNC_MODE_X;
372 colorComb.SourceB = GR_CMBX_LOCAL_TEXTURE_RGB;
373 colorComb.ModeB = GR_FUNC_MODE_X;
374 colorComb.SourceC = GR_CMBX_ZERO;
375 colorComb.InvertC = FXTRUE;
376 colorComb.SourceD = GR_CMBX_ZERO;
377 }
378 break;
379 /* COMBINE_EXT */
380 case GL_COMBINE_EXT:
381 /* XXX todo - INCOMPLETE!!! */
382 if (TDFX_DEBUG & (VERBOSE_DRIVER | VERBOSE_TEXTURE)) {
383 #if 1
384 fprintf(stderr, "COMBINE_EXT: %s + %s\n",
385 _mesa_lookup_enum_by_nr(texUnit->Combine.ModeRGB),
386 _mesa_lookup_enum_by_nr(texUnit->Combine.ModeA));
387 #else
388 fprintf(stderr, "Texture Unit %d\n", textureset);
389 fprintf(stderr, " GL_TEXTURE_ENV_MODE = %s\n", _mesa_lookup_enum_by_nr(texUnit->EnvMode));
390 fprintf(stderr, " GL_COMBINE_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.ModeRGB));
391 fprintf(stderr, " GL_COMBINE_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.ModeA));
392 fprintf(stderr, " GL_SOURCE0_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceRGB[0]));
393 fprintf(stderr, " GL_SOURCE1_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceRGB[1]));
394 fprintf(stderr, " GL_SOURCE2_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceRGB[2]));
395 fprintf(stderr, " GL_SOURCE0_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceA[0]));
396 fprintf(stderr, " GL_SOURCE1_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceA[1]));
397 fprintf(stderr, " GL_SOURCE2_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceA[2]));
398 fprintf(stderr, " GL_OPERAND0_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandRGB[0]));
399 fprintf(stderr, " GL_OPERAND1_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandRGB[1]));
400 fprintf(stderr, " GL_OPERAND2_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandRGB[2]));
401 fprintf(stderr, " GL_OPERAND0_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandA[0]));
402 fprintf(stderr, " GL_OPERAND1_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandA[1]));
403 fprintf(stderr, " GL_OPERAND2_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandA[2]));
404 fprintf(stderr, " GL_RGB_SCALE = %d\n", 1 << texUnit->Combine.ScaleShiftRGB);
405 fprintf(stderr, " GL_ALPHA_SCALE = %d\n", 1 << texUnit->Combine.ScaleShiftA);
406 fprintf(stderr, " GL_TEXTURE_ENV_COLOR = (%f, %f, %f, %f)\n", envColor[0], envColor[1], envColor[2], envColor[3]);
407 #endif
408 }
409
410 alphaComb.Shift = texUnit->Combine.ScaleShiftA;
411 colorComb.Shift = texUnit->Combine.ScaleShiftRGB;
412
413 switch (texUnit->Combine.ModeRGB) {
414 case GL_MODULATE:
415 /* Arg0 * Arg1 == (A + 0) * C + 0 */
416 TEXENV_SETUP_ARG_RGB(colorComb.SourceA,
417 texUnit->Combine.SourceRGB[0],
418 texUnit->Combine.OperandRGB[0],
419 localc, locala);
420 TEXENV_SETUP_MODE_RGB(colorComb.ModeA,
421 texUnit->Combine.OperandRGB[0]);
422 colorComb.SourceB = GR_CMBX_ZERO;
423 colorComb.ModeB = GR_FUNC_MODE_ZERO;
424 TEXENV_SETUP_ARG_RGB(colorComb.SourceC,
425 texUnit->Combine.SourceRGB[1],
426 texUnit->Combine.OperandRGB[1],
427 localc, locala);
428 colorComb.InvertC = TEXENV_OPERAND_INVERTED(
429 texUnit->Combine.OperandRGB[1]);
430 colorComb.SourceD = GR_CMBX_ZERO;
431 break;
432 case GL_REPLACE:
433 /* Arg0 == (A + 0) * 1 + 0 */
434 TEXENV_SETUP_ARG_RGB(colorComb.SourceA,
435 texUnit->Combine.SourceRGB[0],
436 texUnit->Combine.OperandRGB[0],
437 localc, locala);
438 TEXENV_SETUP_MODE_RGB(colorComb.ModeA,
439 texUnit->Combine.OperandRGB[0]);
440 colorComb.SourceB = GR_CMBX_ZERO;
441 colorComb.ModeB = GR_FUNC_MODE_ZERO;
442 colorComb.SourceC = GR_CMBX_ZERO;
443 colorComb.InvertC = FXTRUE;
444 colorComb.SourceD = GR_CMBX_ZERO;
445 break;
446 case GL_ADD:
447 /* Arg0 + Arg1 = (A + B) * 1 + 0 */
448 TEXENV_SETUP_ARG_RGB(colorComb.SourceA,
449 texUnit->Combine.SourceRGB[0],
450 texUnit->Combine.OperandRGB[0],
451 localc, locala);
452 TEXENV_SETUP_MODE_RGB(colorComb.ModeA,
453 texUnit->Combine.OperandRGB[0]);
454 TEXENV_SETUP_ARG_RGB(colorComb.SourceB,
455 texUnit->Combine.SourceRGB[1],
456 texUnit->Combine.OperandRGB[1],
457 localc, locala);
458 TEXENV_SETUP_MODE_RGB(colorComb.ModeB,
459 texUnit->Combine.OperandRGB[1]);
460 colorComb.SourceC = GR_CMBX_ZERO;
461 colorComb.InvertC = FXTRUE;
462 colorComb.SourceD = GR_CMBX_ZERO;
463 break;
464 case GL_INTERPOLATE_EXT:
465 /* Arg0 * Arg2 + Arg1 * (1 - Arg2) ==
466 * (Arg0 - Arg1) * Arg2 + Arg1 == (A - B) * C + D
467 */
468 TEXENV_SETUP_ARG_RGB(colorComb.SourceA,
469 texUnit->Combine.SourceRGB[0],
470 texUnit->Combine.OperandRGB[0],
471 localc, locala);
472 TEXENV_SETUP_MODE_RGB(colorComb.ModeA,
473 texUnit->Combine.OperandRGB[0]);
474 TEXENV_SETUP_ARG_RGB(colorComb.SourceB,
475 texUnit->Combine.SourceRGB[1],
476 texUnit->Combine.OperandRGB[1],
477 localc, locala);
478 if (TEXENV_OPERAND_INVERTED(texUnit->Combine.OperandRGB[1])) {
479 /* Hack alert!!! This case is wrong!!! */
480 fprintf(stderr, "COMBINE_EXT_color: WRONG!!!\n");
481 colorComb.ModeB = GR_FUNC_MODE_NEGATIVE_X;
482 } else {
483 colorComb.ModeB = GR_FUNC_MODE_NEGATIVE_X;
484 }
485 /*
486 * The Source/Operand for the C value must
487 * specify some kind of alpha value.
488 */
489 TEXENV_SETUP_ARG_A(colorComb.SourceC,
490 texUnit->Combine.SourceRGB[2],
491 texUnit->Combine.OperandRGB[2],
492 locala);
493 colorComb.InvertC = FXFALSE;
494 colorComb.SourceD = GR_CMBX_B;
495 break;
496 default:
497 fprintf(stderr, "COMBINE_EXT_color: %s\n",
498 _mesa_lookup_enum_by_nr(texUnit->Combine.ModeRGB));
499 }
500
501 switch (texUnit->Combine.ModeA) {
502 case GL_MODULATE:
503 /* Arg0 * Arg1 == (A + 0) * C + 0 */
504 TEXENV_SETUP_ARG_A(alphaComb.SourceA,
505 texUnit->Combine.SourceA[0],
506 texUnit->Combine.OperandA[0],
507 locala);
508 TEXENV_SETUP_MODE_A(alphaComb.ModeA,
509 texUnit->Combine.OperandA[0]);
510 alphaComb.SourceB = GR_CMBX_ZERO;
511 alphaComb.ModeB = GR_FUNC_MODE_ZERO;
512 TEXENV_SETUP_ARG_A(alphaComb.SourceC,
513 texUnit->Combine.SourceA[1],
514 texUnit->Combine.OperandA[1],
515 locala);
516 alphaComb.InvertC = TEXENV_OPERAND_INVERTED(
517 texUnit->Combine.OperandA[1]);
518 alphaComb.SourceD = GR_CMBX_ZERO;
519 break;
520 case GL_REPLACE:
521 /* Arg0 == (A + 0) * 1 + 0 */
522 TEXENV_SETUP_ARG_A(alphaComb.SourceA,
523 texUnit->Combine.SourceA[0],
524 texUnit->Combine.OperandA[0],
525 locala);
526 TEXENV_SETUP_MODE_A(alphaComb.ModeA,
527 texUnit->Combine.OperandA[0]);
528 alphaComb.SourceB = GR_CMBX_ZERO;
529 alphaComb.ModeB = GR_FUNC_MODE_ZERO;
530 alphaComb.SourceC = GR_CMBX_ZERO;
531 alphaComb.InvertC = FXTRUE;
532 alphaComb.SourceD = GR_CMBX_ZERO;
533 break;
534 case GL_ADD:
535 /* Arg0 + Arg1 = (A + B) * 1 + 0 */
536 TEXENV_SETUP_ARG_A(alphaComb.SourceA,
537 texUnit->Combine.SourceA[0],
538 texUnit->Combine.OperandA[0],
539 locala);
540 TEXENV_SETUP_MODE_A(alphaComb.ModeA,
541 texUnit->Combine.OperandA[0]);
542 TEXENV_SETUP_ARG_A(alphaComb.SourceB,
543 texUnit->Combine.SourceA[1],
544 texUnit->Combine.OperandA[1],
545 locala);
546 TEXENV_SETUP_MODE_A(alphaComb.ModeB,
547 texUnit->Combine.OperandA[1]);
548 alphaComb.SourceC = GR_CMBX_ZERO;
549 alphaComb.InvertC = FXTRUE;
550 alphaComb.SourceD = GR_CMBX_ZERO;
551 break;
552 default:
553 fprintf(stderr, "COMBINE_EXT_alpha: %s\n",
554 _mesa_lookup_enum_by_nr(texUnit->Combine.ModeA));
555 }
556
557 fxMesa->Glide.grConstantColorValueExt(tmu,
558 (((GLuint)(envColor[0] * 255.0f)) ) |
559 (((GLuint)(envColor[1] * 255.0f)) << 8) |
560 (((GLuint)(envColor[2] * 255.0f)) << 16) |
561 (((GLuint)(envColor[3] * 255.0f)) << 24));
562 break;
563 #if 0
564 {
565 FxU32 A_RGB, B_RGB, C_RGB, D_RGB;
566 FxU32 Amode_RGB, Bmode_RGB;
567 FxBool Cinv_RGB, Dinv_RGB, Ginv_RGB;
568 FxU32 Shift_RGB;
569 FxU32 A_A, B_A, C_A, D_A;
570 FxU32 Amode_A, Bmode_A;
571 FxBool Cinv_A, Dinv_A, Ginv_A;
572 FxU32 Shift_A;
573
574 /*
575 *
576 * In the formulas below, we write:
577 * o "1(x)" for the identity function applied to x,
578 * so 1(x) = x.
579 * o "0(x)" for the constant function 0, so
580 * 0(x) = 0 for all values of x.
581 *
582 * Calculate the color combination.
583 */
584 Shift_RGB = texUnit->CombineScaleShiftRGB;
585 Shift_A = texUnit->CombineScaleShiftA;
586 switch (texUnit->CombineModeRGB) {
587 case GL_REPLACE:
588 /*
589 * The formula is: Arg0
590 * We implement this by the formula:
591 * (Arg0 + 0(0))*(1-0) + 0
592 */
593 TEXENV_SETUP_ARG_RGB(A_RGB,
594 texUnit->CombineSourceRGB[0],
595 texUnit->CombineOperandRGB[0],
596 incomingRGB, incomingAlpha);
597 TEXENV_SETUP_MODE_RGB(Amode_RGB,
598 texUnit->CombineOperandRGB[0]);
599 B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO;
600 Bmode_RGB = GR_FUNC_MODE_ZERO;
601 Cinv_RGB = FXTRUE;
602 Dinv_RGB = Ginv_RGB = FXFALSE;
603 break;
604 case GL_MODULATE:
605 /*
606 * The formula is: Arg0 * Arg1
607 *
608 * We implement this by the formula
609 * (Arg0 + 0(0)) * Arg1 + 0(0)
610 */
611 TEXENV_SETUP_ARG_RGB(A_RGB,
612 texUnit->CombineSourceRGB[0],
613 texUnit->CombineOperandRGB[0],
614 incomingRGB, incomingAlpha);
615 TEXENV_SETUP_MODE_RGB(Amode_RGB,
616 texUnit->CombineOperandRGB[0]);
617 B_RGB = GR_CMBX_ZERO;
618 Bmode_RGB = GR_CMBX_ZERO;
619 TEXENV_SETUP_ARG_RGB(C_RGB,
620 texUnit->CombineSourceRGB[1],
621 texUnit->CombineOperandRGB[1],
622 incomingRGB, incomingAlpha);
623 Cinv_RGB = TEXENV_OPERAND_INVERTED
624 (texUnit->CombineOperandRGB[1]);
625 D_RGB = GR_CMBX_ZERO;
626 Dinv_RGB = Ginv_RGB = FXFALSE;
627 break;
628 case GL_ADD:
629 /*
630 * The formula is Arg0 + Arg1
631 */
632 TEXENV_SETUP_ARG_RGB(A_RGB,
633 texUnit->CombineSourceRGB[0],
634 texUnit->CombineOperandRGB[0],
635 incomingRGB, incomingAlpha);
636 TEXENV_SETUP_MODE_RGB(Amode_RGB,
637 texUnit->CombineOperandRGB[0]);
638 TEXENV_SETUP_ARG_RGB(B_RGB,
639 texUnit->CombineSourceRGB[1],
640 texUnit->CombineOperandRGB[1],
641 incomingRGB, incomingAlpha);
642 TEXENV_SETUP_MODE_RGB(Bmode_RGB,
643 texUnit->CombineOperandRGB[1]);
644 C_RGB = D_RGB = GR_CMBX_ZERO;
645 Cinv_RGB = FXTRUE;
646 Dinv_RGB = Ginv_RGB = FXFALSE;
647 break;
648 case GL_ADD_SIGNED_EXT:
649 /*
650 * The formula is: Arg0 + Arg1 - 0.5.
651 * We compute this by calculating:
652 * (Arg0 - 1/2) + Arg1 if op0 is SRC_{COLOR,ALPHA}
653 * Arg0 + (Arg1 - 1/2) if op1 is SRC_{COLOR,ALPHA}
654 * If both op0 and op1 are ONE_MINUS_SRC_{COLOR,ALPHA}
655 * we cannot implement the formula properly.
656 */
657 TEXENV_SETUP_ARG_RGB(A_RGB,
658 texUnit->CombineSourceRGB[0],
659 texUnit->CombineOperandRGB[0],
660 incomingRGB, incomingAlpha);
661 TEXENV_SETUP_ARG_RGB(B_RGB,
662 texUnit->CombineSourceRGB[1],
663 texUnit->CombineOperandRGB[1],
664 incomingRGB, incomingAlpha);
665 if (!TEXENV_OPERAND_INVERTED(texUnit->CombineOperandRGB[0])) {
666 /*
667 * A is not inverted. So, choose it.
668 */
669 Amode_RGB = GR_FUNC_MODE_X_MINUS_HALF;
670 if (!TEXENV_OPERAND_INVERTED
671 (texUnit->CombineOperandRGB[1])) {
672 Bmode_RGB = GR_FUNC_MODE_X;
673 }
674 else {
675 Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X;
676 }
677 }
678 else {
679 /*
680 * A is inverted, so try to subtract 1/2
681 * from B.
682 */
683 Amode_RGB = GR_FUNC_MODE_ONE_MINUS_X;
684 if (!TEXENV_OPERAND_INVERTED
685 (texUnit->CombineOperandRGB[1])) {
686 Bmode_RGB = GR_FUNC_MODE_X_MINUS_HALF;
687 }
688 else {
689 /*
690 * Both are inverted. This is the case
691 * we cannot handle properly. We just
692 * choose to not add the - 1/2.
693 */
694 Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X;
695 return GL_FALSE;
696 }
697 }
698 C_RGB = D_RGB = GR_CMBX_ZERO;
699 Cinv_RGB = FXTRUE;
700 Dinv_RGB = Ginv_RGB = FXFALSE;
701 break;
702 case GL_INTERPOLATE_EXT:
703 /*
704 * The formula is: Arg0 * Arg2 + Arg1 * (1 - Arg2).
705 * We compute this by the formula:
706 * (Arg0 - Arg1) * Arg2 + Arg1
707 * == Arg0 * Arg2 - Arg1 * Arg2 + Arg1
708 * == Arg0 * Arg2 + Arg1 * (1 - Arg2)
709 * However, if both Arg1 is ONE_MINUS_X, the HW does
710 * not support it properly.
711 */
712 TEXENV_SETUP_ARG_RGB(A_RGB,
713 texUnit->CombineSourceRGB[0],
714 texUnit->CombineOperandRGB[0],
715 incomingRGB, incomingAlpha);
716 TEXENV_SETUP_MODE_RGB(Amode_RGB,
717 texUnit->CombineOperandRGB[0]);
718 TEXENV_SETUP_ARG_RGB(B_RGB,
719 texUnit->CombineSourceRGB[1],
720 texUnit->CombineOperandRGB[1],
721 incomingRGB, incomingAlpha);
722 if (TEXENV_OPERAND_INVERTED(texUnit->CombineOperandRGB[1])) {
723 /*
724 * This case is wrong.
725 */
726 Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X;
727 return GL_FALSE;
728 }
729 else {
730 Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X;
731 }
732 /*
733 * The Source/Operand for the C value must
734 * specify some kind of alpha value.
735 */
736 TEXENV_SETUP_ARG_A(C_RGB,
737 texUnit->CombineSourceRGB[2],
738 texUnit->CombineOperandRGB[2],
739 incomingAlpha);
740 Cinv_RGB = FXFALSE;
741 D_RGB = GR_CMBX_B;
742 Dinv_RGB = Ginv_RGB = FXFALSE;
743 break;
744 default:
745 /*
746 * This is here mostly to keep from getting
747 * a compiler warning about these not being set.
748 * However, this should set all the texture values
749 * to zero.
750 */
751 A_RGB = B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO;
752 Amode_RGB = Bmode_RGB = GR_FUNC_MODE_X;
753 Cinv_RGB = Dinv_RGB = Ginv_RGB = FXFALSE;
754 break;
755 }
756 /*
757 * Calculate the alpha combination.
758 */
759 switch (texUnit->CombineModeA) {
760 case GL_REPLACE:
761 /*
762 * The formula is: Arg0
763 * We implement this by the formula:
764 * (Arg0 + 0(0))*(1-0) + 0
765 */
766 TEXENV_SETUP_ARG_A(A_A,
767 texUnit->CombineSourceA[0],
768 texUnit->CombineOperandA[0],
769 incomingAlpha);
770 TEXENV_SETUP_MODE_A(Amode_A,
771 texUnit->CombineOperandA[0]);
772 B_A = GR_CMBX_ITALPHA;
773 Bmode_A = GR_FUNC_MODE_ZERO;
774 C_A = D_A = GR_CMBX_ZERO;
775 Cinv_A = FXTRUE;
776 Dinv_A = Ginv_A = FXFALSE;
777 break;
778 case GL_MODULATE:
779 /*
780 * The formula is: Arg0 * Arg1
781 *
782 * We implement this by the formula
783 * (Arg0 + 0(0)) * Arg1 + 0(0)
784 */
785 TEXENV_SETUP_ARG_A(A_A,
786 texUnit->CombineSourceA[0],
787 texUnit->CombineOperandA[0],
788 incomingAlpha);
789 TEXENV_SETUP_MODE_A(Amode_A,
790 texUnit->CombineOperandA[0]);
791 B_A = GR_CMBX_ZERO;
792 Bmode_A = GR_CMBX_ZERO;
793 TEXENV_SETUP_ARG_A(C_A,
794 texUnit->CombineSourceA[1],
795 texUnit->CombineOperandA[1],
796 incomingAlpha);
797 Cinv_A = TEXENV_OPERAND_INVERTED
798 (texUnit->CombineOperandA[1]);
799 D_A = GR_CMBX_ZERO;
800 Dinv_A = Ginv_A = FXFALSE;
801 break;
802 case GL_ADD:
803 /*
804 * The formula is Arg0 + Arg1
805 */
806 TEXENV_SETUP_ARG_A(A_A,
807 texUnit->CombineSourceA[0],
808 texUnit->CombineOperandA[0],
809 incomingAlpha);
810 TEXENV_SETUP_MODE_A(Amode_A,
811 texUnit->CombineOperandA[0]);
812 TEXENV_SETUP_ARG_A(B_A,
813 texUnit->CombineSourceA[1],
814 texUnit->CombineOperandA[1],
815 incomingAlpha);
816 TEXENV_SETUP_MODE_A(Bmode_A,
817 texUnit->CombineOperandA[1]);
818 C_A = D_A = GR_CMBX_ZERO;
819 Cinv_A = FXTRUE;
820 Dinv_A = Ginv_A = FXFALSE;
821 break;
822 case GL_ADD_SIGNED_EXT:
823 /*
824 * The formula is: Arg0 + Arg1 - 0.5.
825 * We compute this by calculating:
826 * (Arg0 - 1/2) + Arg1 if op0 is SRC_{COLOR,ALPHA}
827 * Arg0 + (Arg1 - 1/2) if op1 is SRC_{COLOR,ALPHA}
828 * If both op0 and op1 are ONE_MINUS_SRC_{COLOR,ALPHA}
829 * we cannot implement the formula properly.
830 */
831 TEXENV_SETUP_ARG_A(A_A,
832 texUnit->CombineSourceA[0],
833 texUnit->CombineOperandA[0],
834 incomingAlpha);
835 TEXENV_SETUP_ARG_A(B_A,
836 texUnit->CombineSourceA[1],
837 texUnit->CombineOperandA[1],
838 incomingAlpha);
839 if (!TEXENV_OPERAND_INVERTED(texUnit->CombineOperandA[0])) {
840 /*
841 * A is not inverted. So, choose it.
842 */
843 Amode_A = GR_FUNC_MODE_X_MINUS_HALF;
844 if (!TEXENV_OPERAND_INVERTED
845 (texUnit->CombineOperandA[1])) {
846 Bmode_A = GR_FUNC_MODE_X;
847 } else {
848 Bmode_A = GR_FUNC_MODE_ONE_MINUS_X;
849 }
850 } else {
851 /*
852 * A is inverted, so try to subtract 1/2
853 * from B.
854 */
855 Amode_A = GR_FUNC_MODE_ONE_MINUS_X;
856 if (!TEXENV_OPERAND_INVERTED
857 (texUnit->CombineOperandA[1])) {
858 Bmode_A = GR_FUNC_MODE_X_MINUS_HALF;
859 } else {
860 /*
861 * Both are inverted. This is the case
862 * we cannot handle properly. We just
863 * choose to not add the - 1/2.
864 */
865 Bmode_A = GR_FUNC_MODE_ONE_MINUS_X;
866 return GL_FALSE;
867 }
868 }
869 C_A = D_A = GR_CMBX_ZERO;
870 Cinv_A = FXTRUE;
871 Dinv_A = Ginv_A = FXFALSE;
872 break;
873 case GL_INTERPOLATE_EXT:
874 /*
875 * The formula is: Arg0 * Arg2 + Arg1 * (1 - Arg2).
876 * We compute this by the formula:
877 * (Arg0 - Arg1) * Arg2 + Arg1
878 * == Arg0 * Arg2 - Arg1 * Arg2 + Arg1
879 * == Arg0 * Arg2 + Arg1 * (1 - Arg2)
880 * However, if both Arg1 is ONE_MINUS_X, the HW does
881 * not support it properly.
882 */
883 TEXENV_SETUP_ARG_A(A_A,
884 texUnit->CombineSourceA[0],
885 texUnit->CombineOperandA[0],
886 incomingAlpha);
887 TEXENV_SETUP_MODE_A(Amode_A,
888 texUnit->CombineOperandA[0]);
889 TEXENV_SETUP_ARG_A(B_A,
890 texUnit->CombineSourceA[1],
891 texUnit->CombineOperandA[1],
892 incomingAlpha);
893 if (!TEXENV_OPERAND_INVERTED(texUnit->CombineOperandA[1])) {
894 Bmode_A = GR_FUNC_MODE_NEGATIVE_X;
895 }
896 else {
897 /*
898 * This case is wrong.
899 */
900 Bmode_A = GR_FUNC_MODE_NEGATIVE_X;
901 return GL_FALSE;
902 }
903 /*
904 * The Source/Operand for the C value must
905 * specify some kind of alpha value.
906 */
907 TEXENV_SETUP_ARG_A(C_A,
908 texUnit->CombineSourceA[2],
909 texUnit->CombineOperandA[2],
910 incomingAlpha);
911 Cinv_A = FXFALSE;
912 D_A = GR_CMBX_B;
913 Dinv_A = Ginv_A = FXFALSE;
914 break;
915 default:
916 /*
917 * This is here mostly to keep from getting
918 * a compiler warning about these not being set.
919 * However, this should set all the alpha values
920 * to one.
921 */
922 A_A = B_A = C_A = D_A = GR_CMBX_ZERO;
923 Amode_A = Bmode_A = GR_FUNC_MODE_X;
924 Cinv_A = Dinv_A = FXFALSE;
925 Ginv_A = FXTRUE;
926 break;
927 }
928 /*
929 * Save the parameters.
930 */
931 env->Color.SourceA = A_RGB;
932 env->Color.ModeA = Amode_RGB;
933 env->Color.SourceB = B_RGB;
934 env->Color.ModeB = Bmode_RGB;
935 env->Color.SourceC = C_RGB;
936 env->Color.InvertC = Cinv_RGB;
937 env->Color.SourceD = D_RGB;
938 env->Color.InvertD = Dinv_RGB;
939 env->Color.Shift = Shift_RGB;
940 env->Color.Invert = Ginv_RGB;
941 env->Alpha.SourceA = A_A;
942 env->Alpha.ModeA = Amode_A;
943 env->Alpha.SourceB = B_A;
944 env->Alpha.ModeB = Bmode_A;
945 env->Alpha.SourceC = C_A;
946 env->Alpha.InvertC = Cinv_A;
947 env->Alpha.SourceD = D_A;
948 env->Alpha.InvertD = Dinv_A;
949 env->Alpha.Shift = Shift_A;
950 env->Alpha.Invert = Ginv_A;
951 env->EnvColor = PACK_RGBA32(texUnit->EnvColor[0] * 255.0F,
952 texUnit->EnvColor[1] * 255.0F,
953 texUnit->EnvColor[2] * 255.0F,
954 texUnit->EnvColor[3] * 255.0F);
955 }
956 break;
957 #endif
958 default:
959 if (TDFX_DEBUG & VERBOSE_DRIVER) {
960 fprintf(stderr, "fxSetupTextureEnvNapalm_NoLock: %x Texture.EnvMode not yet supported\n",
961 texUnit->EnvMode);
962 }
963 return;
964 }
965
966 /* On Napalm we simply put the color combine unit into passthrough mode
967 * and do everything we need with the texture combine units. */
968 fxMesa->Glide.grColorCombineExt(GR_CMBX_TEXTURE_RGB,
969 GR_FUNC_MODE_X,
970 GR_CMBX_ZERO,
971 GR_FUNC_MODE_X,
972 GR_CMBX_ZERO,
973 FXTRUE,
974 GR_CMBX_ZERO,
975 FXFALSE,
976 0,
977 FXFALSE);
978 fxMesa->Glide.grAlphaCombineExt(GR_CMBX_TEXTURE_ALPHA,
979 GR_FUNC_MODE_X,
980 GR_CMBX_ZERO,
981 GR_FUNC_MODE_X,
982 GR_CMBX_ZERO,
983 FXTRUE,
984 GR_CMBX_ZERO,
985 FXFALSE,
986 0,
987 FXFALSE);
988
989 fxMesa->Glide.grTexAlphaCombineExt(tmu,
990 alphaComb.SourceA,
991 alphaComb.ModeA,
992 alphaComb.SourceB,
993 alphaComb.ModeB,
994 alphaComb.SourceC,
995 alphaComb.InvertC,
996 alphaComb.SourceD,
997 alphaComb.InvertD,
998 alphaComb.Shift,
999 alphaComb.Invert);
1000 fxMesa->Glide.grTexColorCombineExt(tmu,
1001 colorComb.SourceA,
1002 colorComb.ModeA,
1003 colorComb.SourceB,
1004 colorComb.ModeB,
1005 colorComb.SourceC,
1006 colorComb.InvertC,
1007 colorComb.SourceD,
1008 colorComb.InvertD,
1009 colorComb.Shift,
1010 colorComb.Invert);
1011 }
1012
1013
1014 /************************* Single Texture Set ***************************/
1015
1016 static void
1017 fxSelectSingleTMUSrcNapalm_NoLock(fxMesaContext fxMesa, GLint tmu, FxBool LODblend)
1018 {
1019 if (TDFX_DEBUG & VERBOSE_DRIVER) {
1020 fprintf(stderr, "fxSelectSingleTMUSrcNapalm_NoLock(%d, %d)\n", tmu, LODblend);
1021 }
1022
1023 if (LODblend) {
1024 /* XXX todo - GR_CMBX_LOD_FRAC? */
1025 fxMesa->tmuSrc = FX_TMU_SPLIT;
1026 }
1027 else {
1028 if (tmu != FX_TMU1) {
1029 /* disable tex1 */
1030 if (fxMesa->haveTwoTMUs) {
1031 fxMesa->Glide.grTexAlphaCombineExt(FX_TMU1,
1032 GR_CMBX_ZERO,
1033 GR_FUNC_MODE_ZERO,
1034 GR_CMBX_ZERO,
1035 GR_FUNC_MODE_ZERO,
1036 GR_CMBX_ZERO,
1037 FXTRUE,
1038 GR_CMBX_ZERO,
1039 FXFALSE,
1040 0,
1041 FXFALSE);
1042 fxMesa->Glide.grTexColorCombineExt(FX_TMU1,
1043 GR_CMBX_ZERO,
1044 GR_FUNC_MODE_ZERO,
1045 GR_CMBX_ZERO,
1046 GR_FUNC_MODE_ZERO,
1047 GR_CMBX_ZERO,
1048 FXTRUE,
1049 GR_CMBX_ZERO,
1050 FXFALSE,
1051 0,
1052 FXFALSE);
1053 }
1054
1055 fxMesa->tmuSrc = FX_TMU0;
1056 }
1057 else {
1058 #if 1
1059 grTexCombine(GR_TMU0,
1060 GR_COMBINE_FUNCTION_BLEND,
1061 GR_COMBINE_FACTOR_ONE,
1062 GR_COMBINE_FUNCTION_BLEND,
1063 GR_COMBINE_FACTOR_ONE,
1064 FXFALSE,
1065 FXFALSE);
1066 #else
1067 /* [dBorca] why, oh why? doesn't work! stupid Glide? */
1068 fxMesa->Glide.grTexAlphaCombineExt(FX_TMU0,
1069 GR_CMBX_OTHER_TEXTURE_ALPHA,
1070 GR_FUNC_MODE_X,
1071 GR_CMBX_ZERO,
1072 GR_FUNC_MODE_X,
1073 GR_CMBX_ZERO,
1074 FXTRUE,
1075 GR_CMBX_ZERO,
1076 FXFALSE,
1077 0,
1078 FXFALSE);
1079 fxMesa->Glide.grTexColorCombineExt(FX_TMU0,
1080 GR_CMBX_OTHER_TEXTURE_RGB,
1081 GR_FUNC_MODE_X,
1082 GR_CMBX_ZERO,
1083 GR_FUNC_MODE_X,
1084 GR_CMBX_ZERO,
1085 FXTRUE,
1086 GR_CMBX_ZERO,
1087 FXFALSE,
1088 0,
1089 FXFALSE);
1090 #endif
1091
1092 fxMesa->tmuSrc = FX_TMU1;
1093 }
1094 }
1095 }
1096
1097 static void
1098 fxSetupTextureSingleTMUNapalm_NoLock(GLcontext * ctx, GLuint textureset)
1099 {
1100 fxMesaContext fxMesa = FX_CONTEXT(ctx);
1101 GLuint unitsmode;
1102 tfxTexInfo *ti;
1103 struct gl_texture_object *tObj = ctx->Texture.Unit[textureset]._Current;
1104 int tmu;
1105
1106 if (TDFX_DEBUG & VERBOSE_DRIVER) {
1107 fprintf(stderr, "fxSetupTextureSingleTMUNapalm_NoLock(%d)\n", textureset);
1108 }
1109
1110 ti = fxTMGetTexInfo(tObj);
1111
1112 fxTexValidate(ctx, tObj);
1113
1114 fxSetupSingleTMU_NoLock(fxMesa, tObj);
1115
1116 if (ti->whichTMU == FX_TMU_BOTH)
1117 tmu = FX_TMU0;
1118 else
1119 tmu = ti->whichTMU;
1120 if (fxMesa->tmuSrc != tmu)
1121 fxSelectSingleTMUSrcNapalm_NoLock(fxMesa, tmu, ti->LODblend);
1122
1123 if (textureset == 0 || !fxMesa->haveTwoTMUs)
1124 unitsmode = fxGetTexSetConfiguration(ctx, tObj, NULL);
1125 else
1126 unitsmode = fxGetTexSetConfiguration(ctx, NULL, tObj);
1127
1128 /* if(fxMesa->lastUnitsMode==unitsmode) */
1129 /* return; */
1130
1131 fxMesa->lastUnitsMode = unitsmode;
1132
1133 fxMesa->stw_hint_state = 0;
1134 FX_grHints_NoLock(GR_HINT_STWHINT, 0);
1135
1136 if (TDFX_DEBUG & (VERBOSE_DRIVER | VERBOSE_TEXTURE))
1137 fprintf(stderr, "fxSetupTextureSingleTMUNapalm_NoLock: envmode is %s\n",
1138 _mesa_lookup_enum_by_nr(ctx->Texture.Unit[textureset].EnvMode));
1139
1140 /* [dBorca] Hack alert:
1141 * what if we're in split mode? (LODBlend)
1142 * also should we update BOTH TMUs in FX_TMU_BOTH mode?
1143 */
1144 fxSetupTextureEnvNapalm_NoLock(ctx, textureset, tmu, GL_TRUE);
1145 }
1146
1147
1148 /************************* Double Texture Set ***************************/
1149
1150 static void
1151 fxSetupTextureDoubleTMUNapalm_NoLock(GLcontext * ctx)
1152 {
1153 fxMesaContext fxMesa = FX_CONTEXT(ctx);
1154 tfxTexInfo *ti0, *ti1;
1155 struct gl_texture_object *tObj0 = ctx->Texture.Unit[1]._Current;
1156 struct gl_texture_object *tObj1 = ctx->Texture.Unit[0]._Current;
1157 GLuint unitsmode;
1158 int tmu0 = 0, tmu1 = 1;
1159
1160 if (TDFX_DEBUG & VERBOSE_DRIVER) {
1161 fprintf(stderr, "fxSetupTextureDoubleTMUNapalm_NoLock(...)\n");
1162 }
1163
1164 ti0 = fxTMGetTexInfo(tObj0);
1165 fxTexValidate(ctx, tObj0);
1166
1167 ti1 = fxTMGetTexInfo(tObj1);
1168 fxTexValidate(ctx, tObj1);
1169
1170 fxSetupDoubleTMU_NoLock(fxMesa, tObj0, tObj1);
1171
1172 unitsmode = fxGetTexSetConfiguration(ctx, tObj0, tObj1);
1173
1174 /* if(fxMesa->lastUnitsMode==unitsmode) */
1175 /* return; */
1176
1177 fxMesa->lastUnitsMode = unitsmode;
1178
1179 fxMesa->stw_hint_state |= GR_STWHINT_ST_DIFF_TMU1;
1180 FX_grHints_NoLock(GR_HINT_STWHINT, fxMesa->stw_hint_state);
1181
1182 if (TDFX_DEBUG & (VERBOSE_DRIVER | VERBOSE_TEXTURE))
1183 fprintf(stderr, "fxSetupTextureDoubleTMUNapalm_NoLock: envmode is %s/%s\n",
1184 _mesa_lookup_enum_by_nr(ctx->Texture.Unit[0].EnvMode),
1185 _mesa_lookup_enum_by_nr(ctx->Texture.Unit[1].EnvMode));
1186
1187
1188 if ((ti0->whichTMU == FX_TMU1) || (ti1->whichTMU == FX_TMU0)) {
1189 tmu0 = 1;
1190 tmu1 = 0;
1191 }
1192 fxMesa->tmuSrc = FX_TMU_BOTH;
1193
1194 /* OpenGL vs Glide texture pipeline */
1195 fxSetupTextureEnvNapalm_NoLock(ctx, 0, 1, GL_TRUE);
1196 fxSetupTextureEnvNapalm_NoLock(ctx, 1, 0, GL_FALSE);
1197 }
1198
1199 /************************* No Texture ***************************/
1200
1201 static void
1202 fxSetupTextureNoneNapalm_NoLock(GLcontext * ctx)
1203 {
1204 fxMesaContext fxMesa = FX_CONTEXT(ctx);
1205
1206 if (TDFX_DEBUG & VERBOSE_DRIVER) {
1207 fprintf(stderr, "fxSetupTextureNoneNapalm_NoLock(...)\n");
1208 }
1209
1210 /* the combiner formula is: (A + B) * C + D
1211 **
1212 ** a = tc_otherselect
1213 ** a_mode = tc_invert_other
1214 ** b = tc_localselect
1215 ** b_mode = tc_invert_local
1216 ** c = (tc_mselect, tc_mselect_7)
1217 ** d = (tc_add_clocal, tc_add_alocal)
1218 ** shift = tc_outshift
1219 ** invert = tc_invert_output
1220 */
1221
1222 fxMesa->Glide.grColorCombineExt(GR_CMBX_ITRGB,
1223 GR_FUNC_MODE_X,
1224 GR_CMBX_ZERO,
1225 GR_FUNC_MODE_ZERO,
1226 GR_CMBX_ZERO,
1227 FXTRUE,
1228 GR_CMBX_ZERO,
1229 FXFALSE,
1230 0,
1231 FXFALSE);
1232 fxMesa->Glide.grAlphaCombineExt(GR_CMBX_ITALPHA,
1233 GR_FUNC_MODE_X,
1234 GR_CMBX_ZERO,
1235 GR_FUNC_MODE_ZERO,
1236 GR_CMBX_ZERO,
1237 FXTRUE,
1238 GR_CMBX_ZERO,
1239 FXFALSE,
1240 0,
1241 FXFALSE);
1242
1243 fxMesa->lastUnitsMode = FX_UM_NONE;
1244 }