Fix texture format selection. ChooseTextureFormat is supposed to select the
[mesa.git] / src / mesa / drivers / dri / i810 / i810texstate.c
1 /*
2 * GLX Hardware Device Driver for Intel i810
3 * Copyright (C) 1999 Keith Whitwell
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included
13 * in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
21 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 *
23 */
24
25 #include "glheader.h"
26 #include "macros.h"
27 #include "mtypes.h"
28 #include "texformat.h"
29 #include "simple_list.h"
30 #include "enums.h"
31
32 #include "mm.h"
33
34 #include "i810screen.h"
35 #include "i810_dri.h"
36
37 #include "i810context.h"
38 #include "i810tex.h"
39 #include "i810state.h"
40 #include "i810ioctl.h"
41
42
43
44
45 static void i810SetTexImages( i810ContextPtr imesa,
46 struct gl_texture_object *tObj )
47 {
48 GLuint height, width, pitch, i, textureFormat, log_pitch;
49 i810TextureObjectPtr t = (i810TextureObjectPtr) tObj->DriverData;
50 const struct gl_texture_image *baseImage = tObj->Image[0][tObj->BaseLevel];
51 GLint numLevels;
52 GLint log2Width, log2Height;
53
54 /* fprintf(stderr, "%s\n", __FUNCTION__); */
55
56 t->texelBytes = 2;
57 switch (baseImage->TexFormat->MesaFormat) {
58 case MESA_FORMAT_ARGB1555:
59 textureFormat = MI1_FMT_16BPP | MI1_PF_16BPP_ARGB1555;
60 break;
61 case MESA_FORMAT_ARGB4444:
62 textureFormat = MI1_FMT_16BPP | MI1_PF_16BPP_ARGB4444;
63 break;
64 case MESA_FORMAT_RGB565:
65 textureFormat = MI1_FMT_16BPP | MI1_PF_16BPP_RGB565;
66 break;
67 case MESA_FORMAT_AL88:
68 textureFormat = MI1_FMT_16BPP | MI1_PF_16BPP_AY88;
69 break;
70 case MESA_FORMAT_YCBCR:
71 textureFormat = MI1_FMT_422 | MI1_PF_422_YCRCB_SWAP_Y
72 | MI1_COLOR_CONV_ENABLE;
73 break;
74 case MESA_FORMAT_YCBCR_REV:
75 textureFormat = MI1_FMT_422 | MI1_PF_422_YCRCB
76 | MI1_COLOR_CONV_ENABLE;
77 break;
78 case MESA_FORMAT_CI8:
79 textureFormat = MI1_FMT_8CI | MI1_PF_8CI_ARGB4444;
80 t->texelBytes = 1;
81 break;
82
83 default:
84 fprintf(stderr, "i810SetTexImages: bad image->Format\n" );
85 return;
86 }
87
88 driCalculateTextureFirstLastLevel( (driTextureObject *) t );
89
90 numLevels = t->base.lastLevel - t->base.firstLevel + 1;
91
92 log2Width = tObj->Image[0][t->base.firstLevel]->WidthLog2;
93 log2Height = tObj->Image[0][t->base.firstLevel]->HeightLog2;
94
95 /* Figure out the amount of memory required to hold all the mipmap
96 * levels. Choose the smallest pitch to accomodate the largest
97 * mipmap:
98 */
99 width = tObj->Image[0][t->base.firstLevel]->Width * t->texelBytes;
100 for (pitch = 32, log_pitch=2 ; pitch < width ; pitch *= 2 )
101 log_pitch++;
102
103 /* All images must be loaded at this pitch. Count the number of
104 * lines required:
105 */
106 for ( height = i = 0 ; i < numLevels ; i++ ) {
107 t->image[i].image = tObj->Image[0][t->base.firstLevel + i];
108 t->image[i].offset = height * pitch;
109 t->image[i].internalFormat = baseImage->Format;
110 height += t->image[i].image->Height;
111 }
112
113 t->Pitch = pitch;
114 t->base.totalSize = height*pitch;
115 t->max_level = i-1;
116 t->dirty = I810_UPLOAD_TEX0 | I810_UPLOAD_TEX1;
117 t->Setup[I810_TEXREG_MI1] = (MI1_MAP_0 | textureFormat | log_pitch);
118 t->Setup[I810_TEXREG_MI2] = (MI2_DIMENSIONS_ARE_LOG2 |
119 (log2Height << 16) | log2Width);
120 t->Setup[I810_TEXREG_MLL] = (GFX_OP_MAP_LOD_LIMITS |
121 MLL_MAP_0 |
122 MLL_UPDATE_MAX_MIP |
123 MLL_UPDATE_MIN_MIP |
124 ((numLevels - 1) << MLL_MIN_MIP_SHIFT));
125
126 LOCK_HARDWARE( imesa );
127 i810UploadTexImagesLocked( imesa, t );
128 UNLOCK_HARDWARE( imesa );
129 }
130
131 /* ================================================================
132 * Texture combine functions
133 */
134
135 #define I810_DISABLE 0
136 #define I810_PASSTHRU 1
137 #define I810_REPLACE 2
138 #define I810_MODULATE 3
139 #define I810_DECAL 4
140 #define I810_BLEND 5
141 #define I810_ALPHA_BLEND 6
142 #define I810_ADD 7
143 #define I810_MAX_COMBFUNC 8
144
145
146 static GLuint i810_color_combine[][I810_MAX_COMBFUNC] =
147 {
148 /* Unit 0:
149 */
150 {
151 /* Disable combiner stage
152 */
153 ( GFX_OP_MAP_COLOR_STAGES |
154 MC_STAGE_0 |
155 MC_UPDATE_DEST |
156 MC_DEST_CURRENT |
157 MC_UPDATE_ARG1 |
158 MC_ARG1_ITERATED_COLOR |
159 MC_UPDATE_ARG2 |
160 MC_ARG2_ONE |
161 MC_UPDATE_OP |
162 MC_OP_ARG1 ), /* actually passthru */
163
164 /* Passthru
165 */
166 ( GFX_OP_MAP_COLOR_STAGES |
167 MC_STAGE_0 |
168 MC_UPDATE_DEST |
169 MC_DEST_CURRENT |
170 MC_UPDATE_ARG1 |
171 MC_ARG1_ITERATED_COLOR |
172 MC_UPDATE_ARG2 |
173 MC_ARG2_ONE |
174 MC_UPDATE_OP |
175 MC_OP_ARG1 ),
176
177 /* GL_REPLACE
178 */
179 ( GFX_OP_MAP_COLOR_STAGES |
180 MC_STAGE_0 |
181 MC_UPDATE_DEST |
182 MC_DEST_CURRENT |
183 MC_UPDATE_ARG1 |
184 MC_ARG1_TEX0_COLOR |
185 MC_UPDATE_ARG2 |
186 MC_ARG2_ONE |
187 MC_UPDATE_OP |
188 MC_OP_ARG1 ),
189
190 /* GL_MODULATE
191 */
192 ( GFX_OP_MAP_COLOR_STAGES |
193 MC_STAGE_0 |
194 MC_UPDATE_DEST |
195 MC_DEST_CURRENT |
196 MC_UPDATE_ARG1 |
197 MC_ARG1_TEX0_COLOR |
198 MC_UPDATE_ARG2 |
199 MC_ARG2_ITERATED_COLOR |
200 MC_UPDATE_OP |
201 MC_OP_MODULATE ),
202
203 /* GL_DECAL
204 */
205 ( GFX_OP_MAP_COLOR_STAGES |
206 MC_STAGE_0 |
207 MC_UPDATE_DEST |
208 MC_DEST_CURRENT |
209 MC_UPDATE_ARG1 |
210 MC_ARG1_COLOR_FACTOR |
211 MC_UPDATE_ARG2 |
212 MC_ARG2_TEX0_COLOR |
213 MC_UPDATE_OP |
214 MC_OP_LIN_BLEND_TEX0_ALPHA ),
215
216 /* GL_BLEND
217 */
218 ( GFX_OP_MAP_COLOR_STAGES |
219 MC_STAGE_0 |
220 MC_UPDATE_DEST |
221 MC_DEST_CURRENT |
222 MC_UPDATE_ARG1 |
223 MC_ARG1_COLOR_FACTOR |
224 MC_UPDATE_ARG2 |
225 MC_ARG2_ITERATED_COLOR |
226 MC_UPDATE_OP |
227 MC_OP_LIN_BLEND_TEX0_COLOR ),
228
229 /* GL_BLEND according to alpha
230 */
231 ( GFX_OP_MAP_COLOR_STAGES |
232 MC_STAGE_0 |
233 MC_UPDATE_DEST |
234 MC_DEST_CURRENT |
235 MC_UPDATE_ARG1 |
236 MC_ARG1_TEX0_COLOR |
237 MC_UPDATE_ARG2 |
238 MC_ARG2_ITERATED_COLOR |
239 MC_UPDATE_OP |
240 MC_OP_LIN_BLEND_TEX0_ALPHA ),
241
242 /* GL_ADD
243 */
244 ( GFX_OP_MAP_COLOR_STAGES |
245 MC_STAGE_0 |
246 MC_UPDATE_DEST |
247 MC_DEST_CURRENT |
248 MC_UPDATE_ARG1 |
249 MC_ARG1_TEX0_COLOR |
250 MC_UPDATE_ARG2 |
251 MC_ARG2_ITERATED_COLOR |
252 MC_UPDATE_OP |
253 MC_OP_ADD ),
254 },
255
256 /* Unit 1:
257 */
258 {
259 /* Disable combiner stage (Note: disables all subsequent stages)
260 */
261 ( GFX_OP_MAP_COLOR_STAGES |
262 MC_STAGE_1 |
263 MC_UPDATE_DEST |
264 MC_DEST_CURRENT |
265 MC_UPDATE_ARG1 |
266 MC_ARG1_ONE |
267 MC_UPDATE_ARG2 |
268 MC_ARG2_ONE |
269 MC_UPDATE_OP |
270 MC_OP_DISABLE ),
271
272
273 /* Passthru
274 */
275 ( GFX_OP_MAP_COLOR_STAGES |
276 MC_STAGE_1 |
277 MC_UPDATE_DEST |
278 MC_DEST_CURRENT |
279 MC_UPDATE_ARG1 |
280 MC_ARG1_CURRENT_COLOR |
281 MC_UPDATE_ARG2 |
282 MC_ARG2_ONE |
283 MC_UPDATE_OP |
284 MC_OP_ARG1 ),
285
286 /* GL_REPLACE
287 */
288 ( GFX_OP_MAP_COLOR_STAGES |
289 MC_STAGE_1 |
290 MC_UPDATE_DEST |
291 MC_DEST_CURRENT |
292 MC_UPDATE_ARG1 |
293 MC_ARG1_TEX1_COLOR |
294 MC_UPDATE_ARG2 |
295 MC_ARG2_ONE |
296 MC_UPDATE_OP |
297 MC_OP_ARG1 ),
298
299 /* GL_MODULATE
300 */
301 ( GFX_OP_MAP_COLOR_STAGES |
302 MC_STAGE_1 |
303 MC_UPDATE_DEST |
304 MC_DEST_CURRENT |
305 MC_UPDATE_ARG1 |
306 MC_ARG1_TEX1_COLOR |
307 MC_UPDATE_ARG2 |
308 MC_ARG2_CURRENT_COLOR |
309 MC_UPDATE_OP |
310 MC_OP_MODULATE ),
311
312 /* GL_DECAL
313 */
314 ( GFX_OP_MAP_COLOR_STAGES |
315 MC_STAGE_1 |
316 MC_UPDATE_DEST |
317 MC_DEST_CURRENT |
318 MC_UPDATE_ARG1 |
319 MC_ARG1_COLOR_FACTOR |
320 MC_UPDATE_ARG2 |
321 MC_ARG2_TEX1_COLOR |
322 MC_UPDATE_OP |
323 MC_OP_LIN_BLEND_TEX1_ALPHA ),
324
325 /* GL_BLEND
326 */
327 ( GFX_OP_MAP_COLOR_STAGES |
328 MC_STAGE_1 |
329 MC_UPDATE_DEST |
330 MC_DEST_CURRENT |
331 MC_UPDATE_ARG1 |
332 MC_ARG1_COLOR_FACTOR |
333 MC_UPDATE_ARG2 |
334 MC_ARG2_CURRENT_COLOR |
335 MC_UPDATE_OP |
336 MC_OP_LIN_BLEND_TEX1_COLOR ),
337
338 /* GL_BLEND according to alpha
339 */
340 ( GFX_OP_MAP_COLOR_STAGES |
341 MC_STAGE_1 |
342 MC_UPDATE_DEST |
343 MC_DEST_CURRENT |
344 MC_UPDATE_ARG1 |
345 MC_ARG1_TEX1_COLOR |
346 MC_UPDATE_ARG2 |
347 MC_ARG2_CURRENT_COLOR |
348 MC_UPDATE_OP |
349 MC_OP_LIN_BLEND_TEX1_ALPHA ),
350
351 /* GL_ADD
352 */
353 ( GFX_OP_MAP_COLOR_STAGES |
354 MC_STAGE_1 |
355 MC_UPDATE_DEST |
356 MC_DEST_CURRENT |
357 MC_UPDATE_ARG1 |
358 MC_ARG1_TEX1_COLOR |
359 MC_UPDATE_ARG2 |
360 MC_ARG2_CURRENT_COLOR |
361 MC_UPDATE_OP |
362 MC_OP_ADD ),
363 }
364 };
365
366 static GLuint i810_alpha_combine[][I810_MAX_COMBFUNC] =
367 {
368 /* Unit 0:
369 */
370 {
371 /* Disable combiner stage
372 */
373 ( GFX_OP_MAP_ALPHA_STAGES |
374 MA_STAGE_0 |
375 MA_UPDATE_ARG1 |
376 MA_ARG1_ITERATED_ALPHA |
377 MA_UPDATE_ARG2 |
378 MA_ARG2_TEX0_ALPHA |
379 MA_UPDATE_OP |
380 MA_OP_ARG1 ),
381
382 /* Passthru
383 */
384 ( GFX_OP_MAP_ALPHA_STAGES |
385 MA_STAGE_0 |
386 MA_UPDATE_ARG1 |
387 MA_ARG1_ITERATED_ALPHA |
388 MA_UPDATE_ARG2 |
389 MA_ARG2_TEX0_ALPHA |
390 MA_UPDATE_OP |
391 MA_OP_ARG1 ),
392
393 /* GL_REPLACE
394 */
395 ( GFX_OP_MAP_ALPHA_STAGES |
396 MA_STAGE_0 |
397 MA_UPDATE_ARG1 |
398 MA_ARG1_ITERATED_ALPHA |
399 MA_UPDATE_ARG2 |
400 MA_ARG2_TEX0_ALPHA |
401 MA_UPDATE_OP |
402 MA_OP_ARG2 ),
403
404 /* GL_MODULATE
405 */
406 ( GFX_OP_MAP_ALPHA_STAGES |
407 MA_STAGE_0 |
408 MA_UPDATE_ARG1 |
409 MA_ARG1_ITERATED_ALPHA |
410 MA_UPDATE_ARG2 |
411 MA_ARG2_TEX0_ALPHA |
412 MA_UPDATE_OP |
413 MA_OP_MODULATE ),
414
415 /* GL_DECAL
416 */
417 ( GFX_OP_MAP_ALPHA_STAGES |
418 MA_STAGE_0 |
419 MA_UPDATE_ARG1 |
420 MA_ARG1_ALPHA_FACTOR |
421 MA_UPDATE_ARG2 |
422 MA_ARG2_ALPHA_FACTOR |
423 MA_UPDATE_OP |
424 MA_OP_ARG1 ),
425
426 /* GL_BLEND
427 */
428 ( GFX_OP_MAP_ALPHA_STAGES |
429 MA_STAGE_0 |
430 MA_UPDATE_ARG1 |
431 MA_ARG1_ALPHA_FACTOR |
432 MA_UPDATE_ARG2 |
433 MA_ARG2_ITERATED_ALPHA |
434 MA_UPDATE_OP |
435 MA_OP_LIN_BLEND_TEX0_ALPHA ),
436
437 /* GL_BLEND according to alpha (same as above)
438 */
439 ( GFX_OP_MAP_ALPHA_STAGES |
440 MA_STAGE_0 |
441 MA_UPDATE_ARG1 |
442 MA_ARG1_ALPHA_FACTOR |
443 MA_UPDATE_ARG2 |
444 MA_ARG2_ITERATED_ALPHA |
445 MA_UPDATE_OP |
446 MA_OP_LIN_BLEND_TEX0_ALPHA ),
447
448 /* GL_ADD
449 */
450 ( GFX_OP_MAP_ALPHA_STAGES |
451 MA_STAGE_0 |
452 MA_UPDATE_ARG1 |
453 MA_ARG1_ITERATED_ALPHA |
454 MA_UPDATE_ARG2 |
455 MA_ARG2_TEX0_ALPHA |
456 MA_UPDATE_OP |
457 MA_OP_ADD ),
458 },
459
460 /* Unit 1:
461 */
462 {
463 /* Disable combiner stage
464 */
465 ( GFX_OP_MAP_ALPHA_STAGES |
466 MA_STAGE_1 |
467 MA_UPDATE_ARG1 |
468 MA_ARG1_CURRENT_ALPHA |
469 MA_UPDATE_ARG2 |
470 MA_ARG2_CURRENT_ALPHA |
471 MA_UPDATE_OP |
472 MA_OP_ARG1 ),
473
474 /* Passthru
475 */
476 ( GFX_OP_MAP_ALPHA_STAGES |
477 MA_STAGE_1 |
478 MA_UPDATE_ARG1 |
479 MA_ARG1_CURRENT_ALPHA |
480 MA_UPDATE_ARG2 |
481 MA_ARG2_CURRENT_ALPHA |
482 MA_UPDATE_OP |
483 MA_OP_ARG1 ),
484
485 /* GL_REPLACE
486 */
487 ( GFX_OP_MAP_ALPHA_STAGES |
488 MA_STAGE_1 |
489 MA_UPDATE_ARG1 |
490 MA_ARG1_CURRENT_ALPHA |
491 MA_UPDATE_ARG2 |
492 MA_ARG2_TEX1_ALPHA |
493 MA_UPDATE_OP |
494 MA_OP_ARG2 ),
495
496 /* GL_MODULATE
497 */
498 ( GFX_OP_MAP_ALPHA_STAGES |
499 MA_STAGE_1 |
500 MA_UPDATE_ARG1 |
501 MA_ARG1_CURRENT_ALPHA |
502 MA_UPDATE_ARG2 |
503 MA_ARG2_TEX1_ALPHA |
504 MA_UPDATE_OP |
505 MA_OP_MODULATE ),
506
507 /* GL_DECAL
508 */
509 ( GFX_OP_MAP_ALPHA_STAGES |
510 MA_STAGE_1 |
511 MA_UPDATE_ARG1 |
512 MA_ARG1_ALPHA_FACTOR |
513 MA_UPDATE_ARG2 |
514 MA_ARG2_ALPHA_FACTOR |
515 MA_UPDATE_OP |
516 MA_OP_ARG1 ),
517
518 /* GL_BLEND
519 */
520 ( GFX_OP_MAP_ALPHA_STAGES |
521 MA_STAGE_1 |
522 MA_UPDATE_ARG1 |
523 MA_ARG1_ALPHA_FACTOR |
524 MA_UPDATE_ARG2 |
525 MA_ARG2_ITERATED_ALPHA |
526 MA_UPDATE_OP |
527 MA_OP_LIN_BLEND_TEX1_ALPHA ),
528
529 /* GL_BLEND according to alpha (same as above)
530 */
531 ( GFX_OP_MAP_ALPHA_STAGES |
532 MA_STAGE_1 |
533 MA_UPDATE_ARG1 |
534 MA_ARG1_ALPHA_FACTOR |
535 MA_UPDATE_ARG2 |
536 MA_ARG2_ITERATED_ALPHA |
537 MA_UPDATE_OP |
538 MA_OP_LIN_BLEND_TEX1_ALPHA ),
539
540 /* GL_ADD
541 */
542 ( GFX_OP_MAP_ALPHA_STAGES |
543 MA_STAGE_1 |
544 MA_UPDATE_ARG1 |
545 MA_ARG1_CURRENT_ALPHA |
546 MA_UPDATE_ARG2 |
547 MA_ARG2_TEX1_ALPHA |
548 MA_UPDATE_OP |
549 MA_OP_ADD ),
550 }
551
552 };
553
554
555
556 static void i810UpdateTexEnv( GLcontext *ctx, GLuint unit )
557 {
558 i810ContextPtr imesa = I810_CONTEXT(ctx);
559 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
560 const struct gl_texture_object *tObj = texUnit->_Current;
561 const GLuint format = tObj->Image[0][tObj->BaseLevel]->Format;
562 GLuint color_combine, alpha_combine;
563
564 switch (texUnit->EnvMode) {
565 case GL_REPLACE:
566 if (format == GL_ALPHA) {
567 color_combine = i810_color_combine[unit][I810_PASSTHRU];
568 alpha_combine = i810_alpha_combine[unit][I810_REPLACE];
569 } else if (format == GL_LUMINANCE || format == GL_RGB) {
570 color_combine = i810_color_combine[unit][I810_REPLACE];
571 alpha_combine = i810_alpha_combine[unit][I810_PASSTHRU];
572 } else {
573 color_combine = i810_color_combine[unit][I810_REPLACE];
574 alpha_combine = i810_alpha_combine[unit][I810_REPLACE];
575 }
576 break;
577
578 case GL_MODULATE:
579 if (format == GL_ALPHA) {
580 color_combine = i810_color_combine[unit][I810_PASSTHRU];
581 alpha_combine = i810_alpha_combine[unit][I810_MODULATE];
582 } else {
583 color_combine = i810_color_combine[unit][I810_MODULATE];
584 alpha_combine = i810_alpha_combine[unit][I810_MODULATE];
585 }
586 break;
587
588 case GL_DECAL:
589 switch (format) {
590 case GL_RGBA:
591 color_combine = i810_color_combine[unit][I810_ALPHA_BLEND];
592 alpha_combine = i810_alpha_combine[unit][I810_PASSTHRU];
593 break;
594 case GL_RGB:
595 color_combine = i810_color_combine[unit][I810_REPLACE];
596 alpha_combine = i810_alpha_combine[unit][I810_PASSTHRU];
597 break;
598 case GL_ALPHA:
599 case GL_LUMINANCE:
600 case GL_LUMINANCE_ALPHA:
601 case GL_INTENSITY:
602 color_combine = i810_color_combine[unit][I810_PASSTHRU];
603 alpha_combine = i810_alpha_combine[unit][I810_PASSTHRU];
604 break;
605 case GL_COLOR_INDEX:
606 default:
607 return;
608 }
609 break;
610
611 case GL_BLEND:
612 switch (format) {
613 case GL_RGB:
614 case GL_LUMINANCE:
615 color_combine = i810_color_combine[unit][I810_BLEND];
616 alpha_combine = i810_alpha_combine[unit][I810_PASSTHRU];
617 break;
618 case GL_RGBA:
619 case GL_LUMINANCE_ALPHA:
620 color_combine = i810_color_combine[unit][I810_BLEND];
621 alpha_combine = i810_alpha_combine[unit][I810_MODULATE];
622 break;
623 case GL_ALPHA:
624 color_combine = i810_color_combine[unit][I810_PASSTHRU];
625 alpha_combine = i810_alpha_combine[unit][I810_MODULATE];
626 break;
627 case GL_INTENSITY:
628 color_combine = i810_color_combine[unit][I810_BLEND];
629 alpha_combine = i810_alpha_combine[unit][I810_BLEND];
630 break;
631 case GL_COLOR_INDEX:
632 default:
633 return;
634 }
635 break;
636
637 case GL_ADD:
638 switch (format) {
639 case GL_RGB:
640 case GL_LUMINANCE:
641 color_combine = i810_color_combine[unit][I810_ADD];
642 alpha_combine = i810_alpha_combine[unit][I810_PASSTHRU];
643 break;
644 case GL_RGBA:
645 case GL_LUMINANCE_ALPHA:
646 color_combine = i810_color_combine[unit][I810_ADD];
647 alpha_combine = i810_alpha_combine[unit][I810_MODULATE];
648 break;
649 case GL_ALPHA:
650 color_combine = i810_color_combine[unit][I810_PASSTHRU];
651 alpha_combine = i810_alpha_combine[unit][I810_MODULATE];
652 break;
653 case GL_INTENSITY:
654 color_combine = i810_color_combine[unit][I810_ADD];
655 alpha_combine = i810_alpha_combine[unit][I810_ADD];
656 break;
657 case GL_COLOR_INDEX:
658 default:
659 return;
660 }
661 break;
662
663 default:
664 return;
665 }
666
667 if (alpha_combine != imesa->Setup[I810_CTXREG_MA0 + unit] ||
668 color_combine != imesa->Setup[I810_CTXREG_MC0 + unit])
669 {
670 I810_STATECHANGE( imesa, I810_UPLOAD_CTX );
671 imesa->Setup[I810_CTXREG_MA0 + unit] = alpha_combine;
672 imesa->Setup[I810_CTXREG_MC0 + unit] = color_combine;
673 }
674 }
675
676
677
678
679 static void i810UpdateTexUnit( GLcontext *ctx, GLuint unit )
680 {
681 i810ContextPtr imesa = I810_CONTEXT(ctx);
682 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
683
684 if (texUnit->_ReallyEnabled == TEXTURE_2D_BIT)
685 {
686 struct gl_texture_object *tObj = texUnit->_Current;
687 i810TextureObjectPtr t = (i810TextureObjectPtr)tObj->DriverData;
688
689 /* Upload teximages (not pipelined)
690 */
691 if (t->base.dirty_images[0]) {
692 I810_FIREVERTICES(imesa);
693 i810SetTexImages( imesa, tObj );
694 if (!t->base.memBlock) {
695 FALLBACK( imesa, I810_FALLBACK_TEXTURE, GL_TRUE );
696 return;
697 }
698 }
699
700 if (tObj->Image[0][tObj->BaseLevel]->Border > 0) {
701 FALLBACK( imesa, I810_FALLBACK_TEXTURE, GL_TRUE );
702 return;
703 }
704
705 /* Update state if this is a different texture object to last
706 * time.
707 */
708 if (imesa->CurrentTexObj[unit] != t) {
709 I810_STATECHANGE(imesa, (I810_UPLOAD_TEX0<<unit));
710 imesa->CurrentTexObj[unit] = t;
711 t->base.bound |= (1U << unit);
712
713 driUpdateTextureLRU( (driTextureObject *) t ); /* XXX: should be locked */
714
715 }
716
717 /* Update texture environment if texture object image format or
718 * texture environment state has changed.
719 */
720 if (tObj->Image[0][tObj->BaseLevel]->Format != imesa->TexEnvImageFmt[unit]) {
721 imesa->TexEnvImageFmt[unit] = tObj->Image[0][tObj->BaseLevel]->Format;
722 i810UpdateTexEnv( ctx, unit );
723 }
724 }
725 else if (texUnit->_ReallyEnabled) {
726 FALLBACK( imesa, I810_FALLBACK_TEXTURE, GL_TRUE );
727 }
728 else /*if (imesa->CurrentTexObj[unit])*/ {
729 imesa->CurrentTexObj[unit] = 0;
730 imesa->TexEnvImageFmt[unit] = 0;
731 imesa->dirty &= ~(I810_UPLOAD_TEX0<<unit);
732 imesa->Setup[I810_CTXREG_MA0 + unit] =
733 i810_alpha_combine[unit][I810_DISABLE];
734 imesa->Setup[I810_CTXREG_MC0 + unit] =
735 i810_color_combine[unit][I810_DISABLE];
736 I810_STATECHANGE( imesa, I810_UPLOAD_CTX );
737 }
738 }
739
740
741 void i810UpdateTextureState( GLcontext *ctx )
742 {
743 i810ContextPtr imesa = I810_CONTEXT(ctx);
744 /* fprintf(stderr, "%s\n", __FUNCTION__); */
745 FALLBACK( imesa, I810_FALLBACK_TEXTURE, GL_FALSE );
746 i810UpdateTexUnit( ctx, 0 );
747 i810UpdateTexUnit( ctx, 1 );
748 }
749
750
751