1 /**************************************************************************
3 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
6 **************************************************************************/
11 #include "simple_list.h"
13 #include "texformat.h"
18 #include "intel_screen.h"
19 #include "intel_ioctl.h"
20 #include "intel_tex.h"
22 #include "i830_context.h"
26 /* ================================================================
27 * Texture combine functions
29 static GLuint
pass_through( GLuint
*state
, GLuint blendUnit
)
31 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
33 ENABLE_TEXOUTPUT_WRT_SEL
|
34 TEXOP_OUTPUT_CURRENT
|
35 DISABLE_TEX_CNTRL_STAGE
|
39 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
41 ENABLE_TEXOUTPUT_WRT_SEL
|
42 TEXOP_OUTPUT_CURRENT
|
46 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
49 TEXBLENDARG_MODIFY_PARMS
|
51 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
54 TEXBLENDARG_MODIFY_PARMS
|
60 static GLuint
emit_factor( GLuint blendUnit
, GLuint
*state
, GLuint count
,
61 const GLfloat
*factor
)
67 fprintf(stderr
, "emit constant %d: %.2f %.2f %.2f %.2f\n",
68 blendUnit
, factor
[0], factor
[1], factor
[2], factor
[3]);
70 UNCLAMPED_FLOAT_TO_UBYTE(r
, factor
[0]);
71 UNCLAMPED_FLOAT_TO_UBYTE(g
, factor
[1]);
72 UNCLAMPED_FLOAT_TO_UBYTE(b
, factor
[2]);
73 UNCLAMPED_FLOAT_TO_UBYTE(a
, factor
[3]);
75 col
= ((a
<< 24) | (r
<< 16) | (g
<< 8) | b
);
77 state
[count
++] = _3DSTATE_COLOR_FACTOR_N_CMD(blendUnit
);
84 static __inline__ GLuint
GetTexelOp(GLint unit
)
87 case 0: return TEXBLENDARG_TEXEL0
;
88 case 1: return TEXBLENDARG_TEXEL1
;
89 case 2: return TEXBLENDARG_TEXEL2
;
90 case 3: return TEXBLENDARG_TEXEL3
;
91 default: return TEXBLENDARG_TEXEL0
;
96 GLuint
i830SetBlend_GL1_2(i830ContextPtr i830
, int blendUnit
,
97 GLenum envMode
, GLenum format
, GLuint texel_op
,
98 GLuint
*state
, const GLfloat
*factor
)
100 if(INTEL_DEBUG
&DEBUG_TEXTURE
)
101 fprintf(stderr
, "%s %s %s texel_op(0x%x)\n",
103 _mesa_lookup_enum_by_nr(format
),
104 _mesa_lookup_enum_by_nr(envMode
),
111 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
113 ENABLE_TEXOUTPUT_WRT_SEL
|
114 TEXOP_OUTPUT_CURRENT
|
115 DISABLE_TEX_CNTRL_STAGE
|
119 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
121 ENABLE_TEXOUTPUT_WRT_SEL
|
122 TEXOP_OUTPUT_CURRENT
|
126 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
129 TEXBLENDARG_MODIFY_PARMS
|
130 TEXBLENDARG_CURRENT
);
131 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
134 TEXBLENDARG_MODIFY_PARMS
|
141 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
143 ENABLE_TEXOUTPUT_WRT_SEL
|
144 TEXOP_OUTPUT_CURRENT
|
145 DISABLE_TEX_CNTRL_STAGE
|
149 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
151 ENABLE_TEXOUTPUT_WRT_SEL
|
152 TEXOP_OUTPUT_CURRENT
|
156 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
159 TEXBLENDARG_MODIFY_PARMS
|
161 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
164 TEXBLENDARG_MODIFY_PARMS
|
165 TEXBLENDARG_CURRENT
);
169 case GL_LUMINANCE_ALPHA
:
171 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
173 ENABLE_TEXOUTPUT_WRT_SEL
|
174 TEXOP_OUTPUT_CURRENT
|
175 DISABLE_TEX_CNTRL_STAGE
|
179 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
181 ENABLE_TEXOUTPUT_WRT_SEL
|
182 TEXOP_OUTPUT_CURRENT
|
186 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
189 TEXBLENDARG_MODIFY_PARMS
|
191 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
194 TEXBLENDARG_MODIFY_PARMS
|
199 /* Always set to passthru if something is funny */
200 return pass_through( state
, blendUnit
);
206 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
208 ENABLE_TEXOUTPUT_WRT_SEL
|
209 TEXOP_OUTPUT_CURRENT
|
210 DISABLE_TEX_CNTRL_STAGE
|
214 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
216 ENABLE_TEXOUTPUT_WRT_SEL
|
217 TEXOP_OUTPUT_CURRENT
|
220 TEXBLENDOP_MODULATE
);
221 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
224 TEXBLENDARG_MODIFY_PARMS
|
225 TEXBLENDARG_CURRENT
);
226 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
229 TEXBLENDARG_MODIFY_PARMS
|
231 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
234 TEXBLENDARG_MODIFY_PARMS
|
235 TEXBLENDARG_CURRENT
);
241 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
243 ENABLE_TEXOUTPUT_WRT_SEL
|
244 TEXOP_OUTPUT_CURRENT
|
245 DISABLE_TEX_CNTRL_STAGE
|
248 TEXBLENDOP_MODULATE
);
249 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
251 ENABLE_TEXOUTPUT_WRT_SEL
|
252 TEXOP_OUTPUT_CURRENT
|
256 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
259 TEXBLENDARG_MODIFY_PARMS
|
261 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
264 TEXBLENDARG_MODIFY_PARMS
|
265 TEXBLENDARG_CURRENT
);
266 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
269 TEXBLENDARG_MODIFY_PARMS
|
270 TEXBLENDARG_CURRENT
);
274 case GL_LUMINANCE_ALPHA
:
276 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
278 ENABLE_TEXOUTPUT_WRT_SEL
|
279 TEXOP_OUTPUT_CURRENT
|
280 DISABLE_TEX_CNTRL_STAGE
|
283 TEXBLENDOP_MODULATE
);
284 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
286 ENABLE_TEXOUTPUT_WRT_SEL
|
287 TEXOP_OUTPUT_CURRENT
|
290 TEXBLENDOP_MODULATE
);
291 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
294 TEXBLENDARG_MODIFY_PARMS
|
296 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
299 TEXBLENDARG_MODIFY_PARMS
|
300 TEXBLENDARG_CURRENT
);
301 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
304 TEXBLENDARG_MODIFY_PARMS
|
306 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
309 TEXBLENDARG_MODIFY_PARMS
|
310 TEXBLENDARG_CURRENT
);
314 /* Always set to passthru if something is funny */
315 return pass_through( state
, blendUnit
);
322 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
324 ENABLE_TEXOUTPUT_WRT_SEL
|
325 TEXOP_OUTPUT_CURRENT
|
326 DISABLE_TEX_CNTRL_STAGE
|
330 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
332 ENABLE_TEXOUTPUT_WRT_SEL
|
333 TEXOP_OUTPUT_CURRENT
|
337 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
340 TEXBLENDARG_MODIFY_PARMS
|
342 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
345 TEXBLENDARG_MODIFY_PARMS
|
346 TEXBLENDARG_CURRENT
);
350 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
352 ENABLE_TEXOUTPUT_WRT_SEL
|
353 TEXOP_OUTPUT_CURRENT
|
354 DISABLE_TEX_CNTRL_STAGE
|
358 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
360 ENABLE_TEXOUTPUT_WRT_SEL
|
361 TEXOP_OUTPUT_CURRENT
|
365 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
368 TEXBLENDARG_MODIFY_PARMS
|
369 TEXBLENDARG_REPLICATE_ALPHA
|
371 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
374 TEXBLENDARG_MODIFY_PARMS
|
376 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
379 TEXBLENDARG_MODIFY_PARMS
|
380 TEXBLENDARG_CURRENT
);
381 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
384 TEXBLENDARG_MODIFY_PARMS
|
385 TEXBLENDARG_CURRENT
);
388 /* Always set to passthru if something is funny */
389 return pass_through( state
, blendUnit
);
395 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
397 ENABLE_TEXOUTPUT_WRT_SEL
|
398 TEXOP_OUTPUT_CURRENT
|
399 DISABLE_TEX_CNTRL_STAGE
|
403 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
405 ENABLE_TEXOUTPUT_WRT_SEL
|
406 TEXOP_OUTPUT_CURRENT
|
409 TEXBLENDOP_MODULATE
);
410 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
413 TEXBLENDARG_MODIFY_PARMS
|
414 TEXBLENDARG_CURRENT
);
415 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
418 TEXBLENDARG_MODIFY_PARMS
|
420 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
423 TEXBLENDARG_MODIFY_PARMS
|
424 TEXBLENDARG_CURRENT
);
430 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
432 ENABLE_TEXOUTPUT_WRT_SEL
|
433 TEXOP_OUTPUT_CURRENT
|
434 DISABLE_TEX_CNTRL_STAGE
|
438 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
440 ENABLE_TEXOUTPUT_WRT_SEL
|
441 TEXOP_OUTPUT_CURRENT
|
445 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
448 TEXBLENDARG_MODIFY_PARMS
|
450 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
453 TEXBLENDARG_MODIFY_PARMS
|
454 TEXBLENDARG_FACTOR_N
);
455 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
458 TEXBLENDARG_MODIFY_PARMS
|
459 TEXBLENDARG_CURRENT
);
460 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
463 TEXBLENDARG_MODIFY_PARMS
|
464 TEXBLENDARG_CURRENT
);
465 return emit_factor( blendUnit
, state
, 6, factor
);
468 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
470 ENABLE_TEXOUTPUT_WRT_SEL
|
471 TEXOP_OUTPUT_CURRENT
|
472 DISABLE_TEX_CNTRL_STAGE
|
476 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
478 ENABLE_TEXOUTPUT_WRT_SEL
|
479 TEXOP_OUTPUT_CURRENT
|
483 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
486 TEXBLENDARG_MODIFY_PARMS
|
488 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
491 TEXBLENDARG_MODIFY_PARMS
|
492 TEXBLENDARG_FACTOR_N
);
493 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
496 TEXBLENDARG_MODIFY_PARMS
|
497 TEXBLENDARG_CURRENT
);
498 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
501 TEXBLENDARG_MODIFY_PARMS
|
503 state
[6] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
506 TEXBLENDARG_MODIFY_PARMS
|
507 TEXBLENDARG_FACTOR_N
);
508 state
[7] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
511 TEXBLENDARG_MODIFY_PARMS
|
512 TEXBLENDARG_CURRENT
);
513 return emit_factor( blendUnit
, state
, 8, factor
);
516 case GL_LUMINANCE_ALPHA
:
518 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
520 ENABLE_TEXOUTPUT_WRT_SEL
|
521 TEXOP_OUTPUT_CURRENT
|
522 DISABLE_TEX_CNTRL_STAGE
|
526 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
528 ENABLE_TEXOUTPUT_WRT_SEL
|
529 TEXOP_OUTPUT_CURRENT
|
532 TEXBLENDOP_MODULATE
);
533 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
536 TEXBLENDARG_MODIFY_PARMS
|
538 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
541 TEXBLENDARG_MODIFY_PARMS
|
542 TEXBLENDARG_FACTOR_N
);
543 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
546 TEXBLENDARG_MODIFY_PARMS
|
547 TEXBLENDARG_CURRENT
);
548 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
551 TEXBLENDARG_MODIFY_PARMS
|
553 state
[6] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
556 TEXBLENDARG_MODIFY_PARMS
|
557 TEXBLENDARG_CURRENT
);
558 return emit_factor( blendUnit
, state
, 7, factor
);
561 /* Always set to passthru if something is funny */
562 return pass_through( state
, blendUnit
);
568 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
570 ENABLE_TEXOUTPUT_WRT_SEL
|
571 TEXOP_OUTPUT_CURRENT
|
572 DISABLE_TEX_CNTRL_STAGE
|
576 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
578 ENABLE_TEXOUTPUT_WRT_SEL
|
579 TEXOP_OUTPUT_CURRENT
|
582 TEXBLENDOP_MODULATE
);
583 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
586 TEXBLENDARG_MODIFY_PARMS
|
587 TEXBLENDARG_CURRENT
);
588 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
591 TEXBLENDARG_MODIFY_PARMS
|
593 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
596 TEXBLENDARG_MODIFY_PARMS
|
597 TEXBLENDARG_CURRENT
);
603 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
605 ENABLE_TEXOUTPUT_WRT_SEL
|
606 TEXOP_OUTPUT_CURRENT
|
607 DISABLE_TEX_CNTRL_STAGE
|
611 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
613 ENABLE_TEXOUTPUT_WRT_SEL
|
614 TEXOP_OUTPUT_CURRENT
|
618 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
621 TEXBLENDARG_MODIFY_PARMS
|
623 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
626 TEXBLENDARG_MODIFY_PARMS
|
627 TEXBLENDARG_CURRENT
);
628 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
631 TEXBLENDARG_MODIFY_PARMS
|
632 TEXBLENDARG_CURRENT
);
636 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
638 ENABLE_TEXOUTPUT_WRT_SEL
|
639 TEXOP_OUTPUT_CURRENT
|
640 DISABLE_TEX_CNTRL_STAGE
|
644 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
646 ENABLE_TEXOUTPUT_WRT_SEL
|
647 TEXOP_OUTPUT_CURRENT
|
651 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
654 TEXBLENDARG_MODIFY_PARMS
|
656 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
659 TEXBLENDARG_MODIFY_PARMS
|
660 TEXBLENDARG_CURRENT
);
661 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
664 TEXBLENDARG_MODIFY_PARMS
|
666 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
669 TEXBLENDARG_MODIFY_PARMS
|
670 TEXBLENDARG_CURRENT
);
673 case GL_LUMINANCE_ALPHA
:
675 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
677 ENABLE_TEXOUTPUT_WRT_SEL
|
678 TEXOP_OUTPUT_CURRENT
|
679 DISABLE_TEX_CNTRL_STAGE
|
683 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
685 ENABLE_TEXOUTPUT_WRT_SEL
|
686 TEXOP_OUTPUT_CURRENT
|
689 TEXBLENDOP_MODULATE
);
690 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
693 TEXBLENDARG_MODIFY_PARMS
|
695 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
698 TEXBLENDARG_MODIFY_PARMS
|
699 TEXBLENDARG_CURRENT
);
700 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
703 TEXBLENDARG_MODIFY_PARMS
|
705 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
708 TEXBLENDARG_MODIFY_PARMS
|
709 TEXBLENDARG_CURRENT
);
713 /* Always set to passthru if something is funny */
714 return pass_through( state
, blendUnit
);
718 /* Always set to passthru if something is funny */
719 return pass_through( state
, blendUnit
);
723 static GLuint
i830SetTexEnvCombine(i830ContextPtr i830
,
724 const struct gl_texture_unit
*texUnit
,
728 const GLfloat
*factor
)
736 GLboolean need_factor
= 0;
739 if(INTEL_DEBUG
&DEBUG_TEXTURE
)
740 fprintf(stderr
, "%s\n", __FUNCTION__
);
743 /* The EXT version of the DOT3 extension does not support the
744 * scale factor, but the ARB version (and the version in OpenGL
747 switch (texUnit
->Combine
.ModeRGB
) {
748 case GL_DOT3_RGB_EXT
:
749 alpha_shift
= texUnit
->Combine
.ScaleShiftA
;
753 case GL_DOT3_RGBA_EXT
:
759 rgb_shift
= texUnit
->Combine
.ScaleShiftRGB
;
760 alpha_shift
= texUnit
->Combine
.ScaleShiftA
;
765 switch(texUnit
->Combine
.ModeRGB
) {
767 blendop
= TEXBLENDOP_ARG1
;
770 blendop
= TEXBLENDOP_MODULATE
;
773 blendop
= TEXBLENDOP_ADD
;
776 blendop
= TEXBLENDOP_ADDSIGNED
;
779 blendop
= TEXBLENDOP_BLEND
;
782 blendop
= TEXBLENDOP_SUBTRACT
;
784 case GL_DOT3_RGB_EXT
:
786 blendop
= TEXBLENDOP_DOT3
;
788 case GL_DOT3_RGBA_EXT
:
790 blendop
= TEXBLENDOP_DOT3
;
793 return pass_through( state
, blendUnit
);
796 blendop
|= (rgb_shift
<< TEXOP_SCALE_SHIFT
);
799 /* Handle RGB args */
800 for(i
= 0; i
< 3; i
++) {
801 switch(texUnit
->Combine
.SourceRGB
[i
]) {
803 args_RGB
[i
] = texel_op
;
806 args_RGB
[i
] = TEXBLENDARG_FACTOR_N
;
809 case GL_PRIMARY_COLOR
:
810 args_RGB
[i
] = TEXBLENDARG_DIFFUSE
;
813 args_RGB
[i
] = TEXBLENDARG_CURRENT
;
816 return pass_through( state
, blendUnit
);
819 switch(texUnit
->Combine
.OperandRGB
[i
]) {
823 case GL_ONE_MINUS_SRC_COLOR
:
824 args_RGB
[i
] |= TEXBLENDARG_INV_ARG
;
827 args_RGB
[i
] |= TEXBLENDARG_REPLICATE_ALPHA
;
829 case GL_ONE_MINUS_SRC_ALPHA
:
830 args_RGB
[i
] |= (TEXBLENDARG_REPLICATE_ALPHA
|
831 TEXBLENDARG_INV_ARG
);
834 return pass_through( state
, blendUnit
);
839 /* Need to knobble the alpha calculations of TEXBLENDOP_DOT4 to
840 * match the spec. Can't use DOT3 as it won't propogate values
841 * into alpha as required:
843 * Note - the global factor is set up with alpha == .5, so
844 * the alpha part of the DOT4 calculation should be zero.
846 if ( texUnit
->Combine
.ModeRGB
== GL_DOT3_RGBA_EXT
||
847 texUnit
->Combine
.ModeRGB
== GL_DOT3_RGBA
) {
848 ablendop
= TEXBLENDOP_DOT4
;
849 args_A
[0] = TEXBLENDARG_FACTOR
; /* the global factor */
850 args_A
[1] = TEXBLENDARG_FACTOR
;
851 args_A
[2] = TEXBLENDARG_FACTOR
;
854 switch(texUnit
->Combine
.ModeA
) {
856 ablendop
= TEXBLENDOP_ARG1
;
859 ablendop
= TEXBLENDOP_MODULATE
;
862 ablendop
= TEXBLENDOP_ADD
;
865 ablendop
= TEXBLENDOP_ADDSIGNED
;
868 ablendop
= TEXBLENDOP_BLEND
;
871 ablendop
= TEXBLENDOP_SUBTRACT
;
874 return pass_through( state
, blendUnit
);
878 ablendop
|= (alpha_shift
<< TEXOP_SCALE_SHIFT
);
881 for(i
= 0; i
< 3; i
++) {
882 switch(texUnit
->Combine
.SourceA
[i
]) {
884 args_A
[i
] = texel_op
;
887 args_A
[i
] = TEXBLENDARG_FACTOR_N
;
890 case GL_PRIMARY_COLOR
:
891 args_A
[i
] = TEXBLENDARG_DIFFUSE
;
894 args_A
[i
] = TEXBLENDARG_CURRENT
;
897 return pass_through( state
, blendUnit
);
900 switch(texUnit
->Combine
.OperandA
[i
]) {
904 case GL_ONE_MINUS_SRC_ALPHA
:
905 args_A
[i
] |= TEXBLENDARG_INV_ARG
;
908 return pass_through( state
, blendUnit
);
915 /* Native Arg1 == Arg0 in GL_EXT_texture_env_combine spec */
916 /* Native Arg2 == Arg1 in GL_EXT_texture_env_combine spec */
917 /* Native Arg0 == Arg2 in GL_EXT_texture_env_combine spec */
919 /* When we render we need to figure out which is the last really enabled
920 * tex unit, and put last stage on it
924 /* Build color pipeline */
926 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
928 ENABLE_TEXOUTPUT_WRT_SEL
|
929 TEXOP_OUTPUT_CURRENT
|
930 DISABLE_TEX_CNTRL_STAGE
|
933 state
[1] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
936 TEXBLENDARG_MODIFY_PARMS
|
938 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
941 TEXBLENDARG_MODIFY_PARMS
|
943 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
946 TEXBLENDARG_MODIFY_PARMS
|
949 /* Build Alpha pipeline */
950 state
[4] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
952 ENABLE_TEXOUTPUT_WRT_SEL
|
953 TEXOP_OUTPUT_CURRENT
|
956 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
959 TEXBLENDARG_MODIFY_PARMS
|
961 state
[6] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
964 TEXBLENDARG_MODIFY_PARMS
|
966 state
[7] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
969 TEXBLENDARG_MODIFY_PARMS
|
974 return emit_factor( blendUnit
, state
, 8, factor
);
980 static void emit_texblend( i830ContextPtr i830
, GLuint unit
, GLuint blendUnit
,
981 GLboolean last_stage
)
983 struct gl_texture_unit
*texUnit
= &i830
->intel
.ctx
.Texture
.Unit
[unit
];
984 struct gl_texture_object
*tObj
= texUnit
->_Current
;
985 i830TextureObjectPtr t
= (i830TextureObjectPtr
)tObj
->DriverData
;
986 GLuint tmp
[I830_TEXBLEND_SIZE
], tmp_sz
;
989 if (0) fprintf(stderr
, "%s unit %d\n", __FUNCTION__
, unit
);
991 /* Update i830->state.TexBlend
993 if (texUnit
->EnvMode
== GL_COMBINE
) {
994 tmp_sz
= i830SetTexEnvCombine(i830
, texUnit
, blendUnit
,
995 GetTexelOp(unit
), tmp
,
999 tmp_sz
= i830SetBlend_GL1_2(i830
, blendUnit
, texUnit
->EnvMode
,
1000 t
->intel
.image
[0][0].internalFormat
,
1001 GetTexelOp(unit
), tmp
,
1002 texUnit
->EnvColor
);
1006 tmp
[0] |= TEXOP_LAST_STAGE
;
1008 if (tmp_sz
!= i830
->state
.TexBlendWordsUsed
[blendUnit
] ||
1009 memcmp( tmp
, i830
->state
.TexBlend
[blendUnit
], tmp_sz
* sizeof(GLuint
))) {
1011 I830_STATECHANGE( i830
, I830_UPLOAD_TEXBLEND(blendUnit
) );
1012 memcpy( i830
->state
.TexBlend
[blendUnit
], tmp
, tmp_sz
* sizeof(GLuint
));
1013 i830
->state
.TexBlendWordsUsed
[blendUnit
] = tmp_sz
;
1016 I830_ACTIVESTATE(i830
, I830_UPLOAD_TEXBLEND(blendUnit
), GL_TRUE
);
1019 static void emit_passthrough( i830ContextPtr i830
)
1021 GLuint tmp
[I830_TEXBLEND_SIZE
], tmp_sz
;
1024 tmp_sz
= pass_through( tmp
, unit
);
1025 tmp
[0] |= TEXOP_LAST_STAGE
;
1027 if (tmp_sz
!= i830
->state
.TexBlendWordsUsed
[unit
] ||
1028 memcmp( tmp
, i830
->state
.TexBlend
[unit
], tmp_sz
* sizeof(GLuint
))) {
1030 I830_STATECHANGE( i830
, I830_UPLOAD_TEXBLEND(unit
) );
1031 memcpy( i830
->state
.TexBlend
[unit
], tmp
, tmp_sz
* sizeof(GLuint
));
1032 i830
->state
.TexBlendWordsUsed
[unit
] = tmp_sz
;
1035 I830_ACTIVESTATE(i830
, I830_UPLOAD_TEXBLEND(unit
), GL_TRUE
);
1038 void i830EmitTextureBlend( i830ContextPtr i830
)
1040 GLcontext
*ctx
= &i830
->intel
.ctx
;
1041 GLuint unit
, last_stage
= 0, blendunit
= 0;
1043 I830_ACTIVESTATE(i830
, I830_UPLOAD_TEXBLEND_ALL
, GL_FALSE
);
1045 if (ctx
->Texture
._EnabledUnits
) {
1046 for (unit
= 0 ; unit
< ctx
->Const
.MaxTextureUnits
; unit
++)
1047 if (ctx
->Texture
.Unit
[unit
]._ReallyEnabled
)
1050 for (unit
= 0 ; unit
< ctx
->Const
.MaxTextureUnits
; unit
++)
1051 if (ctx
->Texture
.Unit
[unit
]._ReallyEnabled
)
1052 emit_texblend( i830
, unit
, blendunit
++, last_stage
== unit
);
1055 emit_passthrough( i830
);