1 /* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_texstate.c,v 1.6 2002/12/16 16:18:59 dawes Exp $ */
2 /**************************************************************************
4 Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
5 VA Linux Systems Inc., Fremont, California.
9 Permission is hereby granted, free of charge, to any person obtaining
10 a copy of this software and associated documentation files (the
11 "Software"), to deal in the Software without restriction, including
12 without limitation the rights to use, copy, modify, merge, publish,
13 distribute, sublicense, and/or sell copies of the Software, and to
14 permit persons to whom the Software is furnished to do so, subject to
15 the following conditions:
17 The above copyright notice and this permission notice (including the
18 next paragraph) shall be included in all copies or substantial
19 portions of the Software.
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
25 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 **************************************************************************/
33 * Kevin E. Martin <martin@valinux.com>
34 * Gareth Hughes <gareth@valinux.com>
42 #include "texformat.h"
45 #include "radeon_context.h"
46 #include "radeon_state.h"
47 #include "radeon_ioctl.h"
48 #include "radeon_swtcl.h"
49 #include "radeon_tex.h"
50 #include "radeon_tcl.h"
53 #define RADEON_TXFORMAT_AL88 RADEON_TXFORMAT_AI88
54 #define RADEON_TXFORMAT_YCBCR RADEON_TXFORMAT_YVYU422
55 #define RADEON_TXFORMAT_YCBCR_REV RADEON_TXFORMAT_VYUY422
58 [ MESA_FORMAT_ ## f ] = { RADEON_TXFORMAT_ ## f, 0 }
60 [ MESA_FORMAT_ ## f ] = { RADEON_TXFORMAT_ ## f | RADEON_TXFORMAT_ALPHA_IN_MAP, 0 }
62 [ MESA_FORMAT_ ## f ] = { RADEON_TXFORMAT_ ## f, RADEON_YUV_TO_RGB }
64 [ MESA_FORMAT_ ## f ] = { 0xffffffff, 0 }
65 #define VALID_FORMAT(f) ( ((f) <= MESA_FORMAT_YCBCR_REV) \
66 && (tx_table[f].format != 0xffffffff) )
69 GLuint format
, filter
;
93 * This function computes the number of bytes of storage needed for
94 * the given texture object (all mipmap levels, all cube faces).
95 * The \c image[face][level].x/y/width/height parameters for upload/blitting
96 * are computed here. \c pp_txfilter, \c pp_txformat, etc. will be set here
99 * \param rmesa Context pointer
100 * \param tObj GL texture object whose images are to be posted to
103 static void radeonSetTexImages( radeonContextPtr rmesa
,
104 struct gl_texture_object
*tObj
)
106 radeonTexObjPtr t
= (radeonTexObjPtr
)tObj
->DriverData
;
107 const struct gl_texture_image
*baseImage
= tObj
->Image
[0][tObj
->BaseLevel
];
111 GLint log2Width
, log2Height
, log2Depth
;
113 /* Set the hardware texture format
116 t
->pp_txformat
&= ~(RADEON_TXFORMAT_FORMAT_MASK
|
117 RADEON_TXFORMAT_ALPHA_IN_MAP
);
118 t
->pp_txfilter
&= ~RADEON_YUV_TO_RGB
;
120 if ( VALID_FORMAT( baseImage
->TexFormat
->MesaFormat
) ) {
121 t
->pp_txformat
|= tx_table
[ baseImage
->TexFormat
->MesaFormat
].format
;
122 t
->pp_txfilter
|= tx_table
[ baseImage
->TexFormat
->MesaFormat
].filter
;
125 _mesa_problem(NULL
, "unexpected texture format in %s", __FUNCTION__
);
130 /* Compute which mipmap levels we really want to send to the hardware.
133 driCalculateTextureFirstLastLevel( (driTextureObject
*) t
);
134 log2Width
= tObj
->Image
[0][t
->base
.firstLevel
]->WidthLog2
;
135 log2Height
= tObj
->Image
[0][t
->base
.firstLevel
]->HeightLog2
;
136 log2Depth
= tObj
->Image
[0][t
->base
.firstLevel
]->DepthLog2
;
138 numLevels
= t
->base
.lastLevel
- t
->base
.firstLevel
+ 1;
140 assert(numLevels
<= RADEON_MAX_TEXTURE_LEVELS
);
142 /* Calculate mipmap offsets and dimensions for blitting (uploading)
143 * The idea is that we lay out the mipmap levels within a block of
144 * memory organized as a rectangle of width BLIT_WIDTH_BYTES.
148 for (i
= 0; i
< numLevels
; i
++) {
149 const struct gl_texture_image
*texImage
;
152 texImage
= tObj
->Image
[0][i
+ t
->base
.firstLevel
];
156 /* find image size in bytes */
157 if (texImage
->IsCompressed
) {
158 size
= texImage
->CompressedSize
;
160 else if (tObj
->Target
== GL_TEXTURE_RECTANGLE_NV
) {
161 size
= ((texImage
->Width
* texImage
->TexFormat
->TexelBytes
+ 63)
162 & ~63) * texImage
->Height
;
165 int w
= texImage
->Width
* texImage
->TexFormat
->TexelBytes
;
168 size
= w
* texImage
->Height
* texImage
->Depth
;
173 /* Align to 32-byte offset. It is faster to do this unconditionally
174 * (no branch penalty).
177 curOffset
= (curOffset
+ 0x1f) & ~0x1f;
179 t
->image
[0][i
].x
= curOffset
% BLIT_WIDTH_BYTES
;
180 t
->image
[0][i
].y
= curOffset
/ BLIT_WIDTH_BYTES
;
181 t
->image
[0][i
].width
= MIN2(size
, BLIT_WIDTH_BYTES
);
182 t
->image
[0][i
].height
= size
/ t
->image
[0][i
].width
;
185 /* for debugging only and only applicable to non-rectangle targets */
186 assert(size
% t
->image
[0][i
].width
== 0);
187 assert(t
->image
[0][i
].x
== 0
188 || (size
< BLIT_WIDTH_BYTES
&& t
->image
[0][i
].height
== 1));
193 "level %d: %dx%d x=%d y=%d w=%d h=%d size=%d at %d\n",
194 i
, texImage
->Width
, texImage
->Height
,
195 t
->image
[0][i
].x
, t
->image
[0][i
].y
,
196 t
->image
[0][i
].width
, t
->image
[0][i
].height
, size
, curOffset
);
202 /* Align the total size of texture memory block.
204 t
->base
.totalSize
= (curOffset
+ RADEON_OFFSET_MASK
) & ~RADEON_OFFSET_MASK
;
208 t
->pp_txfilter
&= ~RADEON_MAX_MIP_LEVEL_MASK
;
209 t
->pp_txfilter
|= (numLevels
- 1) << RADEON_MAX_MIP_LEVEL_SHIFT
;
211 t
->pp_txformat
&= ~(RADEON_TXFORMAT_WIDTH_MASK
|
212 RADEON_TXFORMAT_HEIGHT_MASK
|
213 RADEON_TXFORMAT_CUBIC_MAP_ENABLE
);
214 t
->pp_txformat
|= ((log2Width
<< RADEON_TXFORMAT_WIDTH_SHIFT
) |
215 (log2Height
<< RADEON_TXFORMAT_HEIGHT_SHIFT
));
217 t
->pp_txsize
= (((tObj
->Image
[0][t
->base
.firstLevel
]->Width
- 1) << 0) |
218 ((tObj
->Image
[0][t
->base
.firstLevel
]->Height
- 1) << 16));
220 /* Only need to round to nearest 32 for textures, but the blitter
221 * requires 64-byte aligned pitches, and we may/may not need the
222 * blitter. NPOT only!
224 if (baseImage
->IsCompressed
)
225 t
->pp_txpitch
= (tObj
->Image
[0][t
->base
.firstLevel
]->Width
+ 63) & ~(63);
227 t
->pp_txpitch
= ((tObj
->Image
[0][t
->base
.firstLevel
]->Width
* baseImage
->TexFormat
->TexelBytes
) + 63) & ~(63);
230 t
->dirty_state
= TEX_ALL
;
232 /* FYI: radeonUploadTexImages( rmesa, t ); used to be called here */
237 /* ================================================================
238 * Texture combine functions
241 #define RADEON_DISABLE 0
242 #define RADEON_REPLACE 1
243 #define RADEON_MODULATE 2
244 #define RADEON_DECAL 3
245 #define RADEON_BLEND 4
247 #define RADEON_MAX_COMBFUNC 6
249 static GLuint radeon_color_combine
[][RADEON_MAX_COMBFUNC
] =
254 /* Disable combiner stage
256 (RADEON_COLOR_ARG_A_ZERO
|
257 RADEON_COLOR_ARG_B_ZERO
|
258 RADEON_COLOR_ARG_C_CURRENT_COLOR
|
259 RADEON_BLEND_CTL_ADD
|
263 /* GL_REPLACE = 0x00802800
265 (RADEON_COLOR_ARG_A_ZERO
|
266 RADEON_COLOR_ARG_B_ZERO
|
267 RADEON_COLOR_ARG_C_T0_COLOR
|
268 RADEON_BLEND_CTL_ADD
|
272 /* GL_MODULATE = 0x00800142
274 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
275 RADEON_COLOR_ARG_B_T0_COLOR
|
276 RADEON_COLOR_ARG_C_ZERO
|
277 RADEON_BLEND_CTL_ADD
|
281 /* GL_DECAL = 0x008c2d42
283 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
284 RADEON_COLOR_ARG_B_T0_COLOR
|
285 RADEON_COLOR_ARG_C_T0_ALPHA
|
286 RADEON_BLEND_CTL_BLEND
|
290 /* GL_BLEND = 0x008c2902
292 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
293 RADEON_COLOR_ARG_B_TFACTOR_COLOR
|
294 RADEON_COLOR_ARG_C_T0_COLOR
|
295 RADEON_BLEND_CTL_BLEND
|
299 /* GL_ADD = 0x00812802
301 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
302 RADEON_COLOR_ARG_B_ZERO
|
303 RADEON_COLOR_ARG_C_T0_COLOR
|
305 RADEON_BLEND_CTL_ADD
|
313 /* Disable combiner stage
315 (RADEON_COLOR_ARG_A_ZERO
|
316 RADEON_COLOR_ARG_B_ZERO
|
317 RADEON_COLOR_ARG_C_CURRENT_COLOR
|
318 RADEON_BLEND_CTL_ADD
|
322 /* GL_REPLACE = 0x00803000
324 (RADEON_COLOR_ARG_A_ZERO
|
325 RADEON_COLOR_ARG_B_ZERO
|
326 RADEON_COLOR_ARG_C_T1_COLOR
|
327 RADEON_BLEND_CTL_ADD
|
331 /* GL_MODULATE = 0x00800182
333 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
334 RADEON_COLOR_ARG_B_T1_COLOR
|
335 RADEON_COLOR_ARG_C_ZERO
|
336 RADEON_BLEND_CTL_ADD
|
340 /* GL_DECAL = 0x008c3582
342 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
343 RADEON_COLOR_ARG_B_T1_COLOR
|
344 RADEON_COLOR_ARG_C_T1_ALPHA
|
345 RADEON_BLEND_CTL_BLEND
|
349 /* GL_BLEND = 0x008c3102
351 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
352 RADEON_COLOR_ARG_B_TFACTOR_COLOR
|
353 RADEON_COLOR_ARG_C_T1_COLOR
|
354 RADEON_BLEND_CTL_BLEND
|
358 /* GL_ADD = 0x00813002
360 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
361 RADEON_COLOR_ARG_B_ZERO
|
362 RADEON_COLOR_ARG_C_T1_COLOR
|
364 RADEON_BLEND_CTL_ADD
|
372 /* Disable combiner stage
374 (RADEON_COLOR_ARG_A_ZERO
|
375 RADEON_COLOR_ARG_B_ZERO
|
376 RADEON_COLOR_ARG_C_CURRENT_COLOR
|
377 RADEON_BLEND_CTL_ADD
|
381 /* GL_REPLACE = 0x00803800
383 (RADEON_COLOR_ARG_A_ZERO
|
384 RADEON_COLOR_ARG_B_ZERO
|
385 RADEON_COLOR_ARG_C_T2_COLOR
|
386 RADEON_BLEND_CTL_ADD
|
390 /* GL_MODULATE = 0x008001c2
392 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
393 RADEON_COLOR_ARG_B_T2_COLOR
|
394 RADEON_COLOR_ARG_C_ZERO
|
395 RADEON_BLEND_CTL_ADD
|
399 /* GL_DECAL = 0x008c3dc2
401 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
402 RADEON_COLOR_ARG_B_T2_COLOR
|
403 RADEON_COLOR_ARG_C_T2_ALPHA
|
404 RADEON_BLEND_CTL_BLEND
|
408 /* GL_BLEND = 0x008c3902
410 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
411 RADEON_COLOR_ARG_B_TFACTOR_COLOR
|
412 RADEON_COLOR_ARG_C_T2_COLOR
|
413 RADEON_BLEND_CTL_BLEND
|
417 /* GL_ADD = 0x00813802
419 (RADEON_COLOR_ARG_A_CURRENT_COLOR
|
420 RADEON_COLOR_ARG_B_ZERO
|
421 RADEON_COLOR_ARG_C_T2_COLOR
|
423 RADEON_BLEND_CTL_ADD
|
429 static GLuint radeon_alpha_combine
[][RADEON_MAX_COMBFUNC
] =
434 /* Disable combiner stage
436 (RADEON_ALPHA_ARG_A_ZERO
|
437 RADEON_ALPHA_ARG_B_ZERO
|
438 RADEON_ALPHA_ARG_C_CURRENT_ALPHA
|
439 RADEON_BLEND_CTL_ADD
|
443 /* GL_REPLACE = 0x00800500
445 (RADEON_ALPHA_ARG_A_ZERO
|
446 RADEON_ALPHA_ARG_B_ZERO
|
447 RADEON_ALPHA_ARG_C_T0_ALPHA
|
448 RADEON_BLEND_CTL_ADD
|
452 /* GL_MODULATE = 0x00800051
454 (RADEON_ALPHA_ARG_A_CURRENT_ALPHA
|
455 RADEON_ALPHA_ARG_B_T0_ALPHA
|
456 RADEON_ALPHA_ARG_C_ZERO
|
457 RADEON_BLEND_CTL_ADD
|
461 /* GL_DECAL = 0x00800100
463 (RADEON_ALPHA_ARG_A_ZERO
|
464 RADEON_ALPHA_ARG_B_ZERO
|
465 RADEON_ALPHA_ARG_C_CURRENT_ALPHA
|
466 RADEON_BLEND_CTL_ADD
|
470 /* GL_BLEND = 0x00800051
472 (RADEON_ALPHA_ARG_A_CURRENT_ALPHA
|
473 RADEON_ALPHA_ARG_B_TFACTOR_ALPHA
|
474 RADEON_ALPHA_ARG_C_T0_ALPHA
|
475 RADEON_BLEND_CTL_BLEND
|
479 /* GL_ADD = 0x00800051
481 (RADEON_ALPHA_ARG_A_CURRENT_ALPHA
|
482 RADEON_ALPHA_ARG_B_ZERO
|
483 RADEON_ALPHA_ARG_C_T0_ALPHA
|
485 RADEON_BLEND_CTL_ADD
|
493 /* Disable combiner stage
495 (RADEON_ALPHA_ARG_A_ZERO
|
496 RADEON_ALPHA_ARG_B_ZERO
|
497 RADEON_ALPHA_ARG_C_CURRENT_ALPHA
|
498 RADEON_BLEND_CTL_ADD
|
502 /* GL_REPLACE = 0x00800600
504 (RADEON_ALPHA_ARG_A_ZERO
|
505 RADEON_ALPHA_ARG_B_ZERO
|
506 RADEON_ALPHA_ARG_C_T1_ALPHA
|
507 RADEON_BLEND_CTL_ADD
|
511 /* GL_MODULATE = 0x00800061
513 (RADEON_ALPHA_ARG_A_CURRENT_ALPHA
|
514 RADEON_ALPHA_ARG_B_T1_ALPHA
|
515 RADEON_ALPHA_ARG_C_ZERO
|
516 RADEON_BLEND_CTL_ADD
|
520 /* GL_DECAL = 0x00800100
522 (RADEON_ALPHA_ARG_A_ZERO
|
523 RADEON_ALPHA_ARG_B_ZERO
|
524 RADEON_ALPHA_ARG_C_CURRENT_ALPHA
|
525 RADEON_BLEND_CTL_ADD
|
529 /* GL_BLEND = 0x00800061
531 (RADEON_ALPHA_ARG_A_CURRENT_ALPHA
|
532 RADEON_ALPHA_ARG_B_TFACTOR_ALPHA
|
533 RADEON_ALPHA_ARG_C_T1_ALPHA
|
534 RADEON_BLEND_CTL_BLEND
|
538 /* GL_ADD = 0x00800061
540 (RADEON_ALPHA_ARG_A_CURRENT_ALPHA
|
541 RADEON_ALPHA_ARG_B_ZERO
|
542 RADEON_ALPHA_ARG_C_T1_ALPHA
|
544 RADEON_BLEND_CTL_ADD
|
552 /* Disable combiner stage
554 (RADEON_ALPHA_ARG_A_ZERO
|
555 RADEON_ALPHA_ARG_B_ZERO
|
556 RADEON_ALPHA_ARG_C_CURRENT_ALPHA
|
557 RADEON_BLEND_CTL_ADD
|
561 /* GL_REPLACE = 0x00800700
563 (RADEON_ALPHA_ARG_A_ZERO
|
564 RADEON_ALPHA_ARG_B_ZERO
|
565 RADEON_ALPHA_ARG_C_T2_ALPHA
|
566 RADEON_BLEND_CTL_ADD
|
570 /* GL_MODULATE = 0x00800071
572 (RADEON_ALPHA_ARG_A_CURRENT_ALPHA
|
573 RADEON_ALPHA_ARG_B_T2_ALPHA
|
574 RADEON_ALPHA_ARG_C_ZERO
|
575 RADEON_BLEND_CTL_ADD
|
579 /* GL_DECAL = 0x00800100
581 (RADEON_ALPHA_ARG_A_ZERO
|
582 RADEON_ALPHA_ARG_B_ZERO
|
583 RADEON_ALPHA_ARG_C_CURRENT_ALPHA
|
584 RADEON_BLEND_CTL_ADD
|
588 /* GL_BLEND = 0x00800071
590 (RADEON_ALPHA_ARG_A_CURRENT_ALPHA
|
591 RADEON_ALPHA_ARG_B_TFACTOR_ALPHA
|
592 RADEON_ALPHA_ARG_C_T2_ALPHA
|
593 RADEON_BLEND_CTL_BLEND
|
597 /* GL_ADD = 0x00800021
599 (RADEON_ALPHA_ARG_A_CURRENT_ALPHA
|
600 RADEON_ALPHA_ARG_B_ZERO
|
601 RADEON_ALPHA_ARG_C_T2_ALPHA
|
603 RADEON_BLEND_CTL_ADD
|
610 /* GL_ARB_texture_env_combine support
613 /* The color tables have combine functions for GL_SRC_COLOR,
614 * GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA and GL_ONE_MINUS_SRC_ALPHA.
616 static GLuint radeon_texture_color
[][RADEON_MAX_TEXTURE_UNITS
] =
619 RADEON_COLOR_ARG_A_T0_COLOR
,
620 RADEON_COLOR_ARG_A_T1_COLOR
,
621 RADEON_COLOR_ARG_A_T2_COLOR
624 RADEON_COLOR_ARG_A_T0_COLOR
| RADEON_COMP_ARG_A
,
625 RADEON_COLOR_ARG_A_T1_COLOR
| RADEON_COMP_ARG_A
,
626 RADEON_COLOR_ARG_A_T2_COLOR
| RADEON_COMP_ARG_A
629 RADEON_COLOR_ARG_A_T0_ALPHA
,
630 RADEON_COLOR_ARG_A_T1_ALPHA
,
631 RADEON_COLOR_ARG_A_T2_ALPHA
634 RADEON_COLOR_ARG_A_T0_ALPHA
| RADEON_COMP_ARG_A
,
635 RADEON_COLOR_ARG_A_T1_ALPHA
| RADEON_COMP_ARG_A
,
636 RADEON_COLOR_ARG_A_T2_ALPHA
| RADEON_COMP_ARG_A
640 static GLuint radeon_tfactor_color
[] =
642 RADEON_COLOR_ARG_A_TFACTOR_COLOR
,
643 RADEON_COLOR_ARG_A_TFACTOR_COLOR
| RADEON_COMP_ARG_A
,
644 RADEON_COLOR_ARG_A_TFACTOR_ALPHA
,
645 RADEON_COLOR_ARG_A_TFACTOR_ALPHA
| RADEON_COMP_ARG_A
648 static GLuint radeon_primary_color
[] =
650 RADEON_COLOR_ARG_A_DIFFUSE_COLOR
,
651 RADEON_COLOR_ARG_A_DIFFUSE_COLOR
| RADEON_COMP_ARG_A
,
652 RADEON_COLOR_ARG_A_DIFFUSE_ALPHA
,
653 RADEON_COLOR_ARG_A_DIFFUSE_ALPHA
| RADEON_COMP_ARG_A
656 static GLuint radeon_previous_color
[] =
658 RADEON_COLOR_ARG_A_CURRENT_COLOR
,
659 RADEON_COLOR_ARG_A_CURRENT_COLOR
| RADEON_COMP_ARG_A
,
660 RADEON_COLOR_ARG_A_CURRENT_ALPHA
,
661 RADEON_COLOR_ARG_A_CURRENT_ALPHA
| RADEON_COMP_ARG_A
664 /* GL_ZERO table - indices 0-3
665 * GL_ONE table - indices 1-4
667 static GLuint radeon_zero_color
[] =
669 RADEON_COLOR_ARG_A_ZERO
,
670 RADEON_COLOR_ARG_A_ZERO
| RADEON_COMP_ARG_A
,
671 RADEON_COLOR_ARG_A_ZERO
,
672 RADEON_COLOR_ARG_A_ZERO
| RADEON_COMP_ARG_A
,
673 RADEON_COLOR_ARG_A_ZERO
677 /* The alpha tables only have GL_SRC_ALPHA and GL_ONE_MINUS_SRC_ALPHA.
679 static GLuint radeon_texture_alpha
[][RADEON_MAX_TEXTURE_UNITS
] =
682 RADEON_ALPHA_ARG_A_T0_ALPHA
,
683 RADEON_ALPHA_ARG_A_T1_ALPHA
,
684 RADEON_ALPHA_ARG_A_T2_ALPHA
687 RADEON_ALPHA_ARG_A_T0_ALPHA
| RADEON_COMP_ARG_A
,
688 RADEON_ALPHA_ARG_A_T1_ALPHA
| RADEON_COMP_ARG_A
,
689 RADEON_ALPHA_ARG_A_T2_ALPHA
| RADEON_COMP_ARG_A
693 static GLuint radeon_tfactor_alpha
[] =
695 RADEON_ALPHA_ARG_A_TFACTOR_ALPHA
,
696 RADEON_ALPHA_ARG_A_TFACTOR_ALPHA
| RADEON_COMP_ARG_A
699 static GLuint radeon_primary_alpha
[] =
701 RADEON_ALPHA_ARG_A_DIFFUSE_ALPHA
,
702 RADEON_ALPHA_ARG_A_DIFFUSE_ALPHA
| RADEON_COMP_ARG_A
705 static GLuint radeon_previous_alpha
[] =
707 RADEON_ALPHA_ARG_A_CURRENT_ALPHA
,
708 RADEON_ALPHA_ARG_A_CURRENT_ALPHA
| RADEON_COMP_ARG_A
711 /* GL_ZERO table - indices 0-1
712 * GL_ONE table - indices 1-2
714 static GLuint radeon_zero_alpha
[] =
716 RADEON_ALPHA_ARG_A_ZERO
,
717 RADEON_ALPHA_ARG_A_ZERO
| RADEON_COMP_ARG_A
,
718 RADEON_ALPHA_ARG_A_ZERO
722 /* Extract the arg from slot A, shift it into the correct argument slot
723 * and set the corresponding complement bit.
725 #define RADEON_COLOR_ARG( n, arg ) \
728 ((color_arg[n] & RADEON_COLOR_ARG_MASK) \
729 << RADEON_COLOR_ARG_##arg##_SHIFT); \
731 ((color_arg[n] >> RADEON_COMP_ARG_SHIFT) \
732 << RADEON_COMP_ARG_##arg##_SHIFT); \
735 #define RADEON_ALPHA_ARG( n, arg ) \
738 ((alpha_arg[n] & RADEON_ALPHA_ARG_MASK) \
739 << RADEON_ALPHA_ARG_##arg##_SHIFT); \
741 ((alpha_arg[n] >> RADEON_COMP_ARG_SHIFT) \
742 << RADEON_COMP_ARG_##arg##_SHIFT); \
746 /* ================================================================
747 * Texture unit state management
750 static GLboolean
radeonUpdateTextureEnv( GLcontext
*ctx
, int unit
)
752 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
753 const struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
754 GLuint color_combine
, alpha_combine
;
756 /* texUnit->_Current can be NULL if and only if the texture unit is
757 * not actually enabled.
759 assert( (texUnit
->_ReallyEnabled
== 0)
760 || (texUnit
->_Current
!= NULL
) );
762 if ( RADEON_DEBUG
& DEBUG_TEXTURE
) {
763 fprintf( stderr
, "%s( %p, %d )\n", __FUNCTION__
, ctx
, unit
);
766 /* Set the texture environment state. Isn't this nice and clean?
767 * The chip will automagically set the texture alpha to 0xff when
768 * the texture format does not include an alpha component. This
769 * reduces the amount of special-casing we have to do, alpha-only
770 * textures being a notable exception.
772 if ( !texUnit
->_ReallyEnabled
) {
773 /* Don't cache these results.
775 rmesa
->state
.texture
.unit
[unit
].format
= 0;
776 rmesa
->state
.texture
.unit
[unit
].envMode
= 0;
777 color_combine
= radeon_color_combine
[unit
][RADEON_DISABLE
];
778 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_DISABLE
];
781 const struct gl_texture_object
*tObj
= texUnit
->_Current
;
782 const GLenum format
= tObj
->Image
[0][tObj
->BaseLevel
]->Format
;
783 GLuint color_arg
[3], alpha_arg
[3];
784 GLuint i
, numColorArgs
= 0, numAlphaArgs
= 0;
785 GLuint RGBshift
= texUnit
->Combine
.ScaleShiftRGB
;
786 GLuint Ashift
= texUnit
->Combine
.ScaleShiftA
;
788 switch ( texUnit
->EnvMode
) {
792 case GL_LUMINANCE_ALPHA
:
794 color_combine
= radeon_color_combine
[unit
][RADEON_REPLACE
];
795 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_REPLACE
];
798 color_combine
= radeon_color_combine
[unit
][RADEON_DISABLE
];
799 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_REPLACE
];
804 color_combine
= radeon_color_combine
[unit
][RADEON_REPLACE
];
805 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_DISABLE
];
816 case GL_LUMINANCE_ALPHA
:
818 color_combine
= radeon_color_combine
[unit
][RADEON_MODULATE
];
819 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_MODULATE
];
822 color_combine
= radeon_color_combine
[unit
][RADEON_DISABLE
];
823 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_MODULATE
];
828 color_combine
= radeon_color_combine
[unit
][RADEON_MODULATE
];
829 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_DISABLE
];
842 color_combine
= radeon_color_combine
[unit
][RADEON_DECAL
];
843 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_DISABLE
];
847 case GL_LUMINANCE_ALPHA
:
849 color_combine
= radeon_color_combine
[unit
][RADEON_DISABLE
];
850 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_DISABLE
];
863 case GL_LUMINANCE_ALPHA
:
865 color_combine
= radeon_color_combine
[unit
][RADEON_BLEND
];
866 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_MODULATE
];
869 color_combine
= radeon_color_combine
[unit
][RADEON_DISABLE
];
870 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_MODULATE
];
873 color_combine
= radeon_color_combine
[unit
][RADEON_BLEND
];
874 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_BLEND
];
887 case GL_LUMINANCE_ALPHA
:
889 color_combine
= radeon_color_combine
[unit
][RADEON_ADD
];
890 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_MODULATE
];
893 color_combine
= radeon_color_combine
[unit
][RADEON_DISABLE
];
894 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_MODULATE
];
897 color_combine
= radeon_color_combine
[unit
][RADEON_ADD
];
898 alpha_combine
= radeon_alpha_combine
[unit
][RADEON_ADD
];
907 /* Don't cache these results.
909 rmesa
->state
.texture
.unit
[unit
].format
= 0;
910 rmesa
->state
.texture
.unit
[unit
].envMode
= 0;
913 * Calculate how many arguments we need to process.
915 switch ( texUnit
->Combine
.ModeRGB
) {
925 case GL_DOT3_RGB_EXT
:
926 case GL_DOT3_RGBA_EXT
:
930 case GL_MODULATE_ADD_ATI
:
931 case GL_MODULATE_SIGNED_ADD_ATI
:
932 case GL_MODULATE_SUBTRACT_ATI
:
939 switch ( texUnit
->Combine
.ModeA
) {
950 case GL_MODULATE_ADD_ATI
:
951 case GL_MODULATE_SIGNED_ADD_ATI
:
952 case GL_MODULATE_SUBTRACT_ATI
:
960 * Extract the color and alpha combine function arguments.
962 for ( i
= 0 ; i
< numColorArgs
; i
++ ) {
963 const GLuint op
= texUnit
->Combine
.OperandRGB
[i
] - GL_SRC_COLOR
;
966 switch ( texUnit
->Combine
.SourceRGB
[i
] ) {
968 color_arg
[i
] = radeon_texture_color
[op
][unit
];
971 color_arg
[i
] = radeon_tfactor_color
[op
];
973 case GL_PRIMARY_COLOR
:
974 color_arg
[i
] = radeon_primary_color
[op
];
977 color_arg
[i
] = radeon_previous_color
[op
];
980 color_arg
[i
] = radeon_zero_color
[op
];
983 color_arg
[i
] = radeon_zero_color
[op
+1];
990 for ( i
= 0 ; i
< numAlphaArgs
; i
++ ) {
991 const GLuint op
= texUnit
->Combine
.OperandA
[i
] - GL_SRC_ALPHA
;
994 switch ( texUnit
->Combine
.SourceA
[i
] ) {
996 alpha_arg
[i
] = radeon_texture_alpha
[op
][unit
];
999 alpha_arg
[i
] = radeon_tfactor_alpha
[op
];
1001 case GL_PRIMARY_COLOR
:
1002 alpha_arg
[i
] = radeon_primary_alpha
[op
];
1005 alpha_arg
[i
] = radeon_previous_alpha
[op
];
1008 alpha_arg
[i
] = radeon_zero_alpha
[op
];
1011 alpha_arg
[i
] = radeon_zero_alpha
[op
+1];
1019 * Build up the color and alpha combine functions.
1021 switch ( texUnit
->Combine
.ModeRGB
) {
1023 color_combine
= (RADEON_COLOR_ARG_A_ZERO
|
1024 RADEON_COLOR_ARG_B_ZERO
|
1025 RADEON_BLEND_CTL_ADD
|
1027 RADEON_COLOR_ARG( 0, C
);
1030 color_combine
= (RADEON_COLOR_ARG_C_ZERO
|
1031 RADEON_BLEND_CTL_ADD
|
1033 RADEON_COLOR_ARG( 0, A
);
1034 RADEON_COLOR_ARG( 1, B
);
1037 color_combine
= (RADEON_COLOR_ARG_B_ZERO
|
1039 RADEON_BLEND_CTL_ADD
|
1041 RADEON_COLOR_ARG( 0, A
);
1042 RADEON_COLOR_ARG( 1, C
);
1045 color_combine
= (RADEON_COLOR_ARG_B_ZERO
|
1047 RADEON_BLEND_CTL_ADDSIGNED
|
1049 RADEON_COLOR_ARG( 0, A
);
1050 RADEON_COLOR_ARG( 1, C
);
1053 color_combine
= (RADEON_COLOR_ARG_B_ZERO
|
1055 RADEON_BLEND_CTL_SUBTRACT
|
1057 RADEON_COLOR_ARG( 0, A
);
1058 RADEON_COLOR_ARG( 1, C
);
1060 case GL_INTERPOLATE
:
1061 color_combine
= (RADEON_BLEND_CTL_BLEND
|
1063 RADEON_COLOR_ARG( 0, B
);
1064 RADEON_COLOR_ARG( 1, A
);
1065 RADEON_COLOR_ARG( 2, C
);
1068 case GL_DOT3_RGB_EXT
:
1069 case GL_DOT3_RGBA_EXT
:
1070 /* The EXT version of the DOT3 extension does not support the
1071 * scale factor, but the ARB version (and the version in OpenGL
1080 /* The R100 / RV200 only support a 1X multiplier in hardware
1081 * w/the ARB version.
1083 if ( RGBshift
!= (RADEON_SCALE_1X
>> RADEON_SCALE_SHIFT
) ) {
1090 color_combine
= (RADEON_COLOR_ARG_C_ZERO
|
1091 RADEON_BLEND_CTL_DOT3
|
1093 RADEON_COLOR_ARG( 0, A
);
1094 RADEON_COLOR_ARG( 1, B
);
1097 case GL_MODULATE_ADD_ATI
:
1098 color_combine
= (RADEON_BLEND_CTL_ADD
|
1100 RADEON_COLOR_ARG( 0, A
);
1101 RADEON_COLOR_ARG( 1, C
);
1102 RADEON_COLOR_ARG( 2, B
);
1104 case GL_MODULATE_SIGNED_ADD_ATI
:
1105 color_combine
= (RADEON_BLEND_CTL_ADDSIGNED
|
1107 RADEON_COLOR_ARG( 0, A
);
1108 RADEON_COLOR_ARG( 1, C
);
1109 RADEON_COLOR_ARG( 2, B
);
1111 case GL_MODULATE_SUBTRACT_ATI
:
1112 color_combine
= (RADEON_BLEND_CTL_SUBTRACT
|
1114 RADEON_COLOR_ARG( 0, A
);
1115 RADEON_COLOR_ARG( 1, C
);
1116 RADEON_COLOR_ARG( 2, B
);
1122 switch ( texUnit
->Combine
.ModeA
) {
1124 alpha_combine
= (RADEON_ALPHA_ARG_A_ZERO
|
1125 RADEON_ALPHA_ARG_B_ZERO
|
1126 RADEON_BLEND_CTL_ADD
|
1128 RADEON_ALPHA_ARG( 0, C
);
1131 alpha_combine
= (RADEON_ALPHA_ARG_C_ZERO
|
1132 RADEON_BLEND_CTL_ADD
|
1134 RADEON_ALPHA_ARG( 0, A
);
1135 RADEON_ALPHA_ARG( 1, B
);
1138 alpha_combine
= (RADEON_ALPHA_ARG_B_ZERO
|
1140 RADEON_BLEND_CTL_ADD
|
1142 RADEON_ALPHA_ARG( 0, A
);
1143 RADEON_ALPHA_ARG( 1, C
);
1146 alpha_combine
= (RADEON_ALPHA_ARG_B_ZERO
|
1148 RADEON_BLEND_CTL_ADDSIGNED
|
1150 RADEON_ALPHA_ARG( 0, A
);
1151 RADEON_ALPHA_ARG( 1, C
);
1154 alpha_combine
= (RADEON_COLOR_ARG_B_ZERO
|
1156 RADEON_BLEND_CTL_SUBTRACT
|
1158 RADEON_ALPHA_ARG( 0, A
);
1159 RADEON_ALPHA_ARG( 1, C
);
1161 case GL_INTERPOLATE
:
1162 alpha_combine
= (RADEON_BLEND_CTL_BLEND
|
1164 RADEON_ALPHA_ARG( 0, B
);
1165 RADEON_ALPHA_ARG( 1, A
);
1166 RADEON_ALPHA_ARG( 2, C
);
1169 case GL_MODULATE_ADD_ATI
:
1170 alpha_combine
= (RADEON_BLEND_CTL_ADD
|
1172 RADEON_ALPHA_ARG( 0, A
);
1173 RADEON_ALPHA_ARG( 1, C
);
1174 RADEON_ALPHA_ARG( 2, B
);
1176 case GL_MODULATE_SIGNED_ADD_ATI
:
1177 alpha_combine
= (RADEON_BLEND_CTL_ADDSIGNED
|
1179 RADEON_ALPHA_ARG( 0, A
);
1180 RADEON_ALPHA_ARG( 1, C
);
1181 RADEON_ALPHA_ARG( 2, B
);
1183 case GL_MODULATE_SUBTRACT_ATI
:
1184 alpha_combine
= (RADEON_BLEND_CTL_SUBTRACT
|
1186 RADEON_ALPHA_ARG( 0, A
);
1187 RADEON_ALPHA_ARG( 1, C
);
1188 RADEON_ALPHA_ARG( 2, B
);
1194 if ( (texUnit
->Combine
.ModeRGB
== GL_DOT3_RGB_EXT
)
1195 || (texUnit
->Combine
.ModeRGB
== GL_DOT3_RGB
) ) {
1196 alpha_combine
|= RADEON_DOT_ALPHA_DONT_REPLICATE
;
1200 * Apply the scale factor.
1202 color_combine
|= (RGBshift
<< RADEON_SCALE_SHIFT
);
1203 alpha_combine
|= (Ashift
<< RADEON_SCALE_SHIFT
);
1214 if ( rmesa
->hw
.tex
[unit
].cmd
[TEX_PP_TXCBLEND
] != color_combine
||
1215 rmesa
->hw
.tex
[unit
].cmd
[TEX_PP_TXABLEND
] != alpha_combine
) {
1216 RADEON_STATECHANGE( rmesa
, tex
[unit
] );
1217 rmesa
->hw
.tex
[unit
].cmd
[TEX_PP_TXCBLEND
] = color_combine
;
1218 rmesa
->hw
.tex
[unit
].cmd
[TEX_PP_TXABLEND
] = alpha_combine
;
1224 #define TEXOBJ_TXFILTER_MASK (RADEON_MAX_MIP_LEVEL_MASK | \
1225 RADEON_MIN_FILTER_MASK | \
1226 RADEON_MAG_FILTER_MASK | \
1227 RADEON_MAX_ANISO_MASK | \
1228 RADEON_YUV_TO_RGB | \
1229 RADEON_YUV_TEMPERATURE_MASK | \
1230 RADEON_CLAMP_S_MASK | \
1231 RADEON_CLAMP_T_MASK | \
1232 RADEON_BORDER_MODE_D3D )
1234 #define TEXOBJ_TXFORMAT_MASK (RADEON_TXFORMAT_WIDTH_MASK | \
1235 RADEON_TXFORMAT_HEIGHT_MASK | \
1236 RADEON_TXFORMAT_FORMAT_MASK | \
1237 RADEON_TXFORMAT_F5_WIDTH_MASK | \
1238 RADEON_TXFORMAT_F5_HEIGHT_MASK | \
1239 RADEON_TXFORMAT_ALPHA_IN_MAP | \
1240 RADEON_TXFORMAT_CUBIC_MAP_ENABLE | \
1241 RADEON_TXFORMAT_NON_POWER2)
1244 static void import_tex_obj_state( radeonContextPtr rmesa
,
1246 radeonTexObjPtr texobj
)
1248 GLuint
*cmd
= RADEON_DB_STATE( tex
[unit
] );
1250 cmd
[TEX_PP_TXFILTER
] &= ~TEXOBJ_TXFILTER_MASK
;
1251 cmd
[TEX_PP_TXFILTER
] |= texobj
->pp_txfilter
& TEXOBJ_TXFILTER_MASK
;
1252 cmd
[TEX_PP_TXFORMAT
] &= ~TEXOBJ_TXFORMAT_MASK
;
1253 cmd
[TEX_PP_TXFORMAT
] |= texobj
->pp_txformat
& TEXOBJ_TXFORMAT_MASK
;
1254 cmd
[TEX_PP_TXOFFSET
] = texobj
->pp_txoffset
;
1255 cmd
[TEX_PP_BORDER_COLOR
] = texobj
->pp_border_color
;
1256 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.tex
[unit
] );
1258 if (texobj
->base
.tObj
->Target
== GL_TEXTURE_RECTANGLE_NV
) {
1259 GLuint
*txr_cmd
= RADEON_DB_STATE( txr
[unit
] );
1260 txr_cmd
[TXR_PP_TEX_SIZE
] = texobj
->pp_txsize
; /* NPOT only! */
1261 txr_cmd
[TXR_PP_TEX_PITCH
] = texobj
->pp_txpitch
; /* NPOT only! */
1262 RADEON_DB_STATECHANGE( rmesa
, &rmesa
->hw
.txr
[unit
] );
1265 texobj
->dirty_state
&= ~(1<<unit
);
1271 static void set_texgen_matrix( radeonContextPtr rmesa
,
1273 const GLfloat
*s_plane
,
1274 const GLfloat
*t_plane
)
1276 static const GLfloat scale_identity
[4] = { 1,1,1,1 };
1278 if (!TEST_EQ_4V( s_plane
, scale_identity
) ||
1279 !TEST_EQ_4V( t_plane
, scale_identity
)) {
1280 rmesa
->TexGenEnabled
|= RADEON_TEXMAT_0_ENABLE
<<unit
;
1281 rmesa
->TexGenMatrix
[unit
].m
[0] = s_plane
[0];
1282 rmesa
->TexGenMatrix
[unit
].m
[4] = s_plane
[1];
1283 rmesa
->TexGenMatrix
[unit
].m
[8] = s_plane
[2];
1284 rmesa
->TexGenMatrix
[unit
].m
[12] = s_plane
[3];
1286 rmesa
->TexGenMatrix
[unit
].m
[1] = t_plane
[0];
1287 rmesa
->TexGenMatrix
[unit
].m
[5] = t_plane
[1];
1288 rmesa
->TexGenMatrix
[unit
].m
[9] = t_plane
[2];
1289 rmesa
->TexGenMatrix
[unit
].m
[13] = t_plane
[3];
1290 rmesa
->NewGLState
|= _NEW_TEXTURE_MATRIX
;
1294 /* Ignoring the Q texcoord for now.
1296 * Returns GL_FALSE if fallback required.
1298 static GLboolean
radeon_validate_texgen( GLcontext
*ctx
, GLuint unit
)
1300 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
1301 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
1302 GLuint inputshift
= RADEON_TEXGEN_0_INPUT_SHIFT
+ unit
*4;
1303 GLuint tmp
= rmesa
->TexGenEnabled
;
1305 rmesa
->TexGenEnabled
&= ~(RADEON_TEXGEN_TEXMAT_0_ENABLE
<<unit
);
1306 rmesa
->TexGenEnabled
&= ~(RADEON_TEXMAT_0_ENABLE
<<unit
);
1307 rmesa
->TexGenEnabled
&= ~(RADEON_TEXGEN_INPUT_MASK
<<inputshift
);
1308 rmesa
->TexGenNeedNormals
[unit
] = 0;
1310 if ((texUnit
->TexGenEnabled
& (S_BIT
|T_BIT
)) == 0) {
1311 /* Disabled, no fallback:
1313 rmesa
->TexGenEnabled
|=
1314 (RADEON_TEXGEN_INPUT_TEXCOORD_0
+unit
) << inputshift
;
1317 else if (texUnit
->TexGenEnabled
& Q_BIT
) {
1318 /* Very easy to do this, in fact would remove a fallback case
1319 * elsewhere, but I haven't done it yet... Fallback:
1321 fprintf(stderr
, "fallback Q_BIT\n");
1324 else if ((texUnit
->TexGenEnabled
& (S_BIT
|T_BIT
)) != (S_BIT
|T_BIT
) ||
1325 texUnit
->GenModeS
!= texUnit
->GenModeT
) {
1326 /* Mixed modes, fallback:
1328 /* fprintf(stderr, "fallback mixed texgen\n"); */
1332 rmesa
->TexGenEnabled
|= RADEON_TEXGEN_TEXMAT_0_ENABLE
<< unit
;
1334 switch (texUnit
->GenModeS
) {
1335 case GL_OBJECT_LINEAR
:
1336 rmesa
->TexGenEnabled
|= RADEON_TEXGEN_INPUT_OBJ
<< inputshift
;
1337 set_texgen_matrix( rmesa
, unit
,
1338 texUnit
->ObjectPlaneS
,
1339 texUnit
->ObjectPlaneT
);
1343 rmesa
->TexGenEnabled
|= RADEON_TEXGEN_INPUT_EYE
<< inputshift
;
1344 set_texgen_matrix( rmesa
, unit
,
1346 texUnit
->EyePlaneT
);
1349 case GL_REFLECTION_MAP_NV
:
1350 rmesa
->TexGenNeedNormals
[unit
] = GL_TRUE
;
1351 rmesa
->TexGenEnabled
|= RADEON_TEXGEN_INPUT_EYE_REFLECT
<<inputshift
;
1354 case GL_NORMAL_MAP_NV
:
1355 rmesa
->TexGenNeedNormals
[unit
] = GL_TRUE
;
1356 rmesa
->TexGenEnabled
|= RADEON_TEXGEN_INPUT_EYE_NORMAL
<<inputshift
;
1361 /* Unsupported mode, fallback:
1363 /* fprintf(stderr, "fallback unsupported texgen\n"); */
1367 if (tmp
!= rmesa
->TexGenEnabled
) {
1368 rmesa
->NewGLState
|= _NEW_TEXTURE_MATRIX
;
1375 static void disable_tex( GLcontext
*ctx
, int unit
)
1377 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
1379 if (rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] & (RADEON_TEX_0_ENABLE
<<unit
)) {
1380 /* Texture unit disabled */
1381 if ( rmesa
->state
.texture
.unit
[unit
].texobj
!= NULL
) {
1382 /* The old texture is no longer bound to this texture unit.
1386 rmesa
->state
.texture
.unit
[unit
].texobj
->base
.bound
&= ~(1UL << unit
);
1387 rmesa
->state
.texture
.unit
[unit
].texobj
= NULL
;
1390 RADEON_STATECHANGE( rmesa
, ctx
);
1391 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] &=
1392 ~((RADEON_TEX_0_ENABLE
| RADEON_TEX_BLEND_0_ENABLE
) << unit
);
1394 RADEON_STATECHANGE( rmesa
, tcl
);
1397 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] &= ~(RADEON_TCL_VTX_ST0
|
1401 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] &= ~(RADEON_TCL_VTX_ST1
|
1409 if (rmesa
->TclFallback
& (RADEON_TCL_FALLBACK_TEXGEN_0
<<unit
)) {
1410 TCL_FALLBACK( ctx
, (RADEON_TCL_FALLBACK_TEXGEN_0
<<unit
), GL_FALSE
);
1411 rmesa
->recheck_texgen
[unit
] = GL_TRUE
;
1417 GLuint inputshift
= RADEON_TEXGEN_0_INPUT_SHIFT
+ unit
*4;
1418 GLuint tmp
= rmesa
->TexGenEnabled
;
1420 rmesa
->TexGenEnabled
&= ~(RADEON_TEXGEN_TEXMAT_0_ENABLE
<<unit
);
1421 rmesa
->TexGenEnabled
&= ~(RADEON_TEXMAT_0_ENABLE
<<unit
);
1422 rmesa
->TexGenEnabled
&= ~(RADEON_TEXGEN_INPUT_MASK
<<inputshift
);
1423 rmesa
->TexGenNeedNormals
[unit
] = 0;
1424 rmesa
->TexGenEnabled
|=
1425 (RADEON_TEXGEN_INPUT_TEXCOORD_0
+unit
) << inputshift
;
1427 if (tmp
!= rmesa
->TexGenEnabled
) {
1428 rmesa
->recheck_texgen
[unit
] = GL_TRUE
;
1429 rmesa
->NewGLState
|= _NEW_TEXTURE_MATRIX
;
1435 static GLboolean
enable_tex_2d( GLcontext
*ctx
, int unit
)
1437 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
1438 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
1439 struct gl_texture_object
*tObj
= texUnit
->_Current
;
1440 radeonTexObjPtr t
= (radeonTexObjPtr
) tObj
->DriverData
;
1442 /* Need to load the 2d images associated with this unit.
1444 if (t
->pp_txformat
& RADEON_TXFORMAT_NON_POWER2
) {
1445 t
->pp_txformat
&= ~RADEON_TXFORMAT_NON_POWER2
;
1446 t
->base
.dirty_images
[0] = ~0;
1449 ASSERT(tObj
->Target
== GL_TEXTURE_2D
|| tObj
->Target
== GL_TEXTURE_1D
);
1451 if ( t
->base
.dirty_images
[0] ) {
1452 RADEON_FIREVERTICES( rmesa
);
1453 radeonSetTexImages( rmesa
, tObj
);
1454 radeonUploadTexImages( rmesa
, (radeonTexObjPtr
) tObj
->DriverData
, 0 );
1455 if ( !t
->base
.memBlock
)
1462 static GLboolean
enable_tex_rect( GLcontext
*ctx
, int unit
)
1464 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
1465 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
1466 struct gl_texture_object
*tObj
= texUnit
->_Current
;
1467 radeonTexObjPtr t
= (radeonTexObjPtr
) tObj
->DriverData
;
1469 if (!(t
->pp_txformat
& RADEON_TXFORMAT_NON_POWER2
)) {
1470 t
->pp_txformat
|= RADEON_TXFORMAT_NON_POWER2
;
1471 t
->base
.dirty_images
[0] = ~0;
1474 ASSERT(tObj
->Target
== GL_TEXTURE_RECTANGLE_NV
);
1476 if ( t
->base
.dirty_images
[0] ) {
1477 RADEON_FIREVERTICES( rmesa
);
1478 radeonSetTexImages( rmesa
, tObj
);
1479 radeonUploadTexImages( rmesa
, (radeonTexObjPtr
) tObj
->DriverData
, 0 );
1480 if ( !t
->base
.memBlock
/* && !rmesa->prefer_gart_client_texturing FIXME */ ) {
1481 fprintf(stderr
, "%s: upload failed\n", __FUNCTION__
);
1490 static GLboolean
update_tex_common( GLcontext
*ctx
, int unit
)
1492 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
1493 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
1494 struct gl_texture_object
*tObj
= texUnit
->_Current
;
1495 radeonTexObjPtr t
= (radeonTexObjPtr
) tObj
->DriverData
;
1498 /* Fallback if there's a texture border */
1499 if ( tObj
->Image
[0][tObj
->BaseLevel
]->Border
> 0 ) {
1500 fprintf(stderr
, "%s: border\n", __FUNCTION__
);
1504 /* Update state if this is a different texture object to last
1507 if ( rmesa
->state
.texture
.unit
[unit
].texobj
!= t
) {
1508 if ( rmesa
->state
.texture
.unit
[unit
].texobj
!= NULL
) {
1509 /* The old texture is no longer bound to this texture unit.
1513 rmesa
->state
.texture
.unit
[unit
].texobj
->base
.bound
&=
1517 rmesa
->state
.texture
.unit
[unit
].texobj
= t
;
1518 t
->base
.bound
|= (1UL << unit
);
1519 t
->dirty_state
|= 1<<unit
;
1520 driUpdateTextureLRU( (driTextureObject
*) t
); /* XXX: should be locked! */
1526 if ( !(rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] & (RADEON_TEX_0_ENABLE
<<unit
))) {
1527 RADEON_STATECHANGE( rmesa
, ctx
);
1528 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] |=
1529 (RADEON_TEX_0_ENABLE
| RADEON_TEX_BLEND_0_ENABLE
) << unit
;
1531 RADEON_STATECHANGE( rmesa
, tcl
);
1534 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_ST0
;
1536 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] |= RADEON_TCL_VTX_ST1
;
1538 rmesa
->recheck_texgen
[unit
] = GL_TRUE
;
1541 if (t
->dirty_state
& (1<<unit
)) {
1542 import_tex_obj_state( rmesa
, unit
, t
);
1545 if (rmesa
->recheck_texgen
[unit
]) {
1546 GLboolean fallback
= !radeon_validate_texgen( ctx
, unit
);
1547 TCL_FALLBACK( ctx
, (RADEON_TCL_FALLBACK_TEXGEN_0
<<unit
), fallback
);
1548 rmesa
->recheck_texgen
[unit
] = 0;
1549 rmesa
->NewGLState
|= _NEW_TEXTURE_MATRIX
;
1552 format
= tObj
->Image
[0][tObj
->BaseLevel
]->Format
;
1553 if ( rmesa
->state
.texture
.unit
[unit
].format
!= format
||
1554 rmesa
->state
.texture
.unit
[unit
].envMode
!= texUnit
->EnvMode
) {
1555 rmesa
->state
.texture
.unit
[unit
].format
= format
;
1556 rmesa
->state
.texture
.unit
[unit
].envMode
= texUnit
->EnvMode
;
1557 if ( ! radeonUpdateTextureEnv( ctx
, unit
) ) {
1562 FALLBACK( rmesa
, RADEON_FALLBACK_BORDER_MODE
, t
->border_fallback
);
1563 return !t
->border_fallback
;
1568 static GLboolean
radeonUpdateTextureUnit( GLcontext
*ctx
, int unit
)
1570 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
1572 TCL_FALLBACK( ctx
, RADEON_TCL_FALLBACK_TEXRECT_0
<< unit
, 0 );
1574 if ( texUnit
->_ReallyEnabled
& (TEXTURE_RECT_BIT
) ) {
1575 TCL_FALLBACK( ctx
, RADEON_TCL_FALLBACK_TEXRECT_0
<< unit
, 1 );
1577 return (enable_tex_rect( ctx
, unit
) &&
1578 update_tex_common( ctx
, unit
));
1580 else if ( texUnit
->_ReallyEnabled
& (TEXTURE_1D_BIT
| TEXTURE_2D_BIT
) ) {
1581 return (enable_tex_2d( ctx
, unit
) &&
1582 update_tex_common( ctx
, unit
));
1584 else if ( texUnit
->_ReallyEnabled
) {
1588 disable_tex( ctx
, unit
);
1593 void radeonUpdateTextureState( GLcontext
*ctx
)
1595 radeonContextPtr rmesa
= RADEON_CONTEXT(ctx
);
1598 ok
= (radeonUpdateTextureUnit( ctx
, 0 ) &&
1599 radeonUpdateTextureUnit( ctx
, 1 ));
1601 FALLBACK( rmesa
, RADEON_FALLBACK_TEXTURE
, !ok
);
1603 if (rmesa
->TclFallback
)
1604 radeonChooseVertexState( ctx
);