2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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.
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
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
55 * These macros are used below when handling COMBINE_EXT.
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) \
65 param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \
67 case GL_CONSTANT_EXT: \
68 param = GR_CMBX_TMU_CALPHA; \
70 case GL_PRIMARY_COLOR_EXT: \
71 param = GR_CMBX_ITALPHA; \
73 case GL_PREVIOUS_EXT: \
74 param = iteratedAlpha; \
78 * This is here just to keep from getting \
79 * compiler warnings. \
81 param = GR_CMBX_ZERO; \
85 #define TEXENV_SETUP_ARG_RGB(param, source, operand, iteratedColor, iteratedAlpha) \
86 if (!TEXENV_OPERAND_ALPHA(operand)) { \
89 param = GR_CMBX_LOCAL_TEXTURE_RGB; \
91 case GL_CONSTANT_EXT: \
92 param = GR_CMBX_TMU_CCOLOR; \
94 case GL_PRIMARY_COLOR_EXT: \
95 param = GR_CMBX_ITRGB; \
97 case GL_PREVIOUS_EXT: \
98 param = iteratedColor; \
102 * This is here just to keep from getting \
103 * compiler warnings. \
105 param = GR_CMBX_ZERO; \
111 param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \
113 case GL_CONSTANT_EXT: \
114 param = GR_CMBX_TMU_CALPHA; \
116 case GL_PRIMARY_COLOR_EXT: \
117 param = GR_CMBX_ITALPHA; \
119 case GL_PREVIOUS_EXT: \
120 param = iteratedAlpha; \
124 * This is here just to keep from getting \
125 * compiler warnings. \
127 param = GR_CMBX_ZERO; \
132 #define TEXENV_SETUP_MODE_RGB(param, operand) \
136 param = GR_FUNC_MODE_X; \
138 case GL_ONE_MINUS_SRC_ALPHA: \
139 case GL_ONE_MINUS_SRC_COLOR: \
140 param = GR_FUNC_MODE_ONE_MINUS_X; \
143 param = GR_FUNC_MODE_ZERO; \
147 #define TEXENV_SETUP_MODE_A(param, operand) \
150 param = GR_FUNC_MODE_X; \
152 case GL_ONE_MINUS_SRC_ALPHA: \
153 param = GR_FUNC_MODE_ONE_MINUS_X; \
156 param = GR_FUNC_MODE_ZERO; \
161 fxSetupTextureEnvNapalm_NoLock(GLcontext
* ctx
, GLuint textureset
, GLuint tmu
, GLboolean iterated
)
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 */
171 struct gl_texture_object
*tObj
= texUnit
->_Current
;
173 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
174 fprintf(stderr
, "fxSetupTextureEnvNapalm_NoLock(unit %u, TMU %u, iterated %d)\n",
175 textureset
, tmu
, iterated
);
178 ti
= fxTMGetTexInfo(tObj
);
180 ifmt
= ti
->baseLevelInternalFormat
;
183 /* we don't have upstream TMU */
184 locala
= GR_CMBX_ITALPHA
;
185 localc
= GR_CMBX_ITRGB
;
187 /* we have upstream TMU */
188 locala
= GR_CMBX_OTHER_TEXTURE_ALPHA
;
189 localc
= GR_CMBX_OTHER_TEXTURE_RGB
;
192 alphaComb
.InvertD
= FXFALSE
;
194 alphaComb
.Invert
= FXFALSE
;
195 colorComb
.InvertD
= FXFALSE
;
197 colorComb
.Invert
= FXFALSE
;
199 switch (texUnit
->EnvMode
) {
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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));
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
381 /* XXX todo - INCOMPLETE!!! */
382 if (TDFX_DEBUG
& (VERBOSE_DRIVER
| VERBOSE_TEXTURE
)) {
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
));
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]);
410 alphaComb
.Shift
= texUnit
->Combine
.ScaleShiftA
;
411 colorComb
.Shift
= texUnit
->Combine
.ScaleShiftRGB
;
413 switch (texUnit
->Combine
.ModeRGB
) {
415 /* Arg0 * Arg1 == (A + 0) * C + 0 */
416 TEXENV_SETUP_ARG_RGB(colorComb
.SourceA
,
417 texUnit
->Combine
.SourceRGB
[0],
418 texUnit
->Combine
.OperandRGB
[0],
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],
428 colorComb
.InvertC
= TEXENV_OPERAND_INVERTED(
429 texUnit
->Combine
.OperandRGB
[1]);
430 colorComb
.SourceD
= GR_CMBX_ZERO
;
433 /* Arg0 == (A + 0) * 1 + 0 */
434 TEXENV_SETUP_ARG_RGB(colorComb
.SourceA
,
435 texUnit
->Combine
.SourceRGB
[0],
436 texUnit
->Combine
.OperandRGB
[0],
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
;
447 /* Arg0 + Arg1 = (A + B) * 1 + 0 */
448 TEXENV_SETUP_ARG_RGB(colorComb
.SourceA
,
449 texUnit
->Combine
.SourceRGB
[0],
450 texUnit
->Combine
.OperandRGB
[0],
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],
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
;
464 case GL_INTERPOLATE_EXT
:
465 /* Arg0 * Arg2 + Arg1 * (1 - Arg2) ==
466 * (Arg0 - Arg1) * Arg2 + Arg1 == (A - B) * C + D
468 TEXENV_SETUP_ARG_RGB(colorComb
.SourceA
,
469 texUnit
->Combine
.SourceRGB
[0],
470 texUnit
->Combine
.OperandRGB
[0],
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],
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
;
483 colorComb
.ModeB
= GR_FUNC_MODE_NEGATIVE_X
;
486 * The Source/Operand for the C value must
487 * specify some kind of alpha value.
489 TEXENV_SETUP_ARG_A(colorComb
.SourceC
,
490 texUnit
->Combine
.SourceRGB
[2],
491 texUnit
->Combine
.OperandRGB
[2],
493 colorComb
.InvertC
= FXFALSE
;
494 colorComb
.SourceD
= GR_CMBX_B
;
497 fprintf(stderr
, "COMBINE_EXT_color: %s\n",
498 _mesa_lookup_enum_by_nr(texUnit
->Combine
.ModeRGB
));
501 switch (texUnit
->Combine
.ModeA
) {
503 /* Arg0 * Arg1 == (A + 0) * C + 0 */
504 TEXENV_SETUP_ARG_A(alphaComb
.SourceA
,
505 texUnit
->Combine
.SourceA
[0],
506 texUnit
->Combine
.OperandA
[0],
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],
516 alphaComb
.InvertC
= TEXENV_OPERAND_INVERTED(
517 texUnit
->Combine
.OperandA
[1]);
518 alphaComb
.SourceD
= GR_CMBX_ZERO
;
521 /* Arg0 == (A + 0) * 1 + 0 */
522 TEXENV_SETUP_ARG_A(alphaComb
.SourceA
,
523 texUnit
->Combine
.SourceA
[0],
524 texUnit
->Combine
.OperandA
[0],
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
;
535 /* Arg0 + Arg1 = (A + B) * 1 + 0 */
536 TEXENV_SETUP_ARG_A(alphaComb
.SourceA
,
537 texUnit
->Combine
.SourceA
[0],
538 texUnit
->Combine
.OperandA
[0],
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],
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
;
553 fprintf(stderr
, "COMBINE_EXT_alpha: %s\n",
554 _mesa_lookup_enum_by_nr(texUnit
->Combine
.ModeA
));
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));
565 FxU32 A_RGB
, B_RGB
, C_RGB
, D_RGB
;
566 FxU32 Amode_RGB
, Bmode_RGB
;
567 FxBool Cinv_RGB
, Dinv_RGB
, Ginv_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
;
576 * In the formulas below, we write:
577 * o "1(x)" for the identity function applied to x,
579 * o "0(x)" for the constant function 0, so
580 * 0(x) = 0 for all values of x.
582 * Calculate the color combination.
584 Shift_RGB
= texUnit
->CombineScaleShiftRGB
;
585 Shift_A
= texUnit
->CombineScaleShiftA
;
586 switch (texUnit
->CombineModeRGB
) {
589 * The formula is: Arg0
590 * We implement this by the formula:
591 * (Arg0 + 0(0))*(1-0) + 0
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
;
602 Dinv_RGB
= Ginv_RGB
= FXFALSE
;
606 * The formula is: Arg0 * Arg1
608 * We implement this by the formula
609 * (Arg0 + 0(0)) * Arg1 + 0(0)
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
;
630 * The formula is Arg0 + Arg1
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
;
646 Dinv_RGB
= Ginv_RGB
= FXFALSE
;
648 case GL_ADD_SIGNED_EXT
:
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.
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])) {
667 * A is not inverted. So, choose it.
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
;
675 Bmode_RGB
= GR_FUNC_MODE_ONE_MINUS_X
;
680 * A is inverted, so try to subtract 1/2
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
;
690 * Both are inverted. This is the case
691 * we cannot handle properly. We just
692 * choose to not add the - 1/2.
694 Bmode_RGB
= GR_FUNC_MODE_ONE_MINUS_X
;
698 C_RGB
= D_RGB
= GR_CMBX_ZERO
;
700 Dinv_RGB
= Ginv_RGB
= FXFALSE
;
702 case GL_INTERPOLATE_EXT
:
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.
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])) {
724 * This case is wrong.
726 Bmode_RGB
= GR_FUNC_MODE_NEGATIVE_X
;
730 Bmode_RGB
= GR_FUNC_MODE_NEGATIVE_X
;
733 * The Source/Operand for the C value must
734 * specify some kind of alpha value.
736 TEXENV_SETUP_ARG_A(C_RGB
,
737 texUnit
->CombineSourceRGB
[2],
738 texUnit
->CombineOperandRGB
[2],
742 Dinv_RGB
= Ginv_RGB
= FXFALSE
;
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
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
;
757 * Calculate the alpha combination.
759 switch (texUnit
->CombineModeA
) {
762 * The formula is: Arg0
763 * We implement this by the formula:
764 * (Arg0 + 0(0))*(1-0) + 0
766 TEXENV_SETUP_ARG_A(A_A
,
767 texUnit
->CombineSourceA
[0],
768 texUnit
->CombineOperandA
[0],
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
;
776 Dinv_A
= Ginv_A
= FXFALSE
;
780 * The formula is: Arg0 * Arg1
782 * We implement this by the formula
783 * (Arg0 + 0(0)) * Arg1 + 0(0)
785 TEXENV_SETUP_ARG_A(A_A
,
786 texUnit
->CombineSourceA
[0],
787 texUnit
->CombineOperandA
[0],
789 TEXENV_SETUP_MODE_A(Amode_A
,
790 texUnit
->CombineOperandA
[0]);
792 Bmode_A
= GR_CMBX_ZERO
;
793 TEXENV_SETUP_ARG_A(C_A
,
794 texUnit
->CombineSourceA
[1],
795 texUnit
->CombineOperandA
[1],
797 Cinv_A
= TEXENV_OPERAND_INVERTED
798 (texUnit
->CombineOperandA
[1]);
800 Dinv_A
= Ginv_A
= FXFALSE
;
804 * The formula is Arg0 + Arg1
806 TEXENV_SETUP_ARG_A(A_A
,
807 texUnit
->CombineSourceA
[0],
808 texUnit
->CombineOperandA
[0],
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],
816 TEXENV_SETUP_MODE_A(Bmode_A
,
817 texUnit
->CombineOperandA
[1]);
818 C_A
= D_A
= GR_CMBX_ZERO
;
820 Dinv_A
= Ginv_A
= FXFALSE
;
822 case GL_ADD_SIGNED_EXT
:
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.
831 TEXENV_SETUP_ARG_A(A_A
,
832 texUnit
->CombineSourceA
[0],
833 texUnit
->CombineOperandA
[0],
835 TEXENV_SETUP_ARG_A(B_A
,
836 texUnit
->CombineSourceA
[1],
837 texUnit
->CombineOperandA
[1],
839 if (!TEXENV_OPERAND_INVERTED(texUnit
->CombineOperandA
[0])) {
841 * A is not inverted. So, choose it.
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
;
848 Bmode_A
= GR_FUNC_MODE_ONE_MINUS_X
;
852 * A is inverted, so try to subtract 1/2
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
;
861 * Both are inverted. This is the case
862 * we cannot handle properly. We just
863 * choose to not add the - 1/2.
865 Bmode_A
= GR_FUNC_MODE_ONE_MINUS_X
;
869 C_A
= D_A
= GR_CMBX_ZERO
;
871 Dinv_A
= Ginv_A
= FXFALSE
;
873 case GL_INTERPOLATE_EXT
:
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.
883 TEXENV_SETUP_ARG_A(A_A
,
884 texUnit
->CombineSourceA
[0],
885 texUnit
->CombineOperandA
[0],
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],
893 if (!TEXENV_OPERAND_INVERTED(texUnit
->CombineOperandA
[1])) {
894 Bmode_A
= GR_FUNC_MODE_NEGATIVE_X
;
898 * This case is wrong.
900 Bmode_A
= GR_FUNC_MODE_NEGATIVE_X
;
904 * The Source/Operand for the C value must
905 * specify some kind of alpha value.
907 TEXENV_SETUP_ARG_A(C_A
,
908 texUnit
->CombineSourceA
[2],
909 texUnit
->CombineOperandA
[2],
913 Dinv_A
= Ginv_A
= FXFALSE
;
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
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
;
929 * Save the parameters.
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
);
959 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
960 fprintf(stderr
, "fxSetupTextureEnvNapalm_NoLock: %x Texture.EnvMode not yet supported\n",
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
,
978 fxMesa
->Glide
.grAlphaCombineExt(GR_CMBX_TEXTURE_ALPHA
,
989 fxMesa
->Glide
.grTexAlphaCombineExt(tmu
,
1000 fxMesa
->Glide
.grTexColorCombineExt(tmu
,
1014 /************************* Single Texture Set ***************************/
1017 fxSelectSingleTMUSrcNapalm_NoLock(fxMesaContext fxMesa
, GLint tmu
, FxBool LODblend
)
1019 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
1020 fprintf(stderr
, "fxSelectSingleTMUSrcNapalm_NoLock(%d, %d)\n", tmu
, LODblend
);
1024 /* XXX todo - GR_CMBX_LOD_FRAC? */
1025 fxMesa
->tmuSrc
= FX_TMU_SPLIT
;
1028 if (tmu
!= FX_TMU1
) {
1030 if (fxMesa
->haveTwoTMUs
) {
1031 fxMesa
->Glide
.grTexAlphaCombineExt(FX_TMU1
,
1042 fxMesa
->Glide
.grTexColorCombineExt(FX_TMU1
,
1055 fxMesa
->tmuSrc
= FX_TMU0
;
1059 grTexCombine(GR_TMU0
,
1060 GR_COMBINE_FUNCTION_BLEND
,
1061 GR_COMBINE_FACTOR_ONE
,
1062 GR_COMBINE_FUNCTION_BLEND
,
1063 GR_COMBINE_FACTOR_ONE
,
1067 /* [dBorca] why, oh why? doesn't work! stupid Glide? */
1068 fxMesa
->Glide
.grTexAlphaCombineExt(FX_TMU0
,
1069 GR_CMBX_OTHER_TEXTURE_ALPHA
,
1079 fxMesa
->Glide
.grTexColorCombineExt(FX_TMU0
,
1080 GR_CMBX_OTHER_TEXTURE_RGB
,
1092 fxMesa
->tmuSrc
= FX_TMU1
;
1098 fxSetupTextureSingleTMUNapalm_NoLock(GLcontext
* ctx
, GLuint textureset
)
1100 fxMesaContext fxMesa
= FX_CONTEXT(ctx
);
1103 struct gl_texture_object
*tObj
= ctx
->Texture
.Unit
[textureset
]._Current
;
1106 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
1107 fprintf(stderr
, "fxSetupTextureSingleTMUNapalm_NoLock(%d)\n", textureset
);
1110 ti
= fxTMGetTexInfo(tObj
);
1112 fxTexValidate(ctx
, tObj
);
1114 fxSetupSingleTMU_NoLock(fxMesa
, tObj
);
1116 if (ti
->whichTMU
== FX_TMU_BOTH
)
1120 if (fxMesa
->tmuSrc
!= tmu
)
1121 fxSelectSingleTMUSrcNapalm_NoLock(fxMesa
, tmu
, ti
->LODblend
);
1123 if (textureset
== 0 || !fxMesa
->haveTwoTMUs
)
1124 unitsmode
= fxGetTexSetConfiguration(ctx
, tObj
, NULL
);
1126 unitsmode
= fxGetTexSetConfiguration(ctx
, NULL
, tObj
);
1128 /* if(fxMesa->lastUnitsMode==unitsmode) */
1131 fxMesa
->lastUnitsMode
= unitsmode
;
1133 fxMesa
->stw_hint_state
= 0;
1134 FX_grHints_NoLock(GR_HINT_STWHINT
, 0);
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
));
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?
1144 fxSetupTextureEnvNapalm_NoLock(ctx
, textureset
, tmu
, GL_TRUE
);
1148 /************************* Double Texture Set ***************************/
1151 fxSetupTextureDoubleTMUNapalm_NoLock(GLcontext
* ctx
)
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
;
1158 int tmu0
= 0, tmu1
= 1;
1160 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
1161 fprintf(stderr
, "fxSetupTextureDoubleTMUNapalm_NoLock(...)\n");
1164 ti0
= fxTMGetTexInfo(tObj0
);
1165 fxTexValidate(ctx
, tObj0
);
1167 ti1
= fxTMGetTexInfo(tObj1
);
1168 fxTexValidate(ctx
, tObj1
);
1170 fxSetupDoubleTMU_NoLock(fxMesa
, tObj0
, tObj1
);
1172 unitsmode
= fxGetTexSetConfiguration(ctx
, tObj0
, tObj1
);
1174 /* if(fxMesa->lastUnitsMode==unitsmode) */
1177 fxMesa
->lastUnitsMode
= unitsmode
;
1179 fxMesa
->stw_hint_state
|= GR_STWHINT_ST_DIFF_TMU1
;
1180 FX_grHints_NoLock(GR_HINT_STWHINT
, fxMesa
->stw_hint_state
);
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
));
1188 if ((ti0
->whichTMU
== FX_TMU1
) || (ti1
->whichTMU
== FX_TMU0
)) {
1192 fxMesa
->tmuSrc
= FX_TMU_BOTH
;
1194 /* OpenGL vs Glide texture pipeline */
1195 fxSetupTextureEnvNapalm_NoLock(ctx
, 0, 1, GL_TRUE
);
1196 fxSetupTextureEnvNapalm_NoLock(ctx
, 1, 0, GL_FALSE
);
1199 /************************* No Texture ***************************/
1202 fxSetupTextureNoneNapalm_NoLock(GLcontext
* ctx
)
1204 fxMesaContext fxMesa
= FX_CONTEXT(ctx
);
1206 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
1207 fprintf(stderr
, "fxSetupTextureNoneNapalm_NoLock(...)\n");
1210 /* the combiner formula is: (A + B) * C + D
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
1222 fxMesa
->Glide
.grColorCombineExt(GR_CMBX_ITRGB
,
1232 fxMesa
->Glide
.grAlphaCombineExt(GR_CMBX_ITALPHA
,
1243 fxMesa
->lastUnitsMode
= FX_UM_NONE
;