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