1 /**************************************************************************
3 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
31 #include "simple_list.h"
33 #include "texformat.h"
38 #include "intel_screen.h"
39 #include "intel_ioctl.h"
40 #include "intel_tex.h"
42 #include "i830_context.h"
46 /* ================================================================
47 * Texture combine functions
49 static GLuint
pass_through( GLuint
*state
, GLuint blendUnit
)
51 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
53 ENABLE_TEXOUTPUT_WRT_SEL
|
54 TEXOP_OUTPUT_CURRENT
|
55 DISABLE_TEX_CNTRL_STAGE
|
59 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
61 ENABLE_TEXOUTPUT_WRT_SEL
|
62 TEXOP_OUTPUT_CURRENT
|
66 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
69 TEXBLENDARG_MODIFY_PARMS
|
71 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
74 TEXBLENDARG_MODIFY_PARMS
|
80 static GLuint
emit_factor( GLuint blendUnit
, GLuint
*state
, GLuint count
,
81 const GLfloat
*factor
)
87 fprintf(stderr
, "emit constant %d: %.2f %.2f %.2f %.2f\n",
88 blendUnit
, factor
[0], factor
[1], factor
[2], factor
[3]);
90 UNCLAMPED_FLOAT_TO_UBYTE(r
, factor
[0]);
91 UNCLAMPED_FLOAT_TO_UBYTE(g
, factor
[1]);
92 UNCLAMPED_FLOAT_TO_UBYTE(b
, factor
[2]);
93 UNCLAMPED_FLOAT_TO_UBYTE(a
, factor
[3]);
95 col
= ((a
<< 24) | (r
<< 16) | (g
<< 8) | b
);
97 state
[count
++] = _3DSTATE_COLOR_FACTOR_N_CMD(blendUnit
);
104 static __inline__ GLuint
GetTexelOp(GLint unit
)
107 case 0: return TEXBLENDARG_TEXEL0
;
108 case 1: return TEXBLENDARG_TEXEL1
;
109 case 2: return TEXBLENDARG_TEXEL2
;
110 case 3: return TEXBLENDARG_TEXEL3
;
111 default: return TEXBLENDARG_TEXEL0
;
116 GLuint
i830SetBlend_GL1_2(i830ContextPtr i830
, int blendUnit
,
117 GLenum envMode
, GLenum format
, GLuint texel_op
,
118 GLuint
*state
, const GLfloat
*factor
)
120 if(INTEL_DEBUG
&DEBUG_TEXTURE
)
121 fprintf(stderr
, "%s %s %s texel_op(0x%x)\n",
123 _mesa_lookup_enum_by_nr(format
),
124 _mesa_lookup_enum_by_nr(envMode
),
131 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
133 ENABLE_TEXOUTPUT_WRT_SEL
|
134 TEXOP_OUTPUT_CURRENT
|
135 DISABLE_TEX_CNTRL_STAGE
|
139 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
141 ENABLE_TEXOUTPUT_WRT_SEL
|
142 TEXOP_OUTPUT_CURRENT
|
146 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
149 TEXBLENDARG_MODIFY_PARMS
|
150 TEXBLENDARG_CURRENT
);
151 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
154 TEXBLENDARG_MODIFY_PARMS
|
161 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
163 ENABLE_TEXOUTPUT_WRT_SEL
|
164 TEXOP_OUTPUT_CURRENT
|
165 DISABLE_TEX_CNTRL_STAGE
|
169 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
171 ENABLE_TEXOUTPUT_WRT_SEL
|
172 TEXOP_OUTPUT_CURRENT
|
176 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
179 TEXBLENDARG_MODIFY_PARMS
|
181 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
184 TEXBLENDARG_MODIFY_PARMS
|
185 TEXBLENDARG_CURRENT
);
189 case GL_LUMINANCE_ALPHA
:
191 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
193 ENABLE_TEXOUTPUT_WRT_SEL
|
194 TEXOP_OUTPUT_CURRENT
|
195 DISABLE_TEX_CNTRL_STAGE
|
199 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
201 ENABLE_TEXOUTPUT_WRT_SEL
|
202 TEXOP_OUTPUT_CURRENT
|
206 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
209 TEXBLENDARG_MODIFY_PARMS
|
211 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
214 TEXBLENDARG_MODIFY_PARMS
|
219 /* Always set to passthru if something is funny */
220 return pass_through( state
, blendUnit
);
226 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
228 ENABLE_TEXOUTPUT_WRT_SEL
|
229 TEXOP_OUTPUT_CURRENT
|
230 DISABLE_TEX_CNTRL_STAGE
|
234 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
236 ENABLE_TEXOUTPUT_WRT_SEL
|
237 TEXOP_OUTPUT_CURRENT
|
240 TEXBLENDOP_MODULATE
);
241 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
244 TEXBLENDARG_MODIFY_PARMS
|
245 TEXBLENDARG_CURRENT
);
246 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
249 TEXBLENDARG_MODIFY_PARMS
|
251 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
254 TEXBLENDARG_MODIFY_PARMS
|
255 TEXBLENDARG_CURRENT
);
261 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
263 ENABLE_TEXOUTPUT_WRT_SEL
|
264 TEXOP_OUTPUT_CURRENT
|
265 DISABLE_TEX_CNTRL_STAGE
|
268 TEXBLENDOP_MODULATE
);
269 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
271 ENABLE_TEXOUTPUT_WRT_SEL
|
272 TEXOP_OUTPUT_CURRENT
|
276 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
279 TEXBLENDARG_MODIFY_PARMS
|
281 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
284 TEXBLENDARG_MODIFY_PARMS
|
285 TEXBLENDARG_CURRENT
);
286 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
289 TEXBLENDARG_MODIFY_PARMS
|
290 TEXBLENDARG_CURRENT
);
294 case GL_LUMINANCE_ALPHA
:
296 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
298 ENABLE_TEXOUTPUT_WRT_SEL
|
299 TEXOP_OUTPUT_CURRENT
|
300 DISABLE_TEX_CNTRL_STAGE
|
303 TEXBLENDOP_MODULATE
);
304 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
306 ENABLE_TEXOUTPUT_WRT_SEL
|
307 TEXOP_OUTPUT_CURRENT
|
310 TEXBLENDOP_MODULATE
);
311 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
314 TEXBLENDARG_MODIFY_PARMS
|
316 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
319 TEXBLENDARG_MODIFY_PARMS
|
320 TEXBLENDARG_CURRENT
);
321 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
324 TEXBLENDARG_MODIFY_PARMS
|
326 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
329 TEXBLENDARG_MODIFY_PARMS
|
330 TEXBLENDARG_CURRENT
);
334 /* Always set to passthru if something is funny */
335 return pass_through( state
, blendUnit
);
342 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
344 ENABLE_TEXOUTPUT_WRT_SEL
|
345 TEXOP_OUTPUT_CURRENT
|
346 DISABLE_TEX_CNTRL_STAGE
|
350 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
352 ENABLE_TEXOUTPUT_WRT_SEL
|
353 TEXOP_OUTPUT_CURRENT
|
357 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
360 TEXBLENDARG_MODIFY_PARMS
|
362 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
365 TEXBLENDARG_MODIFY_PARMS
|
366 TEXBLENDARG_CURRENT
);
370 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
372 ENABLE_TEXOUTPUT_WRT_SEL
|
373 TEXOP_OUTPUT_CURRENT
|
374 DISABLE_TEX_CNTRL_STAGE
|
378 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
380 ENABLE_TEXOUTPUT_WRT_SEL
|
381 TEXOP_OUTPUT_CURRENT
|
385 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
388 TEXBLENDARG_MODIFY_PARMS
|
389 TEXBLENDARG_REPLICATE_ALPHA
|
391 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
394 TEXBLENDARG_MODIFY_PARMS
|
396 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
399 TEXBLENDARG_MODIFY_PARMS
|
400 TEXBLENDARG_CURRENT
);
401 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
404 TEXBLENDARG_MODIFY_PARMS
|
405 TEXBLENDARG_CURRENT
);
408 /* Always set to passthru if something is funny */
409 return pass_through( state
, blendUnit
);
415 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
417 ENABLE_TEXOUTPUT_WRT_SEL
|
418 TEXOP_OUTPUT_CURRENT
|
419 DISABLE_TEX_CNTRL_STAGE
|
423 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
425 ENABLE_TEXOUTPUT_WRT_SEL
|
426 TEXOP_OUTPUT_CURRENT
|
429 TEXBLENDOP_MODULATE
);
430 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
433 TEXBLENDARG_MODIFY_PARMS
|
434 TEXBLENDARG_CURRENT
);
435 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
438 TEXBLENDARG_MODIFY_PARMS
|
440 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
443 TEXBLENDARG_MODIFY_PARMS
|
444 TEXBLENDARG_CURRENT
);
450 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
452 ENABLE_TEXOUTPUT_WRT_SEL
|
453 TEXOP_OUTPUT_CURRENT
|
454 DISABLE_TEX_CNTRL_STAGE
|
458 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
460 ENABLE_TEXOUTPUT_WRT_SEL
|
461 TEXOP_OUTPUT_CURRENT
|
465 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
468 TEXBLENDARG_MODIFY_PARMS
|
470 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
473 TEXBLENDARG_MODIFY_PARMS
|
474 TEXBLENDARG_FACTOR_N
);
475 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
478 TEXBLENDARG_MODIFY_PARMS
|
479 TEXBLENDARG_CURRENT
);
480 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
483 TEXBLENDARG_MODIFY_PARMS
|
484 TEXBLENDARG_CURRENT
);
485 return emit_factor( blendUnit
, state
, 6, factor
);
488 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
490 ENABLE_TEXOUTPUT_WRT_SEL
|
491 TEXOP_OUTPUT_CURRENT
|
492 DISABLE_TEX_CNTRL_STAGE
|
496 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
498 ENABLE_TEXOUTPUT_WRT_SEL
|
499 TEXOP_OUTPUT_CURRENT
|
503 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
506 TEXBLENDARG_MODIFY_PARMS
|
508 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
511 TEXBLENDARG_MODIFY_PARMS
|
512 TEXBLENDARG_FACTOR_N
);
513 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
516 TEXBLENDARG_MODIFY_PARMS
|
517 TEXBLENDARG_CURRENT
);
518 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
521 TEXBLENDARG_MODIFY_PARMS
|
523 state
[6] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
526 TEXBLENDARG_MODIFY_PARMS
|
527 TEXBLENDARG_FACTOR_N
);
528 state
[7] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
531 TEXBLENDARG_MODIFY_PARMS
|
532 TEXBLENDARG_CURRENT
);
533 return emit_factor( blendUnit
, state
, 8, factor
);
536 case GL_LUMINANCE_ALPHA
:
538 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
540 ENABLE_TEXOUTPUT_WRT_SEL
|
541 TEXOP_OUTPUT_CURRENT
|
542 DISABLE_TEX_CNTRL_STAGE
|
546 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
548 ENABLE_TEXOUTPUT_WRT_SEL
|
549 TEXOP_OUTPUT_CURRENT
|
552 TEXBLENDOP_MODULATE
);
553 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
556 TEXBLENDARG_MODIFY_PARMS
|
558 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
561 TEXBLENDARG_MODIFY_PARMS
|
562 TEXBLENDARG_FACTOR_N
);
563 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
566 TEXBLENDARG_MODIFY_PARMS
|
567 TEXBLENDARG_CURRENT
);
568 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
571 TEXBLENDARG_MODIFY_PARMS
|
573 state
[6] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
576 TEXBLENDARG_MODIFY_PARMS
|
577 TEXBLENDARG_CURRENT
);
578 return emit_factor( blendUnit
, state
, 7, factor
);
581 /* Always set to passthru if something is funny */
582 return pass_through( state
, blendUnit
);
588 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
590 ENABLE_TEXOUTPUT_WRT_SEL
|
591 TEXOP_OUTPUT_CURRENT
|
592 DISABLE_TEX_CNTRL_STAGE
|
596 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
598 ENABLE_TEXOUTPUT_WRT_SEL
|
599 TEXOP_OUTPUT_CURRENT
|
602 TEXBLENDOP_MODULATE
);
603 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
606 TEXBLENDARG_MODIFY_PARMS
|
607 TEXBLENDARG_CURRENT
);
608 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
611 TEXBLENDARG_MODIFY_PARMS
|
613 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
616 TEXBLENDARG_MODIFY_PARMS
|
617 TEXBLENDARG_CURRENT
);
623 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
625 ENABLE_TEXOUTPUT_WRT_SEL
|
626 TEXOP_OUTPUT_CURRENT
|
627 DISABLE_TEX_CNTRL_STAGE
|
631 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
633 ENABLE_TEXOUTPUT_WRT_SEL
|
634 TEXOP_OUTPUT_CURRENT
|
638 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
641 TEXBLENDARG_MODIFY_PARMS
|
643 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
646 TEXBLENDARG_MODIFY_PARMS
|
647 TEXBLENDARG_CURRENT
);
648 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
651 TEXBLENDARG_MODIFY_PARMS
|
652 TEXBLENDARG_CURRENT
);
656 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
658 ENABLE_TEXOUTPUT_WRT_SEL
|
659 TEXOP_OUTPUT_CURRENT
|
660 DISABLE_TEX_CNTRL_STAGE
|
664 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
666 ENABLE_TEXOUTPUT_WRT_SEL
|
667 TEXOP_OUTPUT_CURRENT
|
671 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
674 TEXBLENDARG_MODIFY_PARMS
|
676 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
679 TEXBLENDARG_MODIFY_PARMS
|
680 TEXBLENDARG_CURRENT
);
681 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
684 TEXBLENDARG_MODIFY_PARMS
|
686 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
689 TEXBLENDARG_MODIFY_PARMS
|
690 TEXBLENDARG_CURRENT
);
693 case GL_LUMINANCE_ALPHA
:
695 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
697 ENABLE_TEXOUTPUT_WRT_SEL
|
698 TEXOP_OUTPUT_CURRENT
|
699 DISABLE_TEX_CNTRL_STAGE
|
703 state
[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
705 ENABLE_TEXOUTPUT_WRT_SEL
|
706 TEXOP_OUTPUT_CURRENT
|
709 TEXBLENDOP_MODULATE
);
710 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
713 TEXBLENDARG_MODIFY_PARMS
|
715 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
718 TEXBLENDARG_MODIFY_PARMS
|
719 TEXBLENDARG_CURRENT
);
720 state
[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
723 TEXBLENDARG_MODIFY_PARMS
|
725 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
728 TEXBLENDARG_MODIFY_PARMS
|
729 TEXBLENDARG_CURRENT
);
733 /* Always set to passthru if something is funny */
734 return pass_through( state
, blendUnit
);
738 /* Always set to passthru if something is funny */
739 return pass_through( state
, blendUnit
);
743 static GLuint
i830SetTexEnvCombine(i830ContextPtr i830
,
744 const struct gl_texture_unit
*texUnit
,
748 const GLfloat
*factor
)
756 GLboolean need_factor
= 0;
759 if(INTEL_DEBUG
&DEBUG_TEXTURE
)
760 fprintf(stderr
, "%s\n", __FUNCTION__
);
763 /* The EXT version of the DOT3 extension does not support the
764 * scale factor, but the ARB version (and the version in OpenGL
767 switch (texUnit
->Combine
.ModeRGB
) {
768 case GL_DOT3_RGB_EXT
:
769 alpha_shift
= texUnit
->Combine
.ScaleShiftA
;
773 case GL_DOT3_RGBA_EXT
:
779 rgb_shift
= texUnit
->Combine
.ScaleShiftRGB
;
780 alpha_shift
= texUnit
->Combine
.ScaleShiftA
;
785 switch(texUnit
->Combine
.ModeRGB
) {
787 blendop
= TEXBLENDOP_ARG1
;
790 blendop
= TEXBLENDOP_MODULATE
;
793 blendop
= TEXBLENDOP_ADD
;
796 blendop
= TEXBLENDOP_ADDSIGNED
;
799 blendop
= TEXBLENDOP_BLEND
;
802 blendop
= TEXBLENDOP_SUBTRACT
;
804 case GL_DOT3_RGB_EXT
:
806 blendop
= TEXBLENDOP_DOT3
;
808 case GL_DOT3_RGBA_EXT
:
810 blendop
= TEXBLENDOP_DOT3
;
813 return pass_through( state
, blendUnit
);
816 blendop
|= (rgb_shift
<< TEXOP_SCALE_SHIFT
);
819 /* Handle RGB args */
820 for(i
= 0; i
< 3; i
++) {
821 switch(texUnit
->Combine
.SourceRGB
[i
]) {
823 args_RGB
[i
] = texel_op
;
826 args_RGB
[i
] = TEXBLENDARG_FACTOR_N
;
829 case GL_PRIMARY_COLOR
:
830 args_RGB
[i
] = TEXBLENDARG_DIFFUSE
;
833 args_RGB
[i
] = TEXBLENDARG_CURRENT
;
836 return pass_through( state
, blendUnit
);
839 switch(texUnit
->Combine
.OperandRGB
[i
]) {
843 case GL_ONE_MINUS_SRC_COLOR
:
844 args_RGB
[i
] |= TEXBLENDARG_INV_ARG
;
847 args_RGB
[i
] |= TEXBLENDARG_REPLICATE_ALPHA
;
849 case GL_ONE_MINUS_SRC_ALPHA
:
850 args_RGB
[i
] |= (TEXBLENDARG_REPLICATE_ALPHA
|
851 TEXBLENDARG_INV_ARG
);
854 return pass_through( state
, blendUnit
);
859 /* Need to knobble the alpha calculations of TEXBLENDOP_DOT4 to
860 * match the spec. Can't use DOT3 as it won't propogate values
861 * into alpha as required:
863 * Note - the global factor is set up with alpha == .5, so
864 * the alpha part of the DOT4 calculation should be zero.
866 if ( texUnit
->Combine
.ModeRGB
== GL_DOT3_RGBA_EXT
||
867 texUnit
->Combine
.ModeRGB
== GL_DOT3_RGBA
) {
868 ablendop
= TEXBLENDOP_DOT4
;
869 args_A
[0] = TEXBLENDARG_FACTOR
; /* the global factor */
870 args_A
[1] = TEXBLENDARG_FACTOR
;
871 args_A
[2] = TEXBLENDARG_FACTOR
;
874 switch(texUnit
->Combine
.ModeA
) {
876 ablendop
= TEXBLENDOP_ARG1
;
879 ablendop
= TEXBLENDOP_MODULATE
;
882 ablendop
= TEXBLENDOP_ADD
;
885 ablendop
= TEXBLENDOP_ADDSIGNED
;
888 ablendop
= TEXBLENDOP_BLEND
;
891 ablendop
= TEXBLENDOP_SUBTRACT
;
894 return pass_through( state
, blendUnit
);
898 ablendop
|= (alpha_shift
<< TEXOP_SCALE_SHIFT
);
901 for(i
= 0; i
< 3; i
++) {
902 switch(texUnit
->Combine
.SourceA
[i
]) {
904 args_A
[i
] = texel_op
;
907 args_A
[i
] = TEXBLENDARG_FACTOR_N
;
910 case GL_PRIMARY_COLOR
:
911 args_A
[i
] = TEXBLENDARG_DIFFUSE
;
914 args_A
[i
] = TEXBLENDARG_CURRENT
;
917 return pass_through( state
, blendUnit
);
920 switch(texUnit
->Combine
.OperandA
[i
]) {
924 case GL_ONE_MINUS_SRC_ALPHA
:
925 args_A
[i
] |= TEXBLENDARG_INV_ARG
;
928 return pass_through( state
, blendUnit
);
935 /* Native Arg1 == Arg0 in GL_EXT_texture_env_combine spec */
936 /* Native Arg2 == Arg1 in GL_EXT_texture_env_combine spec */
937 /* Native Arg0 == Arg2 in GL_EXT_texture_env_combine spec */
939 /* When we render we need to figure out which is the last really enabled
940 * tex unit, and put last stage on it
944 /* Build color pipeline */
946 state
[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
948 ENABLE_TEXOUTPUT_WRT_SEL
|
949 TEXOP_OUTPUT_CURRENT
|
950 DISABLE_TEX_CNTRL_STAGE
|
953 state
[1] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
956 TEXBLENDARG_MODIFY_PARMS
|
958 state
[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
961 TEXBLENDARG_MODIFY_PARMS
|
963 state
[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
966 TEXBLENDARG_MODIFY_PARMS
|
969 /* Build Alpha pipeline */
970 state
[4] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit
) |
972 ENABLE_TEXOUTPUT_WRT_SEL
|
973 TEXOP_OUTPUT_CURRENT
|
976 state
[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
979 TEXBLENDARG_MODIFY_PARMS
|
981 state
[6] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
984 TEXBLENDARG_MODIFY_PARMS
|
986 state
[7] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit
) |
989 TEXBLENDARG_MODIFY_PARMS
|
994 return emit_factor( blendUnit
, state
, 8, factor
);
1000 static void emit_texblend( i830ContextPtr i830
, GLuint unit
, GLuint blendUnit
,
1001 GLboolean last_stage
)
1003 struct gl_texture_unit
*texUnit
= &i830
->intel
.ctx
.Texture
.Unit
[unit
];
1004 struct gl_texture_object
*tObj
= texUnit
->_Current
;
1005 i830TextureObjectPtr t
= (i830TextureObjectPtr
)tObj
->DriverData
;
1006 GLuint tmp
[I830_TEXBLEND_SIZE
], tmp_sz
;
1009 if (0) fprintf(stderr
, "%s unit %d\n", __FUNCTION__
, unit
);
1011 /* Update i830->state.TexBlend
1013 if (texUnit
->EnvMode
== GL_COMBINE
) {
1014 tmp_sz
= i830SetTexEnvCombine(i830
, texUnit
, blendUnit
,
1015 GetTexelOp(unit
), tmp
,
1016 texUnit
->EnvColor
);
1019 tmp_sz
= i830SetBlend_GL1_2(i830
, blendUnit
, texUnit
->EnvMode
,
1020 t
->intel
.image
[0][0].internalFormat
,
1021 GetTexelOp(unit
), tmp
,
1022 texUnit
->EnvColor
);
1026 tmp
[0] |= TEXOP_LAST_STAGE
;
1028 if (tmp_sz
!= i830
->state
.TexBlendWordsUsed
[blendUnit
] ||
1029 memcmp( tmp
, i830
->state
.TexBlend
[blendUnit
], tmp_sz
* sizeof(GLuint
))) {
1031 I830_STATECHANGE( i830
, I830_UPLOAD_TEXBLEND(blendUnit
) );
1032 memcpy( i830
->state
.TexBlend
[blendUnit
], tmp
, tmp_sz
* sizeof(GLuint
));
1033 i830
->state
.TexBlendWordsUsed
[blendUnit
] = tmp_sz
;
1036 I830_ACTIVESTATE(i830
, I830_UPLOAD_TEXBLEND(blendUnit
), GL_TRUE
);
1039 static void emit_passthrough( i830ContextPtr i830
)
1041 GLuint tmp
[I830_TEXBLEND_SIZE
], tmp_sz
;
1044 tmp_sz
= pass_through( tmp
, unit
);
1045 tmp
[0] |= TEXOP_LAST_STAGE
;
1047 if (tmp_sz
!= i830
->state
.TexBlendWordsUsed
[unit
] ||
1048 memcmp( tmp
, i830
->state
.TexBlend
[unit
], tmp_sz
* sizeof(GLuint
))) {
1050 I830_STATECHANGE( i830
, I830_UPLOAD_TEXBLEND(unit
) );
1051 memcpy( i830
->state
.TexBlend
[unit
], tmp
, tmp_sz
* sizeof(GLuint
));
1052 i830
->state
.TexBlendWordsUsed
[unit
] = tmp_sz
;
1055 I830_ACTIVESTATE(i830
, I830_UPLOAD_TEXBLEND(unit
), GL_TRUE
);
1058 void i830EmitTextureBlend( i830ContextPtr i830
)
1060 GLcontext
*ctx
= &i830
->intel
.ctx
;
1061 GLuint unit
, last_stage
= 0, blendunit
= 0;
1063 I830_ACTIVESTATE(i830
, I830_UPLOAD_TEXBLEND_ALL
, GL_FALSE
);
1065 if (ctx
->Texture
._EnabledUnits
) {
1066 for (unit
= 0 ; unit
< ctx
->Const
.MaxTextureUnits
; unit
++)
1067 if (ctx
->Texture
.Unit
[unit
]._ReallyEnabled
)
1070 for (unit
= 0 ; unit
< ctx
->Const
.MaxTextureUnits
; unit
++)
1071 if (ctx
->Texture
.Unit
[unit
]._ReallyEnabled
)
1072 emit_texblend( i830
, unit
, blendunit
++, last_stage
== unit
);
1075 emit_passthrough( i830
);