add missing license texts
[mesa.git] / src / mesa / drivers / dri / i915 / i830_texblend.c
1 /**************************************************************************
2 *
3 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
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:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
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.
25 *
26 **************************************************************************/
27
28 #include "glheader.h"
29 #include "macros.h"
30 #include "mtypes.h"
31 #include "simple_list.h"
32 #include "enums.h"
33 #include "texformat.h"
34 #include "texstore.h"
35
36 #include "mm.h"
37
38 #include "intel_screen.h"
39 #include "intel_ioctl.h"
40 #include "intel_tex.h"
41
42 #include "i830_context.h"
43 #include "i830_reg.h"
44
45
46 /* ================================================================
47 * Texture combine functions
48 */
49 static GLuint pass_through( GLuint *state, GLuint blendUnit )
50 {
51 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
52 TEXPIPE_COLOR |
53 ENABLE_TEXOUTPUT_WRT_SEL |
54 TEXOP_OUTPUT_CURRENT |
55 DISABLE_TEX_CNTRL_STAGE |
56 TEXOP_SCALE_1X |
57 TEXOP_MODIFY_PARMS |
58 TEXBLENDOP_ARG1);
59 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
60 TEXPIPE_ALPHA |
61 ENABLE_TEXOUTPUT_WRT_SEL |
62 TEXOP_OUTPUT_CURRENT |
63 TEXOP_SCALE_1X |
64 TEXOP_MODIFY_PARMS |
65 TEXBLENDOP_ARG1);
66 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
67 TEXPIPE_COLOR |
68 TEXBLEND_ARG1 |
69 TEXBLENDARG_MODIFY_PARMS |
70 TEXBLENDARG_CURRENT);
71 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
72 TEXPIPE_ALPHA |
73 TEXBLEND_ARG1 |
74 TEXBLENDARG_MODIFY_PARMS |
75 TEXBLENDARG_CURRENT);
76
77 return 4;
78 }
79
80 static GLuint emit_factor( GLuint blendUnit, GLuint *state, GLuint count,
81 const GLfloat *factor )
82 {
83 GLubyte r, g, b, a;
84 GLuint col;
85
86 if (0)
87 fprintf(stderr, "emit constant %d: %.2f %.2f %.2f %.2f\n",
88 blendUnit, factor[0], factor[1], factor[2], factor[3]);
89
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]);
94
95 col = ((a << 24) | (r << 16) | (g << 8) | b);
96
97 state[count++] = _3DSTATE_COLOR_FACTOR_N_CMD(blendUnit);
98 state[count++] = col;
99
100 return count;
101 }
102
103
104 static __inline__ GLuint GetTexelOp(GLint unit)
105 {
106 switch(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;
112 }
113 }
114
115
116 GLuint i830SetBlend_GL1_2(i830ContextPtr i830, int blendUnit,
117 GLenum envMode, GLenum format, GLuint texel_op,
118 GLuint *state, const GLfloat *factor)
119 {
120 if(INTEL_DEBUG&DEBUG_TEXTURE)
121 fprintf(stderr, "%s %s %s texel_op(0x%x)\n",
122 __FUNCTION__,
123 _mesa_lookup_enum_by_nr(format),
124 _mesa_lookup_enum_by_nr(envMode),
125 texel_op);
126
127 switch(envMode) {
128 case GL_REPLACE:
129 switch(format) {
130 case GL_ALPHA:
131 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
132 TEXPIPE_COLOR |
133 ENABLE_TEXOUTPUT_WRT_SEL |
134 TEXOP_OUTPUT_CURRENT |
135 DISABLE_TEX_CNTRL_STAGE |
136 TEXOP_SCALE_1X |
137 TEXOP_MODIFY_PARMS |
138 TEXBLENDOP_ARG1);
139 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
140 TEXPIPE_ALPHA |
141 ENABLE_TEXOUTPUT_WRT_SEL |
142 TEXOP_OUTPUT_CURRENT |
143 TEXOP_SCALE_1X |
144 TEXOP_MODIFY_PARMS |
145 TEXBLENDOP_ARG1);
146 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
147 TEXPIPE_COLOR |
148 TEXBLEND_ARG1 |
149 TEXBLENDARG_MODIFY_PARMS |
150 TEXBLENDARG_CURRENT);
151 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
152 TEXPIPE_ALPHA |
153 TEXBLEND_ARG1 |
154 TEXBLENDARG_MODIFY_PARMS |
155 texel_op);
156 return 4;
157
158 case GL_LUMINANCE:
159 case GL_RGB:
160 case GL_YCBCR_MESA:
161 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
162 TEXPIPE_COLOR |
163 ENABLE_TEXOUTPUT_WRT_SEL |
164 TEXOP_OUTPUT_CURRENT |
165 DISABLE_TEX_CNTRL_STAGE |
166 TEXOP_SCALE_1X |
167 TEXOP_MODIFY_PARMS |
168 TEXBLENDOP_ARG1);
169 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
170 TEXPIPE_ALPHA |
171 ENABLE_TEXOUTPUT_WRT_SEL |
172 TEXOP_OUTPUT_CURRENT |
173 TEXOP_SCALE_1X |
174 TEXOP_MODIFY_PARMS |
175 TEXBLENDOP_ARG1);
176 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
177 TEXPIPE_COLOR |
178 TEXBLEND_ARG1 |
179 TEXBLENDARG_MODIFY_PARMS |
180 texel_op);
181 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
182 TEXPIPE_ALPHA |
183 TEXBLEND_ARG1 |
184 TEXBLENDARG_MODIFY_PARMS |
185 TEXBLENDARG_CURRENT);
186 return 4;
187
188 case GL_INTENSITY:
189 case GL_LUMINANCE_ALPHA:
190 case GL_RGBA:
191 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
192 TEXPIPE_COLOR |
193 ENABLE_TEXOUTPUT_WRT_SEL |
194 TEXOP_OUTPUT_CURRENT |
195 DISABLE_TEX_CNTRL_STAGE |
196 TEXOP_SCALE_1X |
197 TEXOP_MODIFY_PARMS |
198 TEXBLENDOP_ARG1);
199 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
200 TEXPIPE_ALPHA |
201 ENABLE_TEXOUTPUT_WRT_SEL |
202 TEXOP_OUTPUT_CURRENT |
203 TEXOP_SCALE_1X |
204 TEXOP_MODIFY_PARMS |
205 TEXBLENDOP_ARG1);
206 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
207 TEXPIPE_COLOR |
208 TEXBLEND_ARG1 |
209 TEXBLENDARG_MODIFY_PARMS |
210 texel_op);
211 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
212 TEXPIPE_ALPHA |
213 TEXBLEND_ARG1 |
214 TEXBLENDARG_MODIFY_PARMS |
215 texel_op);
216 return 4;
217
218 default:
219 /* Always set to passthru if something is funny */
220 return pass_through( state, blendUnit );
221 }
222
223 case GL_MODULATE:
224 switch(format) {
225 case GL_ALPHA:
226 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
227 TEXPIPE_COLOR |
228 ENABLE_TEXOUTPUT_WRT_SEL |
229 TEXOP_OUTPUT_CURRENT |
230 DISABLE_TEX_CNTRL_STAGE |
231 TEXOP_SCALE_1X |
232 TEXOP_MODIFY_PARMS |
233 TEXBLENDOP_ARG1);
234 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
235 TEXPIPE_ALPHA |
236 ENABLE_TEXOUTPUT_WRT_SEL |
237 TEXOP_OUTPUT_CURRENT |
238 TEXOP_SCALE_1X |
239 TEXOP_MODIFY_PARMS |
240 TEXBLENDOP_MODULATE);
241 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
242 TEXPIPE_COLOR |
243 TEXBLEND_ARG1 |
244 TEXBLENDARG_MODIFY_PARMS |
245 TEXBLENDARG_CURRENT);
246 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
247 TEXPIPE_ALPHA |
248 TEXBLEND_ARG1 |
249 TEXBLENDARG_MODIFY_PARMS |
250 texel_op);
251 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
252 TEXPIPE_ALPHA |
253 TEXBLEND_ARG2 |
254 TEXBLENDARG_MODIFY_PARMS |
255 TEXBLENDARG_CURRENT);
256 return 5;
257
258 case GL_LUMINANCE:
259 case GL_RGB:
260 case GL_YCBCR_MESA:
261 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
262 TEXPIPE_COLOR |
263 ENABLE_TEXOUTPUT_WRT_SEL |
264 TEXOP_OUTPUT_CURRENT |
265 DISABLE_TEX_CNTRL_STAGE |
266 TEXOP_SCALE_1X |
267 TEXOP_MODIFY_PARMS |
268 TEXBLENDOP_MODULATE);
269 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
270 TEXPIPE_ALPHA |
271 ENABLE_TEXOUTPUT_WRT_SEL |
272 TEXOP_OUTPUT_CURRENT |
273 TEXOP_SCALE_1X |
274 TEXOP_MODIFY_PARMS |
275 TEXBLENDOP_ARG1);
276 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
277 TEXPIPE_COLOR |
278 TEXBLEND_ARG1 |
279 TEXBLENDARG_MODIFY_PARMS |
280 texel_op);
281 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
282 TEXPIPE_COLOR |
283 TEXBLEND_ARG2 |
284 TEXBLENDARG_MODIFY_PARMS |
285 TEXBLENDARG_CURRENT);
286 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
287 TEXPIPE_ALPHA |
288 TEXBLEND_ARG1 |
289 TEXBLENDARG_MODIFY_PARMS |
290 TEXBLENDARG_CURRENT);
291 return 5;
292
293 case GL_INTENSITY:
294 case GL_LUMINANCE_ALPHA:
295 case GL_RGBA:
296 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
297 TEXPIPE_COLOR |
298 ENABLE_TEXOUTPUT_WRT_SEL |
299 TEXOP_OUTPUT_CURRENT |
300 DISABLE_TEX_CNTRL_STAGE |
301 TEXOP_SCALE_1X |
302 TEXOP_MODIFY_PARMS |
303 TEXBLENDOP_MODULATE);
304 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
305 TEXPIPE_ALPHA |
306 ENABLE_TEXOUTPUT_WRT_SEL |
307 TEXOP_OUTPUT_CURRENT |
308 TEXOP_SCALE_1X |
309 TEXOP_MODIFY_PARMS |
310 TEXBLENDOP_MODULATE);
311 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
312 TEXPIPE_COLOR |
313 TEXBLEND_ARG1 |
314 TEXBLENDARG_MODIFY_PARMS |
315 texel_op);
316 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
317 TEXPIPE_COLOR |
318 TEXBLEND_ARG2 |
319 TEXBLENDARG_MODIFY_PARMS |
320 TEXBLENDARG_CURRENT);
321 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
322 TEXPIPE_ALPHA |
323 TEXBLEND_ARG1 |
324 TEXBLENDARG_MODIFY_PARMS |
325 texel_op);
326 state[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
327 TEXPIPE_ALPHA |
328 TEXBLEND_ARG2 |
329 TEXBLENDARG_MODIFY_PARMS |
330 TEXBLENDARG_CURRENT);
331 return 6;
332
333 default:
334 /* Always set to passthru if something is funny */
335 return pass_through( state, blendUnit );
336 }
337
338 case GL_DECAL:
339 switch(format) {
340 case GL_RGB:
341 case GL_YCBCR_MESA:
342 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
343 TEXPIPE_COLOR |
344 ENABLE_TEXOUTPUT_WRT_SEL |
345 TEXOP_OUTPUT_CURRENT |
346 DISABLE_TEX_CNTRL_STAGE |
347 TEXOP_SCALE_1X |
348 TEXOP_MODIFY_PARMS |
349 TEXBLENDOP_ARG1);
350 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
351 TEXPIPE_ALPHA |
352 ENABLE_TEXOUTPUT_WRT_SEL |
353 TEXOP_OUTPUT_CURRENT |
354 TEXOP_SCALE_1X |
355 TEXOP_MODIFY_PARMS |
356 TEXBLENDOP_ARG1);
357 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
358 TEXPIPE_COLOR |
359 TEXBLEND_ARG1 |
360 TEXBLENDARG_MODIFY_PARMS |
361 texel_op);
362 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
363 TEXPIPE_ALPHA |
364 TEXBLEND_ARG1 |
365 TEXBLENDARG_MODIFY_PARMS |
366 TEXBLENDARG_CURRENT);
367 return 4;
368
369 case GL_RGBA:
370 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
371 TEXPIPE_COLOR |
372 ENABLE_TEXOUTPUT_WRT_SEL |
373 TEXOP_OUTPUT_CURRENT |
374 DISABLE_TEX_CNTRL_STAGE |
375 TEXOP_SCALE_1X |
376 TEXOP_MODIFY_PARMS |
377 TEXBLENDOP_BLEND);
378 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
379 TEXPIPE_ALPHA |
380 ENABLE_TEXOUTPUT_WRT_SEL |
381 TEXOP_OUTPUT_CURRENT |
382 TEXOP_SCALE_1X |
383 TEXOP_MODIFY_PARMS |
384 TEXBLENDOP_ARG1);
385 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
386 TEXPIPE_COLOR |
387 TEXBLEND_ARG0 |
388 TEXBLENDARG_MODIFY_PARMS |
389 TEXBLENDARG_REPLICATE_ALPHA |
390 texel_op);
391 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
392 TEXPIPE_COLOR |
393 TEXBLEND_ARG1 |
394 TEXBLENDARG_MODIFY_PARMS |
395 texel_op);
396 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
397 TEXPIPE_COLOR |
398 TEXBLEND_ARG2 |
399 TEXBLENDARG_MODIFY_PARMS |
400 TEXBLENDARG_CURRENT);
401 state[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
402 TEXPIPE_ALPHA |
403 TEXBLEND_ARG1 |
404 TEXBLENDARG_MODIFY_PARMS |
405 TEXBLENDARG_CURRENT);
406 return 6;
407 default:
408 /* Always set to passthru if something is funny */
409 return pass_through( state, blendUnit );
410 }
411
412 case GL_BLEND:
413 switch(format) {
414 case GL_ALPHA:
415 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
416 TEXPIPE_COLOR |
417 ENABLE_TEXOUTPUT_WRT_SEL |
418 TEXOP_OUTPUT_CURRENT |
419 DISABLE_TEX_CNTRL_STAGE |
420 TEXOP_SCALE_1X |
421 TEXOP_MODIFY_PARMS |
422 TEXBLENDOP_ARG1);
423 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
424 TEXPIPE_ALPHA |
425 ENABLE_TEXOUTPUT_WRT_SEL |
426 TEXOP_OUTPUT_CURRENT |
427 TEXOP_SCALE_1X |
428 TEXOP_MODIFY_PARMS |
429 TEXBLENDOP_MODULATE);
430 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
431 TEXPIPE_COLOR |
432 TEXBLEND_ARG1 |
433 TEXBLENDARG_MODIFY_PARMS |
434 TEXBLENDARG_CURRENT);
435 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
436 TEXPIPE_ALPHA |
437 TEXBLEND_ARG1 |
438 TEXBLENDARG_MODIFY_PARMS |
439 texel_op);
440 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
441 TEXPIPE_ALPHA |
442 TEXBLEND_ARG2 |
443 TEXBLENDARG_MODIFY_PARMS |
444 TEXBLENDARG_CURRENT);
445 return 5;
446
447 case GL_LUMINANCE:
448 case GL_RGB:
449 case GL_YCBCR_MESA:
450 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
451 TEXPIPE_COLOR |
452 ENABLE_TEXOUTPUT_WRT_SEL |
453 TEXOP_OUTPUT_CURRENT |
454 DISABLE_TEX_CNTRL_STAGE |
455 TEXOP_SCALE_1X |
456 TEXOP_MODIFY_PARMS |
457 TEXBLENDOP_BLEND);
458 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
459 TEXPIPE_ALPHA |
460 ENABLE_TEXOUTPUT_WRT_SEL |
461 TEXOP_OUTPUT_CURRENT |
462 TEXOP_SCALE_1X |
463 TEXOP_MODIFY_PARMS |
464 TEXBLENDOP_ARG1);
465 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
466 TEXPIPE_COLOR |
467 TEXBLEND_ARG0 |
468 TEXBLENDARG_MODIFY_PARMS |
469 texel_op);
470 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
471 TEXPIPE_COLOR |
472 TEXBLEND_ARG1 |
473 TEXBLENDARG_MODIFY_PARMS |
474 TEXBLENDARG_FACTOR_N);
475 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
476 TEXPIPE_COLOR |
477 TEXBLEND_ARG2 |
478 TEXBLENDARG_MODIFY_PARMS |
479 TEXBLENDARG_CURRENT);
480 state[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
481 TEXPIPE_ALPHA |
482 TEXBLEND_ARG1 |
483 TEXBLENDARG_MODIFY_PARMS |
484 TEXBLENDARG_CURRENT);
485 return emit_factor( blendUnit, state, 6, factor );
486
487 case GL_INTENSITY:
488 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
489 TEXPIPE_COLOR |
490 ENABLE_TEXOUTPUT_WRT_SEL |
491 TEXOP_OUTPUT_CURRENT |
492 DISABLE_TEX_CNTRL_STAGE |
493 TEXOP_SCALE_1X |
494 TEXOP_MODIFY_PARMS |
495 TEXBLENDOP_BLEND);
496 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
497 TEXPIPE_ALPHA |
498 ENABLE_TEXOUTPUT_WRT_SEL |
499 TEXOP_OUTPUT_CURRENT |
500 TEXOP_SCALE_1X |
501 TEXOP_MODIFY_PARMS |
502 TEXBLENDOP_BLEND);
503 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
504 TEXPIPE_COLOR |
505 TEXBLEND_ARG0 |
506 TEXBLENDARG_MODIFY_PARMS |
507 texel_op);
508 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
509 TEXPIPE_COLOR |
510 TEXBLEND_ARG1 |
511 TEXBLENDARG_MODIFY_PARMS |
512 TEXBLENDARG_FACTOR_N);
513 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
514 TEXPIPE_COLOR |
515 TEXBLEND_ARG2 |
516 TEXBLENDARG_MODIFY_PARMS |
517 TEXBLENDARG_CURRENT);
518 state[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
519 TEXPIPE_ALPHA |
520 TEXBLEND_ARG0 |
521 TEXBLENDARG_MODIFY_PARMS |
522 texel_op);
523 state[6] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
524 TEXPIPE_ALPHA |
525 TEXBLEND_ARG1 |
526 TEXBLENDARG_MODIFY_PARMS |
527 TEXBLENDARG_FACTOR_N);
528 state[7] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
529 TEXPIPE_ALPHA |
530 TEXBLEND_ARG2 |
531 TEXBLENDARG_MODIFY_PARMS |
532 TEXBLENDARG_CURRENT);
533 return emit_factor( blendUnit, state, 8, factor );
534
535
536 case GL_LUMINANCE_ALPHA:
537 case GL_RGBA:
538 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
539 TEXPIPE_COLOR |
540 ENABLE_TEXOUTPUT_WRT_SEL |
541 TEXOP_OUTPUT_CURRENT |
542 DISABLE_TEX_CNTRL_STAGE |
543 TEXOP_SCALE_1X |
544 TEXOP_MODIFY_PARMS |
545 TEXBLENDOP_BLEND);
546 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
547 TEXPIPE_ALPHA |
548 ENABLE_TEXOUTPUT_WRT_SEL |
549 TEXOP_OUTPUT_CURRENT |
550 TEXOP_SCALE_1X |
551 TEXOP_MODIFY_PARMS |
552 TEXBLENDOP_MODULATE);
553 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
554 TEXPIPE_COLOR |
555 TEXBLEND_ARG0 |
556 TEXBLENDARG_MODIFY_PARMS |
557 texel_op);
558 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
559 TEXPIPE_COLOR |
560 TEXBLEND_ARG1 |
561 TEXBLENDARG_MODIFY_PARMS |
562 TEXBLENDARG_FACTOR_N);
563 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
564 TEXPIPE_COLOR |
565 TEXBLEND_ARG2 |
566 TEXBLENDARG_MODIFY_PARMS |
567 TEXBLENDARG_CURRENT);
568 state[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
569 TEXPIPE_ALPHA |
570 TEXBLEND_ARG1 |
571 TEXBLENDARG_MODIFY_PARMS |
572 texel_op);
573 state[6] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
574 TEXPIPE_ALPHA |
575 TEXBLEND_ARG2 |
576 TEXBLENDARG_MODIFY_PARMS |
577 TEXBLENDARG_CURRENT);
578 return emit_factor( blendUnit, state, 7, factor );
579
580 default:
581 /* Always set to passthru if something is funny */
582 return pass_through( state, blendUnit );
583 }
584
585 case GL_ADD:
586 switch(format) {
587 case GL_ALPHA:
588 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
589 TEXPIPE_COLOR |
590 ENABLE_TEXOUTPUT_WRT_SEL |
591 TEXOP_OUTPUT_CURRENT |
592 DISABLE_TEX_CNTRL_STAGE |
593 TEXOP_SCALE_1X |
594 TEXOP_MODIFY_PARMS |
595 TEXBLENDOP_ARG1);
596 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
597 TEXPIPE_ALPHA |
598 ENABLE_TEXOUTPUT_WRT_SEL |
599 TEXOP_OUTPUT_CURRENT |
600 TEXOP_SCALE_1X |
601 TEXOP_MODIFY_PARMS |
602 TEXBLENDOP_MODULATE);
603 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
604 TEXPIPE_COLOR |
605 TEXBLEND_ARG1 |
606 TEXBLENDARG_MODIFY_PARMS |
607 TEXBLENDARG_CURRENT);
608 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
609 TEXPIPE_ALPHA |
610 TEXBLEND_ARG1 |
611 TEXBLENDARG_MODIFY_PARMS |
612 texel_op);
613 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
614 TEXPIPE_ALPHA |
615 TEXBLEND_ARG2 |
616 TEXBLENDARG_MODIFY_PARMS |
617 TEXBLENDARG_CURRENT);
618 return 5;
619
620 case GL_LUMINANCE:
621 case GL_RGB:
622 case GL_YCBCR_MESA:
623 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
624 TEXPIPE_COLOR |
625 ENABLE_TEXOUTPUT_WRT_SEL |
626 TEXOP_OUTPUT_CURRENT |
627 DISABLE_TEX_CNTRL_STAGE |
628 TEXOP_SCALE_1X |
629 TEXOP_MODIFY_PARMS |
630 TEXBLENDOP_ADD);
631 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
632 TEXPIPE_ALPHA |
633 ENABLE_TEXOUTPUT_WRT_SEL |
634 TEXOP_OUTPUT_CURRENT |
635 TEXOP_SCALE_1X |
636 TEXOP_MODIFY_PARMS |
637 TEXBLENDOP_ARG1);
638 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
639 TEXPIPE_COLOR |
640 TEXBLEND_ARG1 |
641 TEXBLENDARG_MODIFY_PARMS |
642 texel_op);
643 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
644 TEXPIPE_COLOR |
645 TEXBLEND_ARG2 |
646 TEXBLENDARG_MODIFY_PARMS |
647 TEXBLENDARG_CURRENT);
648 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
649 TEXPIPE_ALPHA |
650 TEXBLEND_ARG1 |
651 TEXBLENDARG_MODIFY_PARMS |
652 TEXBLENDARG_CURRENT);
653 return 5;
654
655 case GL_INTENSITY:
656 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
657 TEXPIPE_COLOR |
658 ENABLE_TEXOUTPUT_WRT_SEL |
659 TEXOP_OUTPUT_CURRENT |
660 DISABLE_TEX_CNTRL_STAGE |
661 TEXOP_SCALE_1X |
662 TEXOP_MODIFY_PARMS |
663 TEXBLENDOP_ADD);
664 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
665 TEXPIPE_ALPHA |
666 ENABLE_TEXOUTPUT_WRT_SEL |
667 TEXOP_OUTPUT_CURRENT |
668 TEXOP_SCALE_1X |
669 TEXOP_MODIFY_PARMS |
670 TEXBLENDOP_ADD);
671 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
672 TEXPIPE_COLOR |
673 TEXBLEND_ARG1 |
674 TEXBLENDARG_MODIFY_PARMS |
675 texel_op);
676 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
677 TEXPIPE_COLOR |
678 TEXBLEND_ARG2 |
679 TEXBLENDARG_MODIFY_PARMS |
680 TEXBLENDARG_CURRENT);
681 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
682 TEXPIPE_ALPHA |
683 TEXBLEND_ARG1 |
684 TEXBLENDARG_MODIFY_PARMS |
685 texel_op);
686 state[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
687 TEXPIPE_ALPHA |
688 TEXBLEND_ARG2 |
689 TEXBLENDARG_MODIFY_PARMS |
690 TEXBLENDARG_CURRENT);
691 return 6;
692
693 case GL_LUMINANCE_ALPHA:
694 case GL_RGBA:
695 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
696 TEXPIPE_COLOR |
697 ENABLE_TEXOUTPUT_WRT_SEL |
698 TEXOP_OUTPUT_CURRENT |
699 DISABLE_TEX_CNTRL_STAGE |
700 TEXOP_SCALE_1X |
701 TEXOP_MODIFY_PARMS |
702 TEXBLENDOP_ADD);
703 state[1] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
704 TEXPIPE_ALPHA |
705 ENABLE_TEXOUTPUT_WRT_SEL |
706 TEXOP_OUTPUT_CURRENT |
707 TEXOP_SCALE_1X |
708 TEXOP_MODIFY_PARMS |
709 TEXBLENDOP_MODULATE);
710 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
711 TEXPIPE_COLOR |
712 TEXBLEND_ARG1 |
713 TEXBLENDARG_MODIFY_PARMS |
714 texel_op);
715 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
716 TEXPIPE_COLOR |
717 TEXBLEND_ARG2 |
718 TEXBLENDARG_MODIFY_PARMS |
719 TEXBLENDARG_CURRENT);
720 state[4] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
721 TEXPIPE_ALPHA |
722 TEXBLEND_ARG1 |
723 TEXBLENDARG_MODIFY_PARMS |
724 texel_op);
725 state[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
726 TEXPIPE_ALPHA |
727 TEXBLEND_ARG2 |
728 TEXBLENDARG_MODIFY_PARMS |
729 TEXBLENDARG_CURRENT);
730 return 6;
731
732 default:
733 /* Always set to passthru if something is funny */
734 return pass_through( state, blendUnit );
735 }
736
737 default:
738 /* Always set to passthru if something is funny */
739 return pass_through( state, blendUnit );
740 }
741 }
742
743 static GLuint i830SetTexEnvCombine(i830ContextPtr i830,
744 const struct gl_texture_unit *texUnit,
745 GLint blendUnit,
746 GLuint texel_op,
747 GLuint *state,
748 const GLfloat *factor )
749 {
750 GLuint blendop;
751 GLuint ablendop;
752 GLuint args_RGB[3];
753 GLuint args_A[3];
754 GLuint rgb_shift;
755 GLuint alpha_shift;
756 GLboolean need_factor = 0;
757 int i;
758
759 if(INTEL_DEBUG&DEBUG_TEXTURE)
760 fprintf(stderr, "%s\n", __FUNCTION__);
761
762
763 /* The EXT version of the DOT3 extension does not support the
764 * scale factor, but the ARB version (and the version in OpenGL
765 * 1.3) does.
766 */
767 switch (texUnit->Combine.ModeRGB) {
768 case GL_DOT3_RGB_EXT:
769 alpha_shift = texUnit->Combine.ScaleShiftA;
770 rgb_shift = 0;
771 break;
772
773 case GL_DOT3_RGBA_EXT:
774 alpha_shift = 0;
775 rgb_shift = 0;
776 break;
777
778 default:
779 rgb_shift = texUnit->Combine.ScaleShiftRGB;
780 alpha_shift = texUnit->Combine.ScaleShiftA;
781 break;
782 }
783
784
785 switch(texUnit->Combine.ModeRGB) {
786 case GL_REPLACE:
787 blendop = TEXBLENDOP_ARG1;
788 break;
789 case GL_MODULATE:
790 blendop = TEXBLENDOP_MODULATE;
791 break;
792 case GL_ADD:
793 blendop = TEXBLENDOP_ADD;
794 break;
795 case GL_ADD_SIGNED:
796 blendop = TEXBLENDOP_ADDSIGNED;
797 break;
798 case GL_INTERPOLATE:
799 blendop = TEXBLENDOP_BLEND;
800 break;
801 case GL_SUBTRACT:
802 blendop = TEXBLENDOP_SUBTRACT;
803 break;
804 case GL_DOT3_RGB_EXT:
805 case GL_DOT3_RGB:
806 blendop = TEXBLENDOP_DOT3;
807 break;
808 case GL_DOT3_RGBA_EXT:
809 case GL_DOT3_RGBA:
810 blendop = TEXBLENDOP_DOT3;
811 break;
812 default:
813 return pass_through( state, blendUnit );
814 }
815
816 blendop |= (rgb_shift << TEXOP_SCALE_SHIFT);
817
818
819 /* Handle RGB args */
820 for(i = 0; i < 3; i++) {
821 switch(texUnit->Combine.SourceRGB[i]) {
822 case GL_TEXTURE:
823 args_RGB[i] = texel_op;
824 break;
825 case GL_CONSTANT:
826 args_RGB[i] = TEXBLENDARG_FACTOR_N;
827 need_factor = 1;
828 break;
829 case GL_PRIMARY_COLOR:
830 args_RGB[i] = TEXBLENDARG_DIFFUSE;
831 break;
832 case GL_PREVIOUS:
833 args_RGB[i] = TEXBLENDARG_CURRENT;
834 break;
835 default:
836 return pass_through( state, blendUnit );
837 }
838
839 switch(texUnit->Combine.OperandRGB[i]) {
840 case GL_SRC_COLOR:
841 args_RGB[i] |= 0;
842 break;
843 case GL_ONE_MINUS_SRC_COLOR:
844 args_RGB[i] |= TEXBLENDARG_INV_ARG;
845 break;
846 case GL_SRC_ALPHA:
847 args_RGB[i] |= TEXBLENDARG_REPLICATE_ALPHA;
848 break;
849 case GL_ONE_MINUS_SRC_ALPHA:
850 args_RGB[i] |= (TEXBLENDARG_REPLICATE_ALPHA |
851 TEXBLENDARG_INV_ARG);
852 break;
853 default:
854 return pass_through( state, blendUnit );
855 }
856 }
857
858
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:
862 *
863 * Note - the global factor is set up with alpha == .5, so
864 * the alpha part of the DOT4 calculation should be zero.
865 */
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;
872 }
873 else {
874 switch(texUnit->Combine.ModeA) {
875 case GL_REPLACE:
876 ablendop = TEXBLENDOP_ARG1;
877 break;
878 case GL_MODULATE:
879 ablendop = TEXBLENDOP_MODULATE;
880 break;
881 case GL_ADD:
882 ablendop = TEXBLENDOP_ADD;
883 break;
884 case GL_ADD_SIGNED:
885 ablendop = TEXBLENDOP_ADDSIGNED;
886 break;
887 case GL_INTERPOLATE:
888 ablendop = TEXBLENDOP_BLEND;
889 break;
890 case GL_SUBTRACT:
891 ablendop = TEXBLENDOP_SUBTRACT;
892 break;
893 default:
894 return pass_through( state, blendUnit );
895 }
896
897
898 ablendop |= (alpha_shift << TEXOP_SCALE_SHIFT);
899
900 /* Handle A args */
901 for(i = 0; i < 3; i++) {
902 switch(texUnit->Combine.SourceA[i]) {
903 case GL_TEXTURE:
904 args_A[i] = texel_op;
905 break;
906 case GL_CONSTANT:
907 args_A[i] = TEXBLENDARG_FACTOR_N;
908 need_factor = 1;
909 break;
910 case GL_PRIMARY_COLOR:
911 args_A[i] = TEXBLENDARG_DIFFUSE;
912 break;
913 case GL_PREVIOUS:
914 args_A[i] = TEXBLENDARG_CURRENT;
915 break;
916 default:
917 return pass_through( state, blendUnit );
918 }
919
920 switch(texUnit->Combine.OperandA[i]) {
921 case GL_SRC_ALPHA:
922 args_A[i] |= 0;
923 break;
924 case GL_ONE_MINUS_SRC_ALPHA:
925 args_A[i] |= TEXBLENDARG_INV_ARG;
926 break;
927 default:
928 return pass_through( state, blendUnit );
929 }
930 }
931 }
932
933
934
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 */
938
939 /* When we render we need to figure out which is the last really enabled
940 * tex unit, and put last stage on it
941 */
942
943
944 /* Build color pipeline */
945
946 state[0] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
947 TEXPIPE_COLOR |
948 ENABLE_TEXOUTPUT_WRT_SEL |
949 TEXOP_OUTPUT_CURRENT |
950 DISABLE_TEX_CNTRL_STAGE |
951 TEXOP_MODIFY_PARMS |
952 blendop);
953 state[1] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
954 TEXPIPE_COLOR |
955 TEXBLEND_ARG1 |
956 TEXBLENDARG_MODIFY_PARMS |
957 args_RGB[0]);
958 state[2] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
959 TEXPIPE_COLOR |
960 TEXBLEND_ARG2 |
961 TEXBLENDARG_MODIFY_PARMS |
962 args_RGB[1]);
963 state[3] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
964 TEXPIPE_COLOR |
965 TEXBLEND_ARG0 |
966 TEXBLENDARG_MODIFY_PARMS |
967 args_RGB[2]);
968
969 /* Build Alpha pipeline */
970 state[4] = (_3DSTATE_MAP_BLEND_OP_CMD(blendUnit) |
971 TEXPIPE_ALPHA |
972 ENABLE_TEXOUTPUT_WRT_SEL |
973 TEXOP_OUTPUT_CURRENT |
974 TEXOP_MODIFY_PARMS |
975 ablendop);
976 state[5] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
977 TEXPIPE_ALPHA |
978 TEXBLEND_ARG1 |
979 TEXBLENDARG_MODIFY_PARMS |
980 args_A[0]);
981 state[6] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
982 TEXPIPE_ALPHA |
983 TEXBLEND_ARG2 |
984 TEXBLENDARG_MODIFY_PARMS |
985 args_A[1]);
986 state[7] = (_3DSTATE_MAP_BLEND_ARG_CMD(blendUnit) |
987 TEXPIPE_ALPHA |
988 TEXBLEND_ARG0 |
989 TEXBLENDARG_MODIFY_PARMS |
990 args_A[2]);
991
992
993 if (need_factor)
994 return emit_factor( blendUnit, state, 8, factor );
995 else
996 return 8;
997 }
998
999
1000 static void emit_texblend( i830ContextPtr i830, GLuint unit, GLuint blendUnit,
1001 GLboolean last_stage )
1002 {
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;
1007
1008
1009 if (0) fprintf(stderr, "%s unit %d\n", __FUNCTION__, unit);
1010
1011 /* Update i830->state.TexBlend
1012 */
1013 if (texUnit->EnvMode == GL_COMBINE) {
1014 tmp_sz = i830SetTexEnvCombine(i830, texUnit, blendUnit,
1015 GetTexelOp(unit), tmp,
1016 texUnit->EnvColor );
1017 }
1018 else {
1019 tmp_sz = i830SetBlend_GL1_2(i830, blendUnit, texUnit->EnvMode,
1020 t->intel.image[0][0].internalFormat,
1021 GetTexelOp(unit), tmp,
1022 texUnit->EnvColor );
1023 }
1024
1025 if (last_stage)
1026 tmp[0] |= TEXOP_LAST_STAGE;
1027
1028 if (tmp_sz != i830->state.TexBlendWordsUsed[blendUnit] ||
1029 memcmp( tmp, i830->state.TexBlend[blendUnit], tmp_sz * sizeof(GLuint))) {
1030
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;
1034 }
1035
1036 I830_ACTIVESTATE(i830, I830_UPLOAD_TEXBLEND(blendUnit), GL_TRUE);
1037 }
1038
1039 static void emit_passthrough( i830ContextPtr i830 )
1040 {
1041 GLuint tmp[I830_TEXBLEND_SIZE], tmp_sz;
1042 GLuint unit = 0;
1043
1044 tmp_sz = pass_through( tmp, unit );
1045 tmp[0] |= TEXOP_LAST_STAGE;
1046
1047 if (tmp_sz != i830->state.TexBlendWordsUsed[unit] ||
1048 memcmp( tmp, i830->state.TexBlend[unit], tmp_sz * sizeof(GLuint))) {
1049
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;
1053 }
1054
1055 I830_ACTIVESTATE(i830, I830_UPLOAD_TEXBLEND(unit), GL_TRUE);
1056 }
1057
1058 void i830EmitTextureBlend( i830ContextPtr i830 )
1059 {
1060 GLcontext *ctx = &i830->intel.ctx;
1061 GLuint unit, last_stage = 0, blendunit = 0;
1062
1063 I830_ACTIVESTATE(i830, I830_UPLOAD_TEXBLEND_ALL, GL_FALSE);
1064
1065 if (ctx->Texture._EnabledUnits) {
1066 for (unit = 0 ; unit < ctx->Const.MaxTextureUnits ; unit++)
1067 if (ctx->Texture.Unit[unit]._ReallyEnabled)
1068 last_stage = unit;
1069
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 );
1073 }
1074 else {
1075 emit_passthrough( i830 );
1076 }
1077 }
1078