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 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
566 fprintf(stderr
, "fxSetupTextureEnvNapalm_NoLock: %x Texture.EnvMode not yet supported\n",
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
,
584 fxMesa
->Glide
.grAlphaCombineExt(GR_CMBX_TEXTURE_ALPHA
,
595 fxMesa
->Glide
.grTexAlphaCombineExt(tmu
,
606 fxMesa
->Glide
.grTexColorCombineExt(tmu
,
620 /************************* Single Texture Set ***************************/
623 fxSelectSingleTMUSrcNapalm_NoLock(fxMesaContext fxMesa
, GLint tmu
, FxBool LODblend
)
625 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
626 fprintf(stderr
, "fxSelectSingleTMUSrcNapalm_NoLock(%d, %d)\n", tmu
, LODblend
);
630 /* XXX todo - GR_CMBX_LOD_FRAC? */
631 fxMesa
->tmuSrc
= FX_TMU_SPLIT
;
634 if (tmu
!= FX_TMU1
) {
636 if (fxMesa
->haveTwoTMUs
) {
637 fxMesa
->Glide
.grTexAlphaCombineExt(FX_TMU1
,
648 fxMesa
->Glide
.grTexColorCombineExt(FX_TMU1
,
661 fxMesa
->tmuSrc
= FX_TMU0
;
665 grTexCombine(GR_TMU0
,
666 GR_COMBINE_FUNCTION_BLEND
,
667 GR_COMBINE_FACTOR_ONE
,
668 GR_COMBINE_FUNCTION_BLEND
,
669 GR_COMBINE_FACTOR_ONE
,
673 /* [dBorca] why, oh why? doesn't work! stupid Glide? */
674 fxMesa
->Glide
.grTexAlphaCombineExt(FX_TMU0
,
675 GR_CMBX_OTHER_TEXTURE_ALPHA
,
685 fxMesa
->Glide
.grTexColorCombineExt(FX_TMU0
,
686 GR_CMBX_OTHER_TEXTURE_RGB
,
698 fxMesa
->tmuSrc
= FX_TMU1
;
704 fxSetupTextureSingleTMUNapalm_NoLock(GLcontext
* ctx
, GLuint textureset
)
706 fxMesaContext fxMesa
= FX_CONTEXT(ctx
);
709 struct gl_texture_object
*tObj
= ctx
->Texture
.Unit
[textureset
]._Current
;
712 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
713 fprintf(stderr
, "fxSetupTextureSingleTMUNapalm_NoLock(%d)\n", textureset
);
716 ti
= fxTMGetTexInfo(tObj
);
718 fxTexValidate(ctx
, tObj
);
720 fxSetupSingleTMU_NoLock(fxMesa
, tObj
);
722 if (ti
->whichTMU
== FX_TMU_BOTH
)
726 if (fxMesa
->tmuSrc
!= tmu
)
727 fxSelectSingleTMUSrcNapalm_NoLock(fxMesa
, tmu
, ti
->LODblend
);
729 if (textureset
== 0 || !fxMesa
->haveTwoTMUs
)
730 unitsmode
= fxGetTexSetConfiguration(ctx
, tObj
, NULL
);
732 unitsmode
= fxGetTexSetConfiguration(ctx
, NULL
, tObj
);
734 /* if(fxMesa->lastUnitsMode==unitsmode) */
737 fxMesa
->lastUnitsMode
= unitsmode
;
739 fxMesa
->stw_hint_state
= 0;
740 FX_grHints_NoLock(GR_HINT_STWHINT
, 0);
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
));
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?
750 fxSetupTextureEnvNapalm_NoLock(ctx
, textureset
, tmu
, GL_TRUE
);
754 /************************* Double Texture Set ***************************/
757 fxSetupTextureDoubleTMUNapalm_NoLock(GLcontext
* ctx
)
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
;
764 int tmu0
= 0, tmu1
= 1;
766 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
767 fprintf(stderr
, "fxSetupTextureDoubleTMUNapalm_NoLock(...)\n");
770 ti0
= fxTMGetTexInfo(tObj0
);
771 fxTexValidate(ctx
, tObj0
);
773 ti1
= fxTMGetTexInfo(tObj1
);
774 fxTexValidate(ctx
, tObj1
);
776 fxSetupDoubleTMU_NoLock(fxMesa
, tObj0
, tObj1
);
778 unitsmode
= fxGetTexSetConfiguration(ctx
, tObj0
, tObj1
);
780 /* if(fxMesa->lastUnitsMode==unitsmode) */
783 fxMesa
->lastUnitsMode
= unitsmode
;
785 fxMesa
->stw_hint_state
|= GR_STWHINT_ST_DIFF_TMU1
;
786 FX_grHints_NoLock(GR_HINT_STWHINT
, fxMesa
->stw_hint_state
);
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
));
794 if ((ti0
->whichTMU
== FX_TMU1
) || (ti1
->whichTMU
== FX_TMU0
)) {
798 fxMesa
->tmuSrc
= FX_TMU_BOTH
;
800 /* OpenGL vs Glide texture pipeline */
801 fxSetupTextureEnvNapalm_NoLock(ctx
, 0, 1, GL_TRUE
);
802 fxSetupTextureEnvNapalm_NoLock(ctx
, 1, 0, GL_FALSE
);
805 /************************* No Texture ***************************/
808 fxSetupTextureNoneNapalm_NoLock(GLcontext
* ctx
)
810 fxMesaContext fxMesa
= FX_CONTEXT(ctx
);
812 if (TDFX_DEBUG
& VERBOSE_DRIVER
) {
813 fprintf(stderr
, "fxSetupTextureNoneNapalm_NoLock(...)\n");
816 /* the combiner formula is: (A + B) * C + D
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
828 fxMesa
->Glide
.grColorCombineExt(GR_CMBX_ITRGB
,
838 fxMesa
->Glide
.grAlphaCombineExt(GR_CMBX_ITALPHA
,
849 fxMesa
->lastUnitsMode
= FX_UM_NONE
;