Remove GGI support
[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
564 default:
565 if (TDFX_DEBUG & VERBOSE_DRIVER) {
566 fprintf(stderr, "fxSetupTextureEnvNapalm_NoLock: %x Texture.EnvMode not yet supported\n",
567 texUnit->EnvMode);
568 }
569 return;
570 }
571
572 /* On Napalm we simply put the color combine unit into passthrough mode
573 * and do everything we need with the texture combine units. */
574 fxMesa->Glide.grColorCombineExt(GR_CMBX_TEXTURE_RGB,
575 GR_FUNC_MODE_X,
576 GR_CMBX_ZERO,
577 GR_FUNC_MODE_X,
578 GR_CMBX_ZERO,
579 FXTRUE,
580 GR_CMBX_ZERO,
581 FXFALSE,
582 0,
583 FXFALSE);
584 fxMesa->Glide.grAlphaCombineExt(GR_CMBX_TEXTURE_ALPHA,
585 GR_FUNC_MODE_X,
586 GR_CMBX_ZERO,
587 GR_FUNC_MODE_X,
588 GR_CMBX_ZERO,
589 FXTRUE,
590 GR_CMBX_ZERO,
591 FXFALSE,
592 0,
593 FXFALSE);
594
595 fxMesa->Glide.grTexAlphaCombineExt(tmu,
596 alphaComb.SourceA,
597 alphaComb.ModeA,
598 alphaComb.SourceB,
599 alphaComb.ModeB,
600 alphaComb.SourceC,
601 alphaComb.InvertC,
602 alphaComb.SourceD,
603 alphaComb.InvertD,
604 alphaComb.Shift,
605 alphaComb.Invert);
606 fxMesa->Glide.grTexColorCombineExt(tmu,
607 colorComb.SourceA,
608 colorComb.ModeA,
609 colorComb.SourceB,
610 colorComb.ModeB,
611 colorComb.SourceC,
612 colorComb.InvertC,
613 colorComb.SourceD,
614 colorComb.InvertD,
615 colorComb.Shift,
616 colorComb.Invert);
617 }
618
619
620 /************************* Single Texture Set ***************************/
621
622 static void
623 fxSelectSingleTMUSrcNapalm_NoLock(fxMesaContext fxMesa, GLint tmu, FxBool LODblend)
624 {
625 if (TDFX_DEBUG & VERBOSE_DRIVER) {
626 fprintf(stderr, "fxSelectSingleTMUSrcNapalm_NoLock(%d, %d)\n", tmu, LODblend);
627 }
628
629 if (LODblend) {
630 /* XXX todo - GR_CMBX_LOD_FRAC? */
631 fxMesa->tmuSrc = FX_TMU_SPLIT;
632 }
633 else {
634 if (tmu != FX_TMU1) {
635 /* disable tex1 */
636 if (fxMesa->haveTwoTMUs) {
637 fxMesa->Glide.grTexAlphaCombineExt(FX_TMU1,
638 GR_CMBX_ZERO,
639 GR_FUNC_MODE_ZERO,
640 GR_CMBX_ZERO,
641 GR_FUNC_MODE_ZERO,
642 GR_CMBX_ZERO,
643 FXTRUE,
644 GR_CMBX_ZERO,
645 FXFALSE,
646 0,
647 FXFALSE);
648 fxMesa->Glide.grTexColorCombineExt(FX_TMU1,
649 GR_CMBX_ZERO,
650 GR_FUNC_MODE_ZERO,
651 GR_CMBX_ZERO,
652 GR_FUNC_MODE_ZERO,
653 GR_CMBX_ZERO,
654 FXTRUE,
655 GR_CMBX_ZERO,
656 FXFALSE,
657 0,
658 FXFALSE);
659 }
660
661 fxMesa->tmuSrc = FX_TMU0;
662 }
663 else {
664 #if 1
665 grTexCombine(GR_TMU0,
666 GR_COMBINE_FUNCTION_BLEND,
667 GR_COMBINE_FACTOR_ONE,
668 GR_COMBINE_FUNCTION_BLEND,
669 GR_COMBINE_FACTOR_ONE,
670 FXFALSE,
671 FXFALSE);
672 #else
673 /* [dBorca] why, oh why? doesn't work! stupid Glide? */
674 fxMesa->Glide.grTexAlphaCombineExt(FX_TMU0,
675 GR_CMBX_OTHER_TEXTURE_ALPHA,
676 GR_FUNC_MODE_X,
677 GR_CMBX_ZERO,
678 GR_FUNC_MODE_X,
679 GR_CMBX_ZERO,
680 FXTRUE,
681 GR_CMBX_ZERO,
682 FXFALSE,
683 0,
684 FXFALSE);
685 fxMesa->Glide.grTexColorCombineExt(FX_TMU0,
686 GR_CMBX_OTHER_TEXTURE_RGB,
687 GR_FUNC_MODE_X,
688 GR_CMBX_ZERO,
689 GR_FUNC_MODE_X,
690 GR_CMBX_ZERO,
691 FXTRUE,
692 GR_CMBX_ZERO,
693 FXFALSE,
694 0,
695 FXFALSE);
696 #endif
697
698 fxMesa->tmuSrc = FX_TMU1;
699 }
700 }
701 }
702
703 static void
704 fxSetupTextureSingleTMUNapalm_NoLock(GLcontext * ctx, GLuint textureset)
705 {
706 fxMesaContext fxMesa = FX_CONTEXT(ctx);
707 GLuint unitsmode;
708 tfxTexInfo *ti;
709 struct gl_texture_object *tObj = ctx->Texture.Unit[textureset]._Current;
710 int tmu;
711
712 if (TDFX_DEBUG & VERBOSE_DRIVER) {
713 fprintf(stderr, "fxSetupTextureSingleTMUNapalm_NoLock(%d)\n", textureset);
714 }
715
716 ti = fxTMGetTexInfo(tObj);
717
718 fxTexValidate(ctx, tObj);
719
720 fxSetupSingleTMU_NoLock(fxMesa, tObj);
721
722 if (ti->whichTMU == FX_TMU_BOTH)
723 tmu = FX_TMU0;
724 else
725 tmu = ti->whichTMU;
726 if (fxMesa->tmuSrc != tmu)
727 fxSelectSingleTMUSrcNapalm_NoLock(fxMesa, tmu, ti->LODblend);
728
729 if (textureset == 0 || !fxMesa->haveTwoTMUs)
730 unitsmode = fxGetTexSetConfiguration(ctx, tObj, NULL);
731 else
732 unitsmode = fxGetTexSetConfiguration(ctx, NULL, tObj);
733
734 /* if(fxMesa->lastUnitsMode==unitsmode) */
735 /* return; */
736
737 fxMesa->lastUnitsMode = unitsmode;
738
739 fxMesa->stw_hint_state = 0;
740 FX_grHints_NoLock(GR_HINT_STWHINT, 0);
741
742 if (TDFX_DEBUG & (VERBOSE_DRIVER | VERBOSE_TEXTURE))
743 fprintf(stderr, "fxSetupTextureSingleTMUNapalm_NoLock: envmode is %s\n",
744 _mesa_lookup_enum_by_nr(ctx->Texture.Unit[textureset].EnvMode));
745
746 /* [dBorca] Hack alert:
747 * what if we're in split mode? (LODBlend)
748 * also should we update BOTH TMUs in FX_TMU_BOTH mode?
749 */
750 fxSetupTextureEnvNapalm_NoLock(ctx, textureset, tmu, GL_TRUE);
751 }
752
753
754 /************************* Double Texture Set ***************************/
755
756 static void
757 fxSetupTextureDoubleTMUNapalm_NoLock(GLcontext * ctx)
758 {
759 fxMesaContext fxMesa = FX_CONTEXT(ctx);
760 tfxTexInfo *ti0, *ti1;
761 struct gl_texture_object *tObj0 = ctx->Texture.Unit[1]._Current;
762 struct gl_texture_object *tObj1 = ctx->Texture.Unit[0]._Current;
763 GLuint unitsmode;
764 int tmu0 = 0, tmu1 = 1;
765
766 if (TDFX_DEBUG & VERBOSE_DRIVER) {
767 fprintf(stderr, "fxSetupTextureDoubleTMUNapalm_NoLock(...)\n");
768 }
769
770 ti0 = fxTMGetTexInfo(tObj0);
771 fxTexValidate(ctx, tObj0);
772
773 ti1 = fxTMGetTexInfo(tObj1);
774 fxTexValidate(ctx, tObj1);
775
776 fxSetupDoubleTMU_NoLock(fxMesa, tObj0, tObj1);
777
778 unitsmode = fxGetTexSetConfiguration(ctx, tObj0, tObj1);
779
780 /* if(fxMesa->lastUnitsMode==unitsmode) */
781 /* return; */
782
783 fxMesa->lastUnitsMode = unitsmode;
784
785 fxMesa->stw_hint_state |= GR_STWHINT_ST_DIFF_TMU1;
786 FX_grHints_NoLock(GR_HINT_STWHINT, fxMesa->stw_hint_state);
787
788 if (TDFX_DEBUG & (VERBOSE_DRIVER | VERBOSE_TEXTURE))
789 fprintf(stderr, "fxSetupTextureDoubleTMUNapalm_NoLock: envmode is %s/%s\n",
790 _mesa_lookup_enum_by_nr(ctx->Texture.Unit[0].EnvMode),
791 _mesa_lookup_enum_by_nr(ctx->Texture.Unit[1].EnvMode));
792
793
794 if ((ti0->whichTMU == FX_TMU1) || (ti1->whichTMU == FX_TMU0)) {
795 tmu0 = 1;
796 tmu1 = 0;
797 }
798 fxMesa->tmuSrc = FX_TMU_BOTH;
799
800 /* OpenGL vs Glide texture pipeline */
801 fxSetupTextureEnvNapalm_NoLock(ctx, 0, 1, GL_TRUE);
802 fxSetupTextureEnvNapalm_NoLock(ctx, 1, 0, GL_FALSE);
803 }
804
805 /************************* No Texture ***************************/
806
807 static void
808 fxSetupTextureNoneNapalm_NoLock(GLcontext * ctx)
809 {
810 fxMesaContext fxMesa = FX_CONTEXT(ctx);
811
812 if (TDFX_DEBUG & VERBOSE_DRIVER) {
813 fprintf(stderr, "fxSetupTextureNoneNapalm_NoLock(...)\n");
814 }
815
816 /* the combiner formula is: (A + B) * C + D
817 **
818 ** a = tc_otherselect
819 ** a_mode = tc_invert_other
820 ** b = tc_localselect
821 ** b_mode = tc_invert_local
822 ** c = (tc_mselect, tc_mselect_7)
823 ** d = (tc_add_clocal, tc_add_alocal)
824 ** shift = tc_outshift
825 ** invert = tc_invert_output
826 */
827
828 fxMesa->Glide.grColorCombineExt(GR_CMBX_ITRGB,
829 GR_FUNC_MODE_X,
830 GR_CMBX_ZERO,
831 GR_FUNC_MODE_ZERO,
832 GR_CMBX_ZERO,
833 FXTRUE,
834 GR_CMBX_ZERO,
835 FXFALSE,
836 0,
837 FXFALSE);
838 fxMesa->Glide.grAlphaCombineExt(GR_CMBX_ITALPHA,
839 GR_FUNC_MODE_X,
840 GR_CMBX_ZERO,
841 GR_FUNC_MODE_ZERO,
842 GR_CMBX_ZERO,
843 FXTRUE,
844 GR_CMBX_ZERO,
845 FXFALSE,
846 0,
847 FXFALSE);
848
849 fxMesa->lastUnitsMode = FX_UM_NONE;
850 }