1 /**************************************************************************
3 Copyright 2001 2d3d Inc., Delray Beach, FL
7 Permission is hereby granted, free of charge, to any person obtaining a
8 copy of this software and associated documentation files (the "Software"),
9 to deal in the Software without restriction, including without limitation
10 on the rights to use, copy, modify, merge, publish, distribute, sub
11 license, and/or sell copies of the Software, and to permit persons to whom
12 the Software is furnished to do so, subject to the following conditions:
14 The above copyright notice and this permission notice (including the next
15 paragraph) shall be included in all copies or substantial portions of the
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 ATI, VA LINUX SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
28 /* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_state.c,v 1.6 2003/01/28 22:47:06 dawes Exp $ */
32 * Jeff Hartmann <jhartmann@2d3d.com>
34 * Heavily based on the I810 driver, which was written by:
35 * Keith Whitwell <keith@tungstengraphics.com>
46 #include "i830_screen.h"
49 #include "i830_context.h"
50 #include "i830_state.h"
53 #include "i830_tris.h"
54 #include "i830_ioctl.h"
56 #include "swrast/swrast.h"
57 #include "array_cache/acache.h"
59 #include "swrast_setup/swrast_setup.h"
61 #include "tnl/t_pipeline.h"
63 static __inline__ GLuint
i830PackColor(GLuint format
,
68 if (I830_DEBUG
&DEBUG_DRI
)
69 fprintf(stderr
, "%s\n", __FUNCTION__
);
73 return I830PACKCOLOR1555(r
,g
,b
,a
);
75 return I830PACKCOLOR565(r
,g
,b
);
77 return I830PACKCOLOR8888(r
,g
,b
,a
);
79 fprintf(stderr
, "unknown format %d\n", (int)format
);
84 static void i830StencilFunc(GLcontext
*ctx
, GLenum func
, GLint ref
,
87 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
92 if (I830_DEBUG
&DEBUG_DRI
)
93 fprintf(stderr
, "%s : func: %s, ref : 0x%x, mask: 0x%x\n", __FUNCTION__
,
94 _mesa_lookup_enum_by_nr(func
), ref
, mask
);
98 test
= COMPAREFUNC_NEVER
;
101 test
= COMPAREFUNC_LESS
;
104 test
= COMPAREFUNC_LEQUAL
;
107 test
= COMPAREFUNC_GREATER
;
110 test
= COMPAREFUNC_GEQUAL
;
113 test
= COMPAREFUNC_NOTEQUAL
;
116 test
= COMPAREFUNC_EQUAL
;
119 test
= COMPAREFUNC_ALWAYS
;
125 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
126 imesa
->Setup
[I830_CTXREG_STATE4
] &= ~MODE4_ENABLE_STENCIL_TEST_MASK
;
127 imesa
->Setup
[I830_CTXREG_STATE4
] |= (ENABLE_STENCIL_TEST_MASK
|
128 STENCIL_TEST_MASK(mask
));
129 imesa
->Setup
[I830_CTXREG_STENCILTST
] &= ~(STENCIL_REF_VALUE_MASK
|
130 ENABLE_STENCIL_TEST_FUNC_MASK
);
131 imesa
->Setup
[I830_CTXREG_STENCILTST
] |= (ENABLE_STENCIL_REF_VALUE
|
132 ENABLE_STENCIL_TEST_FUNC
|
133 STENCIL_REF_VALUE(ref
) |
134 STENCIL_TEST_FUNC(test
));
137 static void i830StencilMask(GLcontext
*ctx
, GLuint mask
)
139 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
141 if (I830_DEBUG
&DEBUG_DRI
)
142 fprintf(stderr
, "%s : mask 0x%x\n", __FUNCTION__
, mask
);
146 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
147 imesa
->Setup
[I830_CTXREG_STATE4
] &= ~MODE4_ENABLE_STENCIL_WRITE_MASK
;
148 imesa
->Setup
[I830_CTXREG_STATE4
] |= (ENABLE_STENCIL_WRITE_MASK
|
149 STENCIL_WRITE_MASK(mask
));
152 static void i830StencilOp(GLcontext
*ctx
, GLenum fail
, GLenum zfail
,
155 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
158 if (I830_DEBUG
&DEBUG_DRI
)
159 fprintf(stderr
, "%s: fail : %s, zfail: %s, zpass : %s\n", __FUNCTION__
,
160 _mesa_lookup_enum_by_nr(fail
),
161 _mesa_lookup_enum_by_nr(zfail
),
162 _mesa_lookup_enum_by_nr(zpass
));
164 fop
= 0; dfop
= 0; dpop
= 0;
168 fop
= STENCILOP_KEEP
;
171 fop
= STENCILOP_ZERO
;
174 fop
= STENCILOP_REPLACE
;
177 fop
= STENCILOP_INCRSAT
;
180 fop
= STENCILOP_DECRSAT
;
183 fop
= STENCILOP_INCR
;
186 fop
= STENCILOP_DECR
;
189 fop
= STENCILOP_INVERT
;
196 dfop
= STENCILOP_KEEP
;
199 dfop
= STENCILOP_ZERO
;
202 dfop
= STENCILOP_REPLACE
;
205 dfop
= STENCILOP_INCRSAT
;
208 dfop
= STENCILOP_DECRSAT
;
211 dfop
= STENCILOP_INCR
;
214 dfop
= STENCILOP_DECR
;
217 dfop
= STENCILOP_INVERT
;
224 dpop
= STENCILOP_KEEP
;
227 dpop
= STENCILOP_ZERO
;
230 dpop
= STENCILOP_REPLACE
;
233 dpop
= STENCILOP_INCRSAT
;
236 dpop
= STENCILOP_DECRSAT
;
239 dpop
= STENCILOP_INCR
;
242 dpop
= STENCILOP_DECR
;
245 dpop
= STENCILOP_INVERT
;
252 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
253 imesa
->Setup
[I830_CTXREG_STENCILTST
] &= ~(STENCIL_OPS_MASK
);
254 imesa
->Setup
[I830_CTXREG_STENCILTST
] |= (ENABLE_STENCIL_PARMS
|
255 STENCIL_FAIL_OP(fop
) |
256 STENCIL_PASS_DEPTH_FAIL_OP(dfop
) |
257 STENCIL_PASS_DEPTH_PASS_OP(dpop
));
260 static void i830AlphaFunc(GLcontext
*ctx
, GLenum func
, GLfloat ref
)
262 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
264 GLuint refByte
= (GLint
) (ref
* 255.0);
268 test
= COMPAREFUNC_NEVER
;
271 test
= COMPAREFUNC_LESS
;
274 test
= COMPAREFUNC_LEQUAL
;
277 test
= COMPAREFUNC_GREATER
;
280 test
= COMPAREFUNC_GEQUAL
;
283 test
= COMPAREFUNC_NOTEQUAL
;
286 test
= COMPAREFUNC_EQUAL
;
289 test
= COMPAREFUNC_ALWAYS
;
295 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
296 imesa
->Setup
[I830_CTXREG_STATE2
] &= ~ALPHA_TEST_REF_MASK
;
297 imesa
->Setup
[I830_CTXREG_STATE2
] |= (ENABLE_ALPHA_TEST_FUNC
|
298 ENABLE_ALPHA_REF_VALUE
|
299 ALPHA_TEST_FUNC(test
) |
300 ALPHA_REF_VALUE(refByte
));
303 /* This function makes sure that the proper enables are
304 * set for LogicOp, Independant Alpha Blend, and Blending.
305 * It needs to be called from numerous places where we
306 * could change the LogicOp or Independant Alpha Blend without subsequent
309 static void i830EvalLogicOpBlendState(GLcontext
*ctx
)
311 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
313 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
315 if (ctx
->Color
.ColorLogicOpEnabled
) {
316 imesa
->Setup
[I830_CTXREG_ENABLES_1
] &= ~(ENABLE_COLOR_BLEND
|
317 ENABLE_LOGIC_OP_MASK
);
318 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= (DISABLE_COLOR_BLEND
|
320 imesa
->Setup
[I830_CTXREG_IALPHAB
] &= ~ENABLE_INDPT_ALPHA_BLEND
;
321 imesa
->Setup
[I830_CTXREG_IALPHAB
] |= DISABLE_INDPT_ALPHA_BLEND
;
322 } else if (ctx
->Color
.BlendEnabled
) {
323 imesa
->Setup
[I830_CTXREG_ENABLES_1
] &= ~(ENABLE_COLOR_BLEND
|
324 ENABLE_LOGIC_OP_MASK
);
325 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= (ENABLE_COLOR_BLEND
|
327 imesa
->Setup
[I830_CTXREG_IALPHAB
] &= ~ENABLE_INDPT_ALPHA_BLEND
;
328 if (imesa
->Setup
[I830_CTXREG_IALPHAB
] & SRC_DST_ABLEND_MASK
) {
329 imesa
->Setup
[I830_CTXREG_IALPHAB
] |= ENABLE_INDPT_ALPHA_BLEND
;
331 imesa
->Setup
[I830_CTXREG_IALPHAB
] |= DISABLE_INDPT_ALPHA_BLEND
;
334 imesa
->Setup
[I830_CTXREG_ENABLES_1
] &= ~(ENABLE_COLOR_BLEND
|
335 ENABLE_LOGIC_OP_MASK
);
336 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= (DISABLE_COLOR_BLEND
|
338 imesa
->Setup
[I830_CTXREG_IALPHAB
] &= ~ENABLE_INDPT_ALPHA_BLEND
;
339 imesa
->Setup
[I830_CTXREG_IALPHAB
] |= DISABLE_INDPT_ALPHA_BLEND
;
343 static void i830BlendColor(GLcontext
*ctx
, const GLfloat color
[4])
345 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
348 if (I830_DEBUG
&DEBUG_DRI
)
349 fprintf(stderr
, "%s\n", __FUNCTION__
);
351 FLOAT_COLOR_TO_UBYTE_COLOR(r
, color
[RCOMP
]);
352 FLOAT_COLOR_TO_UBYTE_COLOR(g
, color
[GCOMP
]);
353 FLOAT_COLOR_TO_UBYTE_COLOR(b
, color
[BCOMP
]);
354 FLOAT_COLOR_TO_UBYTE_COLOR(a
, color
[ACOMP
]);
356 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
357 imesa
->Setup
[I830_CTXREG_BLENDCOLR
] = ((a
<< 24) |
363 static void i830BlendEquation(GLcontext
*ctx
, GLenum mode
)
365 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
366 int func
= ENABLE_ALPHA_BLENDFUNC
;
368 if (I830_DEBUG
&DEBUG_DRI
)
369 fprintf(stderr
, "%s %s\n", __FUNCTION__
,
370 _mesa_lookup_enum_by_nr(mode
));
372 /* This will catch a logicop blend equation */
373 i830EvalLogicOpBlendState(ctx
);
376 case GL_FUNC_ADD_EXT
:
377 func
|= BLENDFUNC_ADD
;
380 func
|= BLENDFUNC_MIN
;
383 func
|= BLENDFUNC_MAX
;
385 case GL_FUNC_SUBTRACT_EXT
:
386 func
|= BLENDFUNC_SUB
;
388 case GL_FUNC_REVERSE_SUBTRACT_EXT
:
389 func
|= BLENDFUNC_RVRSE_SUB
;
394 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
395 imesa
->Setup
[I830_CTXREG_STATE1
] &= ~BLENDFUNC_MASK
;
396 imesa
->Setup
[I830_CTXREG_STATE1
] |= func
;
397 if (0) fprintf(stderr
, "%s : STATE1 : 0x%08x\n",
399 imesa
->Setup
[I830_CTXREG_STATE1
]);
402 static void i830BlendFunc(GLcontext
*ctx
, GLenum sfactor
, GLenum dfactor
)
404 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
405 int func
= (ENABLE_SRC_BLND_FACTOR
|ENABLE_DST_BLND_FACTOR
);
407 if (I830_DEBUG
&DEBUG_DRI
)
408 fprintf(stderr
, "%s %s %s\n", __FUNCTION__
,
409 _mesa_lookup_enum_by_nr(sfactor
),
410 _mesa_lookup_enum_by_nr(dfactor
));
414 func
|= SRC_BLND_FACT(BLENDFACT_ZERO
);
417 func
|= SRC_BLND_FACT(BLENDFACT_SRC_ALPHA
);
420 func
|= SRC_BLND_FACT(BLENDFACT_ONE
);
423 func
|= SRC_BLND_FACT(BLENDFACT_DST_COLR
);
425 case GL_ONE_MINUS_DST_COLOR
:
426 func
|= SRC_BLND_FACT(BLENDFACT_INV_DST_COLR
);
428 case GL_ONE_MINUS_SRC_ALPHA
:
429 func
|= SRC_BLND_FACT(BLENDFACT_INV_SRC_ALPHA
);
432 func
|= SRC_BLND_FACT(BLENDFACT_DST_ALPHA
);
434 case GL_ONE_MINUS_DST_ALPHA
:
435 func
|= SRC_BLND_FACT(BLENDFACT_INV_DST_ALPHA
);
437 case GL_SRC_ALPHA_SATURATE
:
438 func
|= SRC_BLND_FACT(BLENDFACT_SRC_ALPHA_SATURATE
);
440 case GL_CONSTANT_COLOR_EXT
:
441 func
|= SRC_BLND_FACT(BLENDFACT_CONST_COLOR
);
443 case GL_ONE_MINUS_CONSTANT_COLOR_EXT
:
444 func
|= SRC_BLND_FACT(BLENDFACT_INV_CONST_COLOR
);
446 case GL_CONSTANT_ALPHA_EXT
:
447 func
|= SRC_BLND_FACT(BLENDFACT_CONST_ALPHA
);
449 case GL_ONE_MINUS_CONSTANT_ALPHA_EXT
:
450 func
|= SRC_BLND_FACT(BLENDFACT_INV_CONST_ALPHA
);
458 func
|= DST_BLND_FACT(BLENDFACT_SRC_ALPHA
);
460 case GL_ONE_MINUS_SRC_ALPHA
:
461 func
|= DST_BLND_FACT(BLENDFACT_INV_SRC_ALPHA
);
464 func
|= DST_BLND_FACT(BLENDFACT_ZERO
);
467 func
|= DST_BLND_FACT(BLENDFACT_ONE
);
470 func
|= DST_BLND_FACT(BLENDFACT_SRC_COLR
);
472 case GL_ONE_MINUS_SRC_COLOR
:
473 func
|= DST_BLND_FACT(BLENDFACT_INV_SRC_COLR
);
476 func
|= DST_BLND_FACT(BLENDFACT_DST_ALPHA
);
478 case GL_ONE_MINUS_DST_ALPHA
:
479 func
|= DST_BLND_FACT(BLENDFACT_INV_DST_ALPHA
);
481 case GL_CONSTANT_COLOR_EXT
:
482 func
|= DST_BLND_FACT(BLENDFACT_CONST_COLOR
);
484 case GL_ONE_MINUS_CONSTANT_COLOR_EXT
:
485 func
|= DST_BLND_FACT(BLENDFACT_INV_CONST_COLOR
);
487 case GL_CONSTANT_ALPHA_EXT
:
488 func
|= DST_BLND_FACT(BLENDFACT_CONST_ALPHA
);
490 case GL_ONE_MINUS_CONSTANT_ALPHA_EXT
:
491 func
|= DST_BLND_FACT(BLENDFACT_INV_CONST_ALPHA
);
497 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
498 imesa
->Setup
[I830_CTXREG_IALPHAB
] &= ~SRC_DST_ABLEND_MASK
;
499 imesa
->Setup
[I830_CTXREG_STATE1
] &= ~SRC_DST_BLND_MASK
;
500 imesa
->Setup
[I830_CTXREG_STATE1
] |= func
;
501 /* Insure Independant Alpha Blend is really disabled. */
502 i830EvalLogicOpBlendState(ctx
);
505 static void i830BlendFuncSeparate(GLcontext
*ctx
, GLenum sfactorRGB
,
506 GLenum dfactorRGB
, GLenum sfactorA
,
509 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
510 int funcA
= (ENABLE_SRC_ABLEND_FACTOR
|ENABLE_DST_ABLEND_FACTOR
);
511 int funcRGB
= (ENABLE_SRC_BLND_FACTOR
|ENABLE_DST_BLND_FACTOR
);
513 if (I830_DEBUG
&DEBUG_DRI
)
514 fprintf(stderr
, "%s\n", __FUNCTION__
);
518 funcA
|= SRC_ABLEND_FACT(BLENDFACT_ZERO
);
521 funcA
|= SRC_ABLEND_FACT(BLENDFACT_SRC_ALPHA
);
524 funcA
|= SRC_ABLEND_FACT(BLENDFACT_ONE
);
527 funcA
|= SRC_ABLEND_FACT(BLENDFACT_DST_COLR
);
529 case GL_ONE_MINUS_DST_COLOR
:
530 funcA
|= SRC_ABLEND_FACT(BLENDFACT_INV_DST_COLR
);
532 case GL_ONE_MINUS_SRC_ALPHA
:
533 funcA
|= SRC_ABLEND_FACT(BLENDFACT_INV_SRC_ALPHA
);
536 funcA
|= SRC_ABLEND_FACT(BLENDFACT_DST_ALPHA
);
538 case GL_ONE_MINUS_DST_ALPHA
:
539 funcA
|= SRC_ABLEND_FACT(BLENDFACT_INV_DST_ALPHA
);
541 case GL_SRC_ALPHA_SATURATE
:
542 funcA
|= SRC_ABLEND_FACT(BLENDFACT_SRC_ALPHA_SATURATE
);
544 case GL_CONSTANT_COLOR_EXT
:
545 funcA
|= SRC_ABLEND_FACT(BLENDFACT_CONST_COLOR
);
547 case GL_ONE_MINUS_CONSTANT_COLOR_EXT
:
548 funcA
|= SRC_ABLEND_FACT(BLENDFACT_INV_CONST_COLOR
);
550 case GL_CONSTANT_ALPHA_EXT
:
551 funcA
|= SRC_ABLEND_FACT(BLENDFACT_CONST_ALPHA
);
553 case GL_ONE_MINUS_CONSTANT_ALPHA_EXT
:
554 funcA
|= SRC_ABLEND_FACT(BLENDFACT_INV_CONST_ALPHA
);
561 funcA
|= DST_ABLEND_FACT(BLENDFACT_SRC_ALPHA
);
563 case GL_ONE_MINUS_SRC_ALPHA
:
564 funcA
|= DST_ABLEND_FACT(BLENDFACT_INV_SRC_ALPHA
);
567 funcA
|= DST_ABLEND_FACT(BLENDFACT_ZERO
);
570 funcA
|= DST_ABLEND_FACT(BLENDFACT_ONE
);
573 funcA
|= DST_ABLEND_FACT(BLENDFACT_SRC_COLR
);
575 case GL_ONE_MINUS_SRC_COLOR
:
576 funcA
|= DST_ABLEND_FACT(BLENDFACT_INV_SRC_COLR
);
579 funcA
|= DST_ABLEND_FACT(BLENDFACT_DST_ALPHA
);
581 case GL_ONE_MINUS_DST_ALPHA
:
582 funcA
|= DST_ABLEND_FACT(BLENDFACT_INV_DST_ALPHA
);
584 case GL_CONSTANT_COLOR_EXT
:
585 funcA
|= DST_ABLEND_FACT(BLENDFACT_CONST_COLOR
);
587 case GL_ONE_MINUS_CONSTANT_COLOR_EXT
:
588 funcA
|= DST_ABLEND_FACT(BLENDFACT_INV_CONST_COLOR
);
590 case GL_CONSTANT_ALPHA_EXT
:
591 funcA
|= DST_ABLEND_FACT(BLENDFACT_CONST_ALPHA
);
593 case GL_ONE_MINUS_CONSTANT_ALPHA_EXT
:
594 funcA
|= DST_ABLEND_FACT(BLENDFACT_INV_CONST_ALPHA
);
601 funcRGB
|= SRC_BLND_FACT(BLENDFACT_ZERO
);
604 funcRGB
|= SRC_BLND_FACT(BLENDFACT_SRC_ALPHA
);
607 funcRGB
|= SRC_BLND_FACT(BLENDFACT_ONE
);
610 funcRGB
|= SRC_BLND_FACT(BLENDFACT_DST_COLR
);
612 case GL_ONE_MINUS_DST_COLOR
:
613 funcRGB
|= SRC_BLND_FACT(BLENDFACT_INV_DST_COLR
);
615 case GL_ONE_MINUS_SRC_ALPHA
:
616 funcRGB
|= SRC_BLND_FACT(BLENDFACT_INV_SRC_ALPHA
);
619 funcRGB
|= SRC_BLND_FACT(BLENDFACT_DST_ALPHA
);
621 case GL_ONE_MINUS_DST_ALPHA
:
622 funcRGB
|= SRC_BLND_FACT(BLENDFACT_INV_DST_ALPHA
);
624 case GL_SRC_ALPHA_SATURATE
:
625 funcRGB
|= SRC_BLND_FACT(BLENDFACT_SRC_ALPHA_SATURATE
);
627 case GL_CONSTANT_COLOR_EXT
:
628 funcRGB
|= SRC_BLND_FACT(BLENDFACT_CONST_COLOR
);
630 case GL_ONE_MINUS_CONSTANT_COLOR_EXT
:
631 funcRGB
|= SRC_BLND_FACT(BLENDFACT_INV_CONST_COLOR
);
633 case GL_CONSTANT_ALPHA_EXT
:
634 funcRGB
|= SRC_BLND_FACT(BLENDFACT_CONST_ALPHA
);
636 case GL_ONE_MINUS_CONSTANT_ALPHA_EXT
:
637 funcRGB
|= SRC_BLND_FACT(BLENDFACT_INV_CONST_ALPHA
);
644 funcRGB
|= DST_BLND_FACT(BLENDFACT_SRC_ALPHA
);
646 case GL_ONE_MINUS_SRC_ALPHA
:
647 funcRGB
|= DST_BLND_FACT(BLENDFACT_INV_SRC_ALPHA
);
650 funcRGB
|= DST_BLND_FACT(BLENDFACT_ZERO
);
653 funcRGB
|= DST_BLND_FACT(BLENDFACT_ONE
);
656 funcRGB
|= DST_BLND_FACT(BLENDFACT_SRC_COLR
);
658 case GL_ONE_MINUS_SRC_COLOR
:
659 funcRGB
|= DST_BLND_FACT(BLENDFACT_INV_SRC_COLR
);
662 funcRGB
|= DST_BLND_FACT(BLENDFACT_DST_ALPHA
);
664 case GL_ONE_MINUS_DST_ALPHA
:
665 funcRGB
|= DST_BLND_FACT(BLENDFACT_INV_DST_ALPHA
);
667 case GL_CONSTANT_COLOR_EXT
:
668 funcRGB
|= DST_BLND_FACT(BLENDFACT_CONST_COLOR
);
670 case GL_ONE_MINUS_CONSTANT_COLOR_EXT
:
671 funcRGB
|= DST_BLND_FACT(BLENDFACT_INV_CONST_COLOR
);
673 case GL_CONSTANT_ALPHA_EXT
:
674 funcRGB
|= DST_BLND_FACT(BLENDFACT_CONST_ALPHA
);
676 case GL_ONE_MINUS_CONSTANT_ALPHA_EXT
:
677 funcRGB
|= DST_BLND_FACT(BLENDFACT_INV_CONST_ALPHA
);
682 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
683 imesa
->Setup
[I830_CTXREG_IALPHAB
] &= ~SRC_DST_ABLEND_MASK
;
684 imesa
->Setup
[I830_CTXREG_IALPHAB
] |= funcA
;
685 imesa
->Setup
[I830_CTXREG_STATE1
] &= ~SRC_DST_BLND_MASK
;
686 imesa
->Setup
[I830_CTXREG_STATE1
] |= funcRGB
;
688 /* Insure Independant Alpha Blend is really enabled if
689 * Blending is already enabled.
691 i830EvalLogicOpBlendState(ctx
);
694 static void i830DepthFunc(GLcontext
*ctx
, GLenum func
)
696 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
699 if (I830_DEBUG
&DEBUG_DRI
)
700 fprintf(stderr
, "%s\n", __FUNCTION__
);
704 test
= COMPAREFUNC_NEVER
;
707 test
= COMPAREFUNC_LESS
;
710 test
= COMPAREFUNC_LEQUAL
;
713 test
= COMPAREFUNC_GREATER
;
716 test
= COMPAREFUNC_GEQUAL
;
719 test
= COMPAREFUNC_NOTEQUAL
;
722 test
= COMPAREFUNC_EQUAL
;
725 test
= COMPAREFUNC_ALWAYS
;
730 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
731 imesa
->Setup
[I830_CTXREG_STATE3
] &= ~DEPTH_TEST_FUNC_MASK
;
732 imesa
->Setup
[I830_CTXREG_STATE3
] |= (ENABLE_DEPTH_TEST_FUNC
|
733 DEPTH_TEST_FUNC(test
));
736 static void i830DepthMask(GLcontext
*ctx
, GLboolean flag
)
738 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
740 if (I830_DEBUG
&DEBUG_DRI
)
741 fprintf(stderr
, "%s flag (%d)\n", __FUNCTION__
, flag
);
743 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
745 imesa
->Setup
[I830_CTXREG_ENABLES_2
] &= ~ENABLE_DIS_DEPTH_WRITE_MASK
;
747 if (flag
&& ctx
->Depth
.Test
)
748 imesa
->Setup
[I830_CTXREG_ENABLES_2
] |= ENABLE_DEPTH_WRITE
;
750 imesa
->Setup
[I830_CTXREG_ENABLES_2
] |= DISABLE_DEPTH_WRITE
;
753 /* =============================================================
756 * The i830 supports a 4x4 stipple natively, GL wants 32x32.
757 * Fortunately stipple is usually a repeating pattern.
759 static void i830PolygonStipple( GLcontext
*ctx
, const GLubyte
*mask
)
761 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
762 const GLubyte
*m
= mask
;
765 int active
= (ctx
->Polygon
.StippleFlag
&&
766 imesa
->reduced_primitive
== GL_TRIANGLES
);
770 I830_STATECHANGE(imesa
, I830_UPLOAD_STIPPLE
);
771 imesa
->StippleSetup
[I830_STPREG_ST1
] &= ~ST1_ENABLE
;
774 p
[0] = mask
[12] & 0xf; p
[0] |= p
[0] << 4;
775 p
[1] = mask
[8] & 0xf; p
[1] |= p
[1] << 4;
776 p
[2] = mask
[4] & 0xf; p
[2] |= p
[2] << 4;
777 p
[3] = mask
[0] & 0xf; p
[3] |= p
[3] << 4;
779 for (k
= 0 ; k
< 8 ; k
++)
780 for (j
= 3 ; j
>= 0; j
--)
781 for (i
= 0 ; i
< 4 ; i
++, m
++)
783 imesa
->hw_stipple
= 0;
787 newMask
= (((p
[0] & 0xf) << 0) |
788 ((p
[1] & 0xf) << 4) |
789 ((p
[2] & 0xf) << 8) |
790 ((p
[3] & 0xf) << 12));
793 if (newMask
== 0xffff || newMask
== 0x0) {
794 /* this is needed to make conform pass */
795 imesa
->hw_stipple
= 0;
799 imesa
->StippleSetup
[I830_STPREG_ST1
] &= ~0xffff;
800 imesa
->StippleSetup
[I830_STPREG_ST1
] |= newMask
;
801 imesa
->hw_stipple
= 1;
804 imesa
->StippleSetup
[I830_STPREG_ST1
] |= ST1_ENABLE
;
807 static void i830PolygonStippleFallback( GLcontext
*ctx
, const GLubyte
*mask
)
809 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
810 imesa
->hw_stipple
= 0;
811 (void) i830PolygonStipple
;
814 /* =============================================================
817 static void i830Scissor(GLcontext
*ctx
, GLint x
, GLint y
,
818 GLsizei w
, GLsizei h
)
820 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
822 int y1
= imesa
->driDrawable
->h
- (y
+ h
);
826 if (I830_DEBUG
&DEBUG_DRI
)
827 fprintf(stderr
, "[%s] x(%d) y(%d) w(%d) h(%d)\n", __FUNCTION__
,
835 if (x2
>= imesa
->i830Screen
->width
) x2
= imesa
->i830Screen
->width
-1;
836 if (y2
>= imesa
->i830Screen
->height
) y2
= imesa
->i830Screen
->height
-1;
837 if (x1
>= imesa
->i830Screen
->width
) x1
= imesa
->i830Screen
->width
-1;
838 if (y1
>= imesa
->i830Screen
->height
) y1
= imesa
->i830Screen
->height
-1;
841 I830_STATECHANGE(imesa
, I830_UPLOAD_BUFFERS
);
842 imesa
->BufferSetup
[I830_DESTREG_SR1
] = (y1
<< 16) | (x1
& 0xffff);
843 imesa
->BufferSetup
[I830_DESTREG_SR2
] = (y2
<< 16) | (x2
& 0xffff);
846 static void i830LogicOp(GLcontext
*ctx
, GLenum opcode
)
848 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
851 if (I830_DEBUG
&DEBUG_DRI
)
852 fprintf(stderr
, "%s\n", __FUNCTION__
);
854 /* FIXME: This should be a look-up table, like the r200 driver. */
863 tmp
= LOGICOP_AND_RVRSE
;
868 case GL_COPY_INVERTED
:
869 tmp
= LOGICOP_COPY_INV
;
871 case GL_AND_INVERTED
:
872 tmp
= LOGICOP_AND_INV
;
884 tmp
= LOGICOP_OR_INV
;
896 tmp
= LOGICOP_OR_RVRSE
;
908 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
909 imesa
->Setup
[I830_CTXREG_STATE4
] &= ~LOGICOP_MASK
;
910 imesa
->Setup
[I830_CTXREG_STATE4
] |= LOGIC_OP_FUNC(tmp
);
912 /* Make sure all the enables are correct */
913 i830EvalLogicOpBlendState(ctx
);
916 /* Fallback to swrast for select and feedback.
918 static void i830RenderMode( GLcontext
*ctx
, GLenum mode
)
920 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
921 FALLBACK( imesa
, I830_FALLBACK_RENDERMODE
, (mode
!= GL_RENDER
) );
924 static void i830DrawBuffer(GLcontext
*ctx
, GLenum mode
)
926 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
929 * _DrawDestMask is easier to cope with than <mode>.
931 switch ( ctx
->Color
._DrawDestMask
) {
933 I830_FIREVERTICES(imesa
);
934 I830_STATECHANGE(imesa
, I830_UPLOAD_BUFFERS
);
935 imesa
->BufferSetup
[I830_DESTREG_CBUFADDR
] = imesa
->i830Screen
->fbOffset
;
936 i830XMesaSetFrontClipRects( imesa
);
937 FALLBACK( imesa
, I830_FALLBACK_DRAW_BUFFER
, GL_FALSE
);
940 I830_FIREVERTICES(imesa
);
941 I830_STATECHANGE(imesa
, I830_UPLOAD_BUFFERS
);
942 imesa
->BufferSetup
[I830_DESTREG_CBUFADDR
] =
943 imesa
->i830Screen
->backOffset
;
944 i830XMesaSetBackClipRects( imesa
);
945 FALLBACK( imesa
, I830_FALLBACK_DRAW_BUFFER
, GL_FALSE
);
948 /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */
949 FALLBACK( imesa
, I830_FALLBACK_DRAW_BUFFER
, GL_TRUE
);
953 /* We want to update the s/w rast state too so that i830SetBuffer()
956 _swrast_DrawBuffer(ctx
, mode
);
959 static void i830ReadBuffer(GLcontext
*ctx
, GLenum mode
)
961 /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */
964 static void i830ClearColor(GLcontext
*ctx
, const GLfloat color
[4])
966 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
968 CLAMPED_FLOAT_TO_UBYTE(imesa
->clear_red
, color
[0]);
969 CLAMPED_FLOAT_TO_UBYTE(imesa
->clear_green
, color
[1]);
970 CLAMPED_FLOAT_TO_UBYTE(imesa
->clear_blue
, color
[2]);
971 CLAMPED_FLOAT_TO_UBYTE(imesa
->clear_alpha
, color
[3]);
973 imesa
->ClearColor
= i830PackColor(imesa
->i830Screen
->fbFormat
,
980 static void i830CullFaceFrontFace(GLcontext
*ctx
, GLenum unused
)
982 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
983 GLuint mode
= CULLMODE_BOTH
;
985 if (I830_DEBUG
&DEBUG_DRI
)
986 fprintf(stderr
, "%s\n", __FUNCTION__
);
988 if (ctx
->Polygon
.CullFaceMode
!= GL_FRONT_AND_BACK
) {
991 if (ctx
->Polygon
.CullFaceMode
== GL_FRONT
)
992 mode
^= (CULLMODE_CW
^ CULLMODE_CCW
);
993 if (ctx
->Polygon
.FrontFace
!= GL_CCW
)
994 mode
^= (CULLMODE_CW
^ CULLMODE_CCW
);
997 imesa
->LcsCullMode
= mode
;
999 if (ctx
->Polygon
.CullFlag
) {
1000 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1001 imesa
->Setup
[I830_CTXREG_STATE3
] &= ~CULLMODE_MASK
;
1002 imesa
->Setup
[I830_CTXREG_STATE3
] |= ENABLE_CULL_MODE
| mode
;
1006 static void i830LineWidth( GLcontext
*ctx
, GLfloat widthf
)
1008 i830ContextPtr imesa
= I830_CONTEXT( ctx
);
1011 if (I830_DEBUG
&DEBUG_DRI
)
1012 fprintf(stderr
, "%s\n", __FUNCTION__
);
1014 width
= FloatToInt(widthf
* 2);
1015 CLAMP_SELF(width
, 1, 15);
1017 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1018 imesa
->Setup
[I830_CTXREG_STATE5
] &= ~FIXED_LINE_WIDTH_MASK
;
1019 imesa
->Setup
[I830_CTXREG_STATE5
] |= (ENABLE_FIXED_LINE_WIDTH
|
1020 FIXED_LINE_WIDTH(width
));
1023 static void i830PointSize(GLcontext
*ctx
, GLfloat size
)
1025 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
1026 GLint point_size
= FloatToInt(size
);
1028 if (I830_DEBUG
&DEBUG_DRI
)
1029 fprintf(stderr
, "%s\n", __FUNCTION__
);
1031 CLAMP_SELF(point_size
, 1, 256);
1032 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1033 imesa
->Setup
[I830_CTXREG_STATE5
] &= ~FIXED_POINT_WIDTH_MASK
;
1034 imesa
->Setup
[I830_CTXREG_STATE5
] |= (ENABLE_FIXED_POINT_WIDTH
|
1035 FIXED_POINT_WIDTH(point_size
));
1039 /* =============================================================
1043 static void i830ColorMask(GLcontext
*ctx
,
1044 GLboolean r
, GLboolean g
,
1045 GLboolean b
, GLboolean a
)
1047 i830ContextPtr imesa
= I830_CONTEXT( ctx
);
1050 if (I830_DEBUG
&DEBUG_DRI
)
1051 fprintf(stderr
, "%s r(%d) g(%d) b(%d) a(%d)\n", __FUNCTION__
, r
, g
, b
, a
);
1053 imesa
->mask_red
= !r
;
1054 imesa
->mask_green
= !g
;
1055 imesa
->mask_blue
= !b
;
1056 imesa
->mask_alpha
= !a
;
1058 tmp
= (imesa
->Setup
[I830_CTXREG_ENABLES_2
] & ~WRITEMASK_MASK
) |
1060 ENABLE_COLOR_WRITE
|
1061 ((!r
) << WRITEMASK_RED_SHIFT
) |
1062 ((!g
) << WRITEMASK_GREEN_SHIFT
) |
1063 ((!b
) << WRITEMASK_BLUE_SHIFT
) |
1064 ((!a
) << WRITEMASK_ALPHA_SHIFT
);
1066 if (tmp
!= imesa
->Setup
[I830_CTXREG_ENABLES_2
]) {
1067 I830_FIREVERTICES(imesa
);
1068 imesa
->dirty
|= I830_UPLOAD_CTX
;
1069 imesa
->Setup
[I830_CTXREG_ENABLES_2
] = tmp
;
1073 static void update_specular( GLcontext
*ctx
)
1075 i830ContextPtr imesa
= I830_CONTEXT( ctx
);
1077 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1078 imesa
->Setup
[I830_CTXREG_ENABLES_1
] &= ~ENABLE_SPEC_ADD_MASK
;
1080 if (ctx
->_TriangleCaps
& DD_SEPARATE_SPECULAR
)
1081 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= ENABLE_SPEC_ADD
;
1083 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= DISABLE_SPEC_ADD
;
1086 static void i830LightModelfv(GLcontext
*ctx
, GLenum pname
,
1087 const GLfloat
*param
)
1089 if (I830_DEBUG
&DEBUG_DRI
)
1090 fprintf(stderr
, "%s\n", __FUNCTION__
);
1092 if (pname
== GL_LIGHT_MODEL_COLOR_CONTROL
) {
1093 update_specular( ctx
);
1097 /* In Mesa 3.5 we can reliably do native flatshading.
1099 static void i830ShadeModel(GLcontext
*ctx
, GLenum mode
)
1101 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
1102 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1105 #define SHADE_MODE_MASK ((1<<10)|(1<<8)|(1<<6)|(1<<4))
1107 imesa
->Setup
[I830_CTXREG_STATE3
] &= ~SHADE_MODE_MASK
;
1109 if (mode
== GL_FLAT
) {
1110 imesa
->Setup
[I830_CTXREG_STATE3
] |= (ALPHA_SHADE_MODE(SHADE_MODE_FLAT
) |
1111 FOG_SHADE_MODE(SHADE_MODE_FLAT
) |
1112 SPEC_SHADE_MODE(SHADE_MODE_FLAT
) |
1113 COLOR_SHADE_MODE(SHADE_MODE_FLAT
));
1115 imesa
->Setup
[I830_CTXREG_STATE3
] |= (ALPHA_SHADE_MODE(SHADE_MODE_LINEAR
) |
1116 FOG_SHADE_MODE(SHADE_MODE_LINEAR
) |
1117 SPEC_SHADE_MODE(SHADE_MODE_LINEAR
) |
1118 COLOR_SHADE_MODE(SHADE_MODE_LINEAR
));
1122 /* =============================================================
1125 static void i830Fogfv(GLcontext
*ctx
, GLenum pname
, const GLfloat
*param
)
1127 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
1129 if (I830_DEBUG
&DEBUG_DRI
)
1130 fprintf(stderr
, "%s\n", __FUNCTION__
);
1132 if (pname
== GL_FOG_COLOR
) {
1133 GLuint color
= (((GLubyte
)(ctx
->Fog
.Color
[0]*255.0F
) << 16) |
1134 ((GLubyte
)(ctx
->Fog
.Color
[1]*255.0F
) << 8) |
1135 ((GLubyte
)(ctx
->Fog
.Color
[2]*255.0F
) << 0));
1137 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1138 imesa
->Setup
[I830_CTXREG_FOGCOLOR
] = (STATE3D_FOG_COLOR_CMD
| color
);
1142 /* =============================================================
1145 static void i830Enable(GLcontext
*ctx
, GLenum cap
, GLboolean state
)
1147 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
1151 case GL_COLOR_SUM_EXT
:
1152 update_specular( ctx
);
1156 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1157 imesa
->Setup
[I830_CTXREG_ENABLES_1
] &= ~ENABLE_DIS_ALPHA_TEST_MASK
;
1159 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= ENABLE_ALPHA_TEST
;
1161 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= DISABLE_ALPHA_TEST
;
1166 case GL_COLOR_LOGIC_OP
:
1167 case GL_INDEX_LOGIC_OP
:
1168 i830EvalLogicOpBlendState(ctx
);
1172 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1173 imesa
->Setup
[I830_CTXREG_ENABLES_2
] &= ~ENABLE_DITHER
;
1176 imesa
->Setup
[I830_CTXREG_ENABLES_2
] |= ENABLE_DITHER
;
1178 imesa
->Setup
[I830_CTXREG_ENABLES_2
] |= DISABLE_DITHER
;
1182 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1183 imesa
->Setup
[I830_CTXREG_ENABLES_1
] &= ~ENABLE_DIS_DEPTH_TEST_MASK
;
1186 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= ENABLE_DEPTH_TEST
;
1188 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= DISABLE_DEPTH_TEST
;
1190 /* Also turn off depth writes when GL_DEPTH_TEST is disabled:
1192 i830DepthMask( ctx
, state
);
1195 case GL_SCISSOR_TEST
:
1196 I830_STATECHANGE(imesa
, I830_UPLOAD_BUFFERS
);
1199 imesa
->BufferSetup
[I830_DESTREG_SENABLE
] =
1200 (STATE3D_SCISSOR_ENABLE_CMD
|
1201 ENABLE_SCISSOR_RECT
);
1203 imesa
->BufferSetup
[I830_DESTREG_SENABLE
] =
1204 (STATE3D_SCISSOR_ENABLE_CMD
|
1205 DISABLE_SCISSOR_RECT
);
1207 imesa
->upload_cliprects
= GL_TRUE
;
1210 case GL_LINE_SMOOTH
:
1211 if (imesa
->reduced_primitive
== GL_LINES
) {
1212 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1214 imesa
->Setup
[I830_CTXREG_AA
] &= ~AA_LINE_ENABLE
;
1216 imesa
->Setup
[I830_CTXREG_AA
] |= AA_LINE_ENABLE
;
1218 imesa
->Setup
[I830_CTXREG_AA
] |= AA_LINE_DISABLE
;
1223 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1224 imesa
->Setup
[I830_CTXREG_ENABLES_1
] &= ~ENABLE_DIS_FOG_MASK
;
1226 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= I830_ENABLE_FOG
;
1228 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= I830_DISABLE_FOG
;
1232 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1233 imesa
->Setup
[I830_CTXREG_STATE3
] &= ~CULLMODE_MASK
;
1235 imesa
->Setup
[I830_CTXREG_STATE3
] |= (ENABLE_CULL_MODE
|
1236 imesa
->LcsCullMode
);
1238 imesa
->Setup
[I830_CTXREG_STATE3
] |= (ENABLE_CULL_MODE
|
1243 /* I830_STATECHANGE(imesa, I830_UPLOAD_CTX); */
1244 /* imesa->Setup[I830_CTXREG_ENABLES_1] &= ~ENABLE_SPEC_ADD_MASK; */
1247 case GL_STENCIL_TEST
:
1248 if (imesa
->hw_stencil
) {
1249 I830_STATECHANGE(imesa
, I830_UPLOAD_CTX
);
1250 imesa
->Setup
[I830_CTXREG_ENABLES_1
] &= ~ENABLE_STENCIL_TEST
;
1251 imesa
->Setup
[I830_CTXREG_ENABLES_2
] &= ~ENABLE_STENCIL_WRITE
;
1254 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= ENABLE_STENCIL_TEST
;
1255 imesa
->Setup
[I830_CTXREG_ENABLES_2
] |= ENABLE_STENCIL_WRITE
;
1257 imesa
->Setup
[I830_CTXREG_ENABLES_1
] |= DISABLE_STENCIL_TEST
;
1258 imesa
->Setup
[I830_CTXREG_ENABLES_2
] |= DISABLE_STENCIL_WRITE
;
1261 FALLBACK( imesa
, I830_FALLBACK_STENCIL
, state
);
1265 case GL_POLYGON_STIPPLE
:
1267 /* The stipple command worked on my 855GM box, but not my 845G.
1268 * I'll do more testing later to find out exactly which hardware
1269 * supports it. Disabled for now.
1271 if (imesa
->hw_stipple
&& imesa
->reduced_primitive
== GL_TRIANGLES
)
1273 I830_STATECHANGE(imesa
, I830_UPLOAD_STIPPLE
);
1274 imesa
->StippleSetup
[I830_STPREG_ST1
] &= ~ST1_ENABLE
;
1276 imesa
->StippleSetup
[I830_STPREG_ST1
] |= ST1_ENABLE
;
1287 void i830EmitDrawingRectangle( i830ContextPtr imesa
)
1289 __DRIdrawablePrivate
*dPriv
= imesa
->driDrawable
;
1290 i830ScreenPrivate
*i830Screen
= imesa
->i830Screen
;
1291 int x0
= imesa
->drawX
;
1292 int y0
= imesa
->drawY
;
1293 int x1
= x0
+ dPriv
->w
;
1294 int y1
= y0
+ dPriv
->h
;
1296 /* Don't set drawing rectangle */
1297 if (I830_DEBUG
& DEBUG_IOCTL
)
1298 fprintf(stderr
, "%s x0(%d) x1(%d) y0(%d) y1(%d)\n", __FUNCTION__
,
1301 /* Coordinate origin of the window - may be offscreen.
1303 imesa
->BufferSetup
[I830_DESTREG_DR4
] = ((y0
<<16) |
1304 (((unsigned)x0
)&0xFFFF));
1310 if (x1
> i830Screen
->width
-1) x1
= i830Screen
->width
-1;
1311 if (y1
> i830Screen
->height
-1) y1
= i830Screen
->height
-1;
1314 /* Onscreen drawing rectangle.
1316 imesa
->BufferSetup
[I830_DESTREG_DR2
] = ((y0
<<16) | x0
);
1317 imesa
->BufferSetup
[I830_DESTREG_DR3
] = (((y1
+1)<<16) | (x1
+1));
1320 /* Just add in our dirty flag, since we might be called when locked */
1321 /* Might want to modify how this is done. */
1322 imesa
->dirty
|= I830_UPLOAD_BUFFERS
;
1325 fprintf(stderr
, "[%s] DR2(0x%08x) DR3(0x%08x) DR4(0x%08x)\n",
1327 imesa
->BufferSetup
[I830_DESTREG_DR2
],
1328 imesa
->BufferSetup
[I830_DESTREG_DR3
],
1329 imesa
->BufferSetup
[I830_DESTREG_DR4
]);
1332 /* This could be done in hardware, will do once I have the driver
1335 static void i830CalcViewport( GLcontext
*ctx
)
1337 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
1338 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
1339 GLfloat
*m
= imesa
->ViewportMatrix
.m
;
1341 /* See also i830_translate_vertex. SUBPIXEL adjustments can be done
1342 * via state vars, too.
1344 m
[MAT_SX
] = v
[MAT_SX
];
1345 m
[MAT_TX
] = v
[MAT_TX
] + SUBPIXEL_X
;
1346 m
[MAT_SY
] = - v
[MAT_SY
];
1347 m
[MAT_TY
] = - v
[MAT_TY
] + imesa
->driDrawable
->h
+ SUBPIXEL_Y
;
1348 m
[MAT_SZ
] = v
[MAT_SZ
] * imesa
->depth_scale
;
1349 m
[MAT_TZ
] = v
[MAT_TZ
] * imesa
->depth_scale
;
1352 static void i830Viewport( GLcontext
*ctx
,
1354 GLsizei width
, GLsizei height
)
1356 i830CalcViewport( ctx
);
1359 static void i830DepthRange( GLcontext
*ctx
,
1360 GLclampd nearval
, GLclampd farval
)
1362 i830CalcViewport( ctx
);
1365 void i830PrintDirty( const char *msg
, GLuint state
)
1367 fprintf(stderr
, "%s (0x%x): %s%s%s%s%s%s%s\n",
1369 (unsigned int) state
,
1370 (state
& I830_UPLOAD_TEX0
) ? "upload-tex0, " : "",
1371 (state
& I830_UPLOAD_TEX1
) ? "upload-tex1, " : "",
1372 (state
& I830_UPLOAD_CTX
) ? "upload-ctx, " : "",
1373 (state
& I830_UPLOAD_BUFFERS
) ? "upload-bufs, " : "",
1374 (state
& I830_UPLOAD_TEXBLEND0
) ? "upload-blend0, " : "",
1375 (state
& I830_UPLOAD_TEXBLEND1
) ? "upload-blend1, " : "",
1376 (state
& I830_UPLOAD_STIPPLE
) ? "stipple, " : ""
1380 /* Push the state into the sarea and/or texture memory.
1382 void i830EmitHwStateLocked( i830ContextPtr imesa
)
1386 if (I830_DEBUG
& DEBUG_STATE
)
1387 i830PrintDirty( __FUNCTION__
, imesa
->dirty
);
1389 if ((imesa
->dirty
& I830_UPLOAD_TEX0_IMAGE
) && imesa
->CurrentTexObj
[0])
1390 i830UploadTexImagesLocked(imesa
, imesa
->CurrentTexObj
[0]);
1391 if ((imesa
->dirty
& I830_UPLOAD_TEX1_IMAGE
) && imesa
->CurrentTexObj
[1])
1392 i830UploadTexImagesLocked(imesa
, imesa
->CurrentTexObj
[1]);
1393 if (imesa
->dirty
& I830_UPLOAD_CTX
) {
1394 memcpy( imesa
->sarea
->ContextState
,
1395 imesa
->Setup
, sizeof(imesa
->Setup
) );
1398 for (i
= 0; i
< I830_TEXTURE_COUNT
; i
++) {
1399 if ((imesa
->dirty
& I830_UPLOAD_TEX_N(i
)) && imesa
->CurrentTexObj
[i
]) {
1400 imesa
->sarea
->dirty
|= I830_UPLOAD_TEX_N(i
);
1401 memcpy(imesa
->sarea
->TexState
[i
],
1402 imesa
->CurrentTexObj
[i
]->Setup
,
1403 sizeof(imesa
->sarea
->TexState
[i
]));
1405 imesa
->sarea
->TexState
[i
][I830_TEXREG_TM0S3
] &= ~TM0S3_LOD_BIAS_MASK
;
1406 imesa
->sarea
->TexState
[i
][I830_TEXREG_TM0S3
] |= imesa
->LodBias
[i
];
1408 /* Update the LRU usage */
1409 if (imesa
->CurrentTexObj
[i
]->base
.memBlock
)
1410 driUpdateTextureLRU( (driTextureObject
*)
1411 imesa
->CurrentTexObj
[i
] );
1414 /* Need to figure out if texturing state, or enable changed. */
1416 for (i
= 0; i
< I830_TEXBLEND_COUNT
; i
++) {
1417 if (imesa
->dirty
& I830_UPLOAD_TEXBLEND_N(i
)) {
1418 imesa
->sarea
->dirty
|= I830_UPLOAD_TEXBLEND_N(i
);
1419 memcpy(imesa
->sarea
->TexBlendState
[i
],imesa
->TexBlend
[i
],
1420 imesa
->TexBlendWordsUsed
[i
] * 4);
1421 imesa
->sarea
->TexBlendStateWordsUsed
[i
] =
1422 imesa
->TexBlendWordsUsed
[i
];
1426 if (imesa
->dirty
& I830_UPLOAD_BUFFERS
) {
1427 memcpy( imesa
->sarea
->BufferState
,imesa
->BufferSetup
,
1428 sizeof(imesa
->BufferSetup
) );
1431 if (imesa
->dirty
& I830_UPLOAD_STIPPLE
) {
1432 memcpy( imesa
->sarea
->StippleState
,imesa
->StippleSetup
,
1433 sizeof(imesa
->StippleSetup
) );
1436 if (imesa
->dirty
& I830_UPLOAD_TEX_PALETTE_SHARED
) {
1437 memcpy( imesa
->sarea
->Palette
[0],imesa
->palette
,
1438 sizeof(imesa
->sarea
->Palette
[0]));
1440 i830TextureObjectPtr p
;
1441 if (imesa
->dirty
& I830_UPLOAD_TEX_PALETTE_N(0)) {
1442 p
= imesa
->CurrentTexObj
[0];
1443 memcpy( imesa
->sarea
->Palette
[0],p
->palette
,
1444 sizeof(imesa
->sarea
->Palette
[0]));
1446 if (imesa
->dirty
& I830_UPLOAD_TEX_PALETTE_N(1)) {
1447 p
= imesa
->CurrentTexObj
[1];
1448 memcpy( imesa
->sarea
->Palette
[1],
1450 sizeof(imesa
->sarea
->Palette
[1]));
1454 imesa
->sarea
->dirty
|= (imesa
->dirty
& ~(I830_UPLOAD_TEX_MASK
|
1455 I830_UPLOAD_TEXBLEND_MASK
));
1457 imesa
->upload_cliprects
= GL_TRUE
;
1462 void i830DDInitState( GLcontext
*ctx
)
1464 i830ContextPtr imesa
= I830_CONTEXT(ctx
);
1465 i830ScreenPrivate
*i830Screen
= imesa
->i830Screen
;
1468 imesa
->clear_red
= 0;
1469 imesa
->clear_green
= 0;
1470 imesa
->clear_blue
= 0;
1471 imesa
->clear_alpha
= 0;
1473 imesa
->mask_red
= GL_FALSE
;
1474 imesa
->mask_green
= GL_FALSE
;
1475 imesa
->mask_blue
= GL_FALSE
;
1476 imesa
->mask_alpha
= GL_FALSE
;
1478 /* Zero all texture state */
1479 for (i
= 0; i
< I830_TEXBLEND_COUNT
; i
++) {
1480 for (j
= 0; j
< I830_TEXBLEND_SIZE
; j
++) {
1481 imesa
->TexBlend
[i
][j
] = 0;
1482 imesa
->Init_TexBlend
[i
][j
] = 0;
1484 imesa
->TexBlendWordsUsed
[i
] = 0;
1485 imesa
->Init_TexBlendWordsUsed
[i
] = 0;
1486 imesa
->TexBlendColorPipeNum
[i
] = 0;
1487 imesa
->Init_TexBlendColorPipeNum
[i
] = 0;
1490 /* Set default blend state */
1491 imesa
->TexBlend
[0][0] = (STATE3D_MAP_BLEND_OP_CMD(0) |
1493 ENABLE_TEXOUTPUT_WRT_SEL
|
1494 TEXOP_OUTPUT_CURRENT
|
1495 DISABLE_TEX_CNTRL_STAGE
|
1497 TEXOP_MODIFY_PARMS
|
1500 imesa
->TexBlend
[0][1] = (STATE3D_MAP_BLEND_OP_CMD(0) |
1502 ENABLE_TEXOUTPUT_WRT_SEL
|
1503 TEXOP_OUTPUT_CURRENT
|
1505 TEXOP_MODIFY_PARMS
|
1507 imesa
->TexBlend
[0][2] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
1510 TEXBLENDARG_MODIFY_PARMS
|
1511 TEXBLENDARG_DIFFUSE
);
1512 imesa
->TexBlend
[0][3] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
1515 TEXBLENDARG_MODIFY_PARMS
|
1516 TEXBLENDARG_DIFFUSE
);
1518 imesa
->TexBlendWordsUsed
[0] = 4;
1519 imesa
->TexBlendColorPipeNum
[0] = 0;
1521 imesa
->Init_TexBlend
[0][0] = (STATE3D_MAP_BLEND_OP_CMD(0) |
1523 ENABLE_TEXOUTPUT_WRT_SEL
|
1524 TEXOP_OUTPUT_CURRENT
|
1525 DISABLE_TEX_CNTRL_STAGE
|
1527 TEXOP_MODIFY_PARMS
|
1530 imesa
->Init_TexBlend
[0][1] = (STATE3D_MAP_BLEND_OP_CMD(0) |
1532 ENABLE_TEXOUTPUT_WRT_SEL
|
1533 TEXOP_OUTPUT_CURRENT
|
1535 TEXOP_MODIFY_PARMS
|
1537 imesa
->Init_TexBlend
[0][2] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
1540 TEXBLENDARG_MODIFY_PARMS
|
1541 TEXBLENDARG_CURRENT
);
1542 imesa
->Init_TexBlend
[0][3] = (STATE3D_MAP_BLEND_ARG_CMD(0) |
1545 TEXBLENDARG_MODIFY_PARMS
|
1546 TEXBLENDARG_CURRENT
);
1547 imesa
->Init_TexBlendWordsUsed
[0] = 4;
1548 imesa
->Init_TexBlendColorPipeNum
[0] = 0;
1550 memset(imesa
->Setup
, 0, sizeof(imesa
->Setup
));
1552 imesa
->Setup
[I830_CTXREG_VF
] = (STATE3D_VERTEX_FORMAT_CMD
|
1553 VRTX_TEX_COORD_COUNT(1) |
1557 imesa
->vertex_format
= 0;
1558 imesa
->Setup
[I830_CTXREG_VF2
] = (STATE3D_VERTEX_FORMAT_2_CMD
|
1559 VRTX_TEX_SET_0_FMT(TEXCOORDFMT_2D
) |
1560 VRTX_TEX_SET_1_FMT(TEXCOORDFMT_2D
) |
1561 VRTX_TEX_SET_2_FMT(TEXCOORDFMT_2D
) |
1562 VRTX_TEX_SET_3_FMT(TEXCOORDFMT_2D
));
1564 imesa
->Setup
[I830_CTXREG_AA
] = (STATE3D_AA_CMD
|
1565 AA_LINE_ECAAR_WIDTH_ENABLE
|
1566 AA_LINE_ECAAR_WIDTH_1_0
|
1567 AA_LINE_REGION_WIDTH_ENABLE
|
1568 AA_LINE_REGION_WIDTH_1_0
|
1571 imesa
->Setup
[I830_CTXREG_ENABLES_1
] = (STATE3D_ENABLES_1_CMD
|
1573 DISABLE_STENCIL_TEST
|
1574 DISABLE_DEPTH_BIAS
|
1577 DISABLE_ALPHA_TEST
|
1578 DISABLE_COLOR_BLEND
|
1579 DISABLE_DEPTH_TEST
);
1581 if (imesa
->hw_stencil
) {
1582 imesa
->Setup
[I830_CTXREG_ENABLES_2
] = (STATE3D_ENABLES_2_CMD
|
1583 ENABLE_STENCIL_WRITE
|
1587 /* set no color comps disabled */
1588 ENABLE_COLOR_WRITE
|
1589 ENABLE_DEPTH_WRITE
);
1591 imesa
->Setup
[I830_CTXREG_ENABLES_2
] = (STATE3D_ENABLES_2_CMD
|
1592 DISABLE_STENCIL_WRITE
|
1596 /* set no color comps disabled */
1597 ENABLE_COLOR_WRITE
|
1598 ENABLE_DEPTH_WRITE
);
1601 imesa
->Setup
[I830_CTXREG_STATE1
] = (STATE3D_MODES_1_CMD
|
1602 ENABLE_COLR_BLND_FUNC
|
1604 ENABLE_SRC_BLND_FACTOR
|
1605 SRC_BLND_FACT(BLENDFACT_ONE
) |
1606 ENABLE_DST_BLND_FACTOR
|
1607 DST_BLND_FACT(BLENDFACT_ZERO
) );
1609 imesa
->Setup
[I830_CTXREG_STATE2
] = (STATE3D_MODES_2_CMD
|
1610 ENABLE_GLOBAL_DEPTH_BIAS
|
1611 GLOBAL_DEPTH_BIAS(0) |
1612 ENABLE_ALPHA_TEST_FUNC
|
1613 ALPHA_TEST_FUNC(COMPAREFUNC_ALWAYS
) |
1614 ALPHA_REF_VALUE(0) );
1616 imesa
->Setup
[I830_CTXREG_STATE3
] = (STATE3D_MODES_3_CMD
|
1617 ENABLE_DEPTH_TEST_FUNC
|
1618 DEPTH_TEST_FUNC(COMPAREFUNC_LESS
) |
1619 ENABLE_ALPHA_SHADE_MODE
|
1620 ALPHA_SHADE_MODE(SHADE_MODE_LINEAR
) |
1621 ENABLE_FOG_SHADE_MODE
|
1622 FOG_SHADE_MODE(SHADE_MODE_LINEAR
) |
1623 ENABLE_SPEC_SHADE_MODE
|
1624 SPEC_SHADE_MODE(SHADE_MODE_LINEAR
) |
1625 ENABLE_COLOR_SHADE_MODE
|
1626 COLOR_SHADE_MODE(SHADE_MODE_LINEAR
) |
1630 imesa
->Setup
[I830_CTXREG_STATE4
] = (STATE3D_MODES_4_CMD
|
1631 ENABLE_LOGIC_OP_FUNC
|
1632 LOGIC_OP_FUNC(LOGICOP_COPY
) |
1633 ENABLE_STENCIL_TEST_MASK
|
1634 STENCIL_TEST_MASK(0xff) |
1635 ENABLE_STENCIL_WRITE_MASK
|
1636 STENCIL_WRITE_MASK(0xff));
1638 imesa
->Setup
[I830_CTXREG_STENCILTST
] = (STATE3D_STENCIL_TEST_CMD
|
1639 ENABLE_STENCIL_PARMS
|
1640 STENCIL_FAIL_OP(STENCILOP_KEEP
) |
1641 STENCIL_PASS_DEPTH_FAIL_OP(STENCILOP_KEEP
) |
1642 STENCIL_PASS_DEPTH_PASS_OP(STENCILOP_KEEP
) |
1643 ENABLE_STENCIL_TEST_FUNC
|
1644 STENCIL_TEST_FUNC(COMPAREFUNC_ALWAYS
) |
1645 ENABLE_STENCIL_REF_VALUE
|
1646 STENCIL_REF_VALUE(0) );
1648 imesa
->Setup
[I830_CTXREG_STATE5
] = (STATE3D_MODES_5_CMD
|
1649 FLUSH_TEXTURE_CACHE
|
1650 ENABLE_SPRITE_POINT_TEX
|
1651 SPRITE_POINT_TEX_OFF
|
1652 ENABLE_FIXED_LINE_WIDTH
|
1653 FIXED_LINE_WIDTH(0x2) | /* 1.0 */
1654 ENABLE_FIXED_POINT_WIDTH
|
1655 FIXED_POINT_WIDTH(1) );
1657 imesa
->Setup
[I830_CTXREG_IALPHAB
] = (STATE3D_INDPT_ALPHA_BLEND_CMD
|
1658 DISABLE_INDPT_ALPHA_BLEND
|
1659 ENABLE_ALPHA_BLENDFUNC
|
1662 imesa
->Setup
[I830_CTXREG_FOGCOLOR
] = (STATE3D_FOG_COLOR_CMD
|
1664 FOG_COLOR_GREEN(0) |
1667 imesa
->Setup
[I830_CTXREG_BLENDCOLR0
] = (STATE3D_CONST_BLEND_COLOR_CMD
);
1669 imesa
->Setup
[I830_CTXREG_BLENDCOLR
] = 0;
1671 imesa
->Setup
[I830_CTXREG_MCSB0
] = STATE3D_MAP_COORD_SETBIND_CMD
;
1672 imesa
->Setup
[I830_CTXREG_MCSB1
] = (TEXBIND_SET3(TEXCOORDSRC_VTXSET_3
) |
1673 TEXBIND_SET2(TEXCOORDSRC_VTXSET_2
) |
1674 TEXBIND_SET1(TEXCOORDSRC_VTXSET_1
) |
1675 TEXBIND_SET0(TEXCOORDSRC_VTXSET_0
));
1677 imesa
->LcsCullMode
= CULLMODE_CW
; /* GL default */
1679 memset(imesa
->BufferSetup
, 0, sizeof(imesa
->BufferSetup
));
1680 memset(imesa
->StippleSetup
, 0, sizeof(imesa
->StippleSetup
));
1683 if (imesa
->glCtx
->Visual
.doubleBufferMode
&&
1684 imesa
->sarea
->pf_current_page
== 0) {
1685 imesa
->drawMap
= i830Screen
->back
.map
;
1686 imesa
->readMap
= i830Screen
->back
.map
;
1687 imesa
->BufferSetup
[I830_DESTREG_CBUFADDR
] = i830Screen
->backOffset
;
1688 imesa
->BufferSetup
[I830_DESTREG_DBUFADDR
] = 0;
1690 /* use front buffer by default */
1691 imesa
->drawMap
= (char *)imesa
->driScreen
->pFB
;
1692 imesa
->readMap
= (char *)imesa
->driScreen
->pFB
;
1693 imesa
->BufferSetup
[I830_DESTREG_CBUFADDR
] = i830Screen
->fbOffset
;
1694 imesa
->BufferSetup
[I830_DESTREG_DBUFADDR
] = 0;
1697 imesa
->BufferSetup
[I830_DESTREG_DV0
] = STATE3D_DST_BUF_VARS_CMD
;
1699 switch (i830Screen
->fbFormat
) {
1702 imesa
->BufferSetup
[I830_DESTREG_DV1
] = (DSTORG_HORT_BIAS(0x8) | /* .5 */
1703 DSTORG_VERT_BIAS(0x8) | /* .5 */
1704 i830Screen
->fbFormat
|
1706 DEPTH_FRMT_16_FIXED
);
1709 imesa
->BufferSetup
[I830_DESTREG_DV1
] = (DSTORG_HORT_BIAS(0x8) | /* .5 */
1710 DSTORG_VERT_BIAS(0x8) | /* .5 */
1711 i830Screen
->fbFormat
|
1713 DEPTH_FRMT_24_FIXED_8_OTHER
);
1716 imesa
->BufferSetup
[I830_DESTREG_SENABLE
] = (STATE3D_SCISSOR_ENABLE_CMD
|
1717 DISABLE_SCISSOR_RECT
);
1718 imesa
->BufferSetup
[I830_DESTREG_SR0
] = STATE3D_SCISSOR_RECT_0_CMD
;
1719 imesa
->BufferSetup
[I830_DESTREG_SR1
] = 0;
1720 imesa
->BufferSetup
[I830_DESTREG_SR2
] = 0;
1722 imesa
->BufferSetup
[I830_DESTREG_DR0
] = STATE3D_DRAW_RECT_CMD
;
1723 imesa
->BufferSetup
[I830_DESTREG_DR1
] = 0;
1724 imesa
->BufferSetup
[I830_DESTREG_DR2
] = 0;
1725 imesa
->BufferSetup
[I830_DESTREG_DR3
] = (((i830Screen
->height
)<<16) |
1726 (i830Screen
->width
));
1727 imesa
->BufferSetup
[I830_DESTREG_DR4
] = 0;
1729 memcpy( imesa
->Init_Setup
,
1731 sizeof(imesa
->Setup
) );
1732 memcpy( imesa
->Init_BufferSetup
,
1734 sizeof(imesa
->BufferSetup
) );
1738 static void i830InvalidateState( GLcontext
*ctx
, GLuint new_state
)
1740 _swrast_InvalidateState( ctx
, new_state
);
1741 _swsetup_InvalidateState( ctx
, new_state
);
1742 _ac_InvalidateState( ctx
, new_state
);
1743 _tnl_InvalidateState( ctx
, new_state
);
1744 I830_CONTEXT(ctx
)->NewGLState
|= new_state
;
1747 void i830DDInitStateFuncs(GLcontext
*ctx
)
1749 /* Callbacks for internal Mesa events.
1751 ctx
->Driver
.UpdateState
= i830InvalidateState
;
1755 ctx
->Driver
.AlphaFunc
= i830AlphaFunc
;
1756 ctx
->Driver
.BlendEquation
= i830BlendEquation
;
1757 ctx
->Driver
.BlendFunc
= i830BlendFunc
;
1758 ctx
->Driver
.BlendFuncSeparate
= i830BlendFuncSeparate
;
1759 ctx
->Driver
.BlendColor
= i830BlendColor
;
1760 ctx
->Driver
.ClearColor
= i830ClearColor
;
1761 ctx
->Driver
.ColorMask
= i830ColorMask
;
1762 ctx
->Driver
.CullFace
= i830CullFaceFrontFace
;
1763 ctx
->Driver
.DepthFunc
= i830DepthFunc
;
1764 ctx
->Driver
.DepthMask
= i830DepthMask
;
1765 ctx
->Driver
.Enable
= i830Enable
;
1766 ctx
->Driver
.Fogfv
= i830Fogfv
;
1767 ctx
->Driver
.FrontFace
= i830CullFaceFrontFace
;
1768 ctx
->Driver
.LineWidth
= i830LineWidth
;
1769 ctx
->Driver
.PointSize
= i830PointSize
;
1770 ctx
->Driver
.LogicOpcode
= i830LogicOp
;
1771 ctx
->Driver
.PolygonStipple
= i830PolygonStippleFallback
;
1772 ctx
->Driver
.RenderMode
= i830RenderMode
;
1773 ctx
->Driver
.Scissor
= i830Scissor
;
1774 ctx
->Driver
.DrawBuffer
= i830DrawBuffer
;
1775 ctx
->Driver
.ReadBuffer
= i830ReadBuffer
;
1776 ctx
->Driver
.ShadeModel
= i830ShadeModel
;
1777 ctx
->Driver
.DepthRange
= i830DepthRange
;
1778 ctx
->Driver
.Viewport
= i830Viewport
;
1779 ctx
->Driver
.LightModelfv
= i830LightModelfv
;
1781 ctx
->Driver
.StencilFunc
= i830StencilFunc
;
1782 ctx
->Driver
.StencilMask
= i830StencilMask
;
1783 ctx
->Driver
.StencilOp
= i830StencilOp
;
1785 /* Pixel path fallbacks.
1787 ctx
->Driver
.Accum
= _swrast_Accum
;
1788 ctx
->Driver
.Bitmap
= _swrast_Bitmap
;
1789 ctx
->Driver
.CopyPixels
= _swrast_CopyPixels
;
1790 ctx
->Driver
.DrawPixels
= _swrast_DrawPixels
;
1791 ctx
->Driver
.ReadPixels
= _swrast_ReadPixels
;
1793 /* Swrast hooks for imaging extensions:
1795 ctx
->Driver
.CopyColorTable
= _swrast_CopyColorTable
;
1796 ctx
->Driver
.CopyColorSubTable
= _swrast_CopyColorSubTable
;
1797 ctx
->Driver
.CopyConvolutionFilter1D
= _swrast_CopyConvolutionFilter1D
;
1798 ctx
->Driver
.CopyConvolutionFilter2D
= _swrast_CopyConvolutionFilter2D
;