1 /**************************************************************************
3 Copyright 2000 Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan.
4 Copyright 2003 Eric Anholt
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 ERIC ANHOLT OR SILICON INTEGRATED SYSTEMS CORP 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 **************************************************************************/
27 /* $XFree86: xc/lib/GL/mesa/src/drv/sis/sis_ctx.c,v 1.3 2000/09/26 15:56:48 tsi Exp $ */
31 * Sung-Ching Lin <sclin@sis.com.tw>
32 * Eric Anholt <anholt@FreeBSD.org>
35 #include "sis_context.h"
36 #include "sis_state.h"
44 #include "swrast/swrast.h"
45 #include "array_cache/acache.h"
47 #include "swrast_setup/swrast_setup.h"
49 #include "tnl/t_pipeline.h"
51 /* =============================================================
56 sisDDAlphaFunc( GLcontext
* ctx
, GLenum func
, GLfloat ref
)
58 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
61 __GLSiSHardware
*prev
= &smesa
->prev
;
62 __GLSiSHardware
*current
= &smesa
->current
;
64 CLAMPED_FLOAT_TO_UBYTE(refbyte
, ref
);
65 current
->hwAlpha
= refbyte
<< 16;
67 /* Alpha Test function */
71 current
->hwAlpha
|= SiS_ALPHA_NEVER
;
74 current
->hwAlpha
|= SiS_ALPHA_LESS
;
77 current
->hwAlpha
|= SiS_ALPHA_EQUAL
;
80 current
->hwAlpha
|= SiS_ALPHA_LEQUAL
;
83 current
->hwAlpha
|= SiS_ALPHA_GREATER
;
86 current
->hwAlpha
|= SiS_ALPHA_NOTEQUAL
;
89 current
->hwAlpha
|= SiS_ALPHA_GEQUAL
;
92 current
->hwAlpha
|= SiS_ALPHA_ALWAYS
;
96 prev
->hwAlpha
= current
->hwAlpha
;
97 smesa
->GlobalFlag
|= GFLAG_ALPHASETTING
;
101 sisDDBlendFuncSeparate( GLcontext
*ctx
,
102 GLenum sfactorRGB
, GLenum dfactorRGB
,
103 GLenum sfactorA
, GLenum dfactorA
)
105 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
107 __GLSiSHardware
*prev
= &smesa
->prev
;
108 __GLSiSHardware
*current
= &smesa
->current
;
110 current
->hwDstSrcBlend
= 0;
115 current
->hwDstSrcBlend
|= SiS_D_ZERO
;
118 current
->hwDstSrcBlend
|= SiS_D_ONE
;
121 current
->hwDstSrcBlend
|= SiS_D_SRC_COLOR
;
123 case GL_ONE_MINUS_SRC_COLOR
:
124 current
->hwDstSrcBlend
|= SiS_D_ONE_MINUS_SRC_COLOR
;
127 current
->hwDstSrcBlend
|= SiS_D_SRC_ALPHA
;
129 case GL_ONE_MINUS_SRC_ALPHA
:
130 current
->hwDstSrcBlend
|= SiS_D_ONE_MINUS_SRC_ALPHA
;
133 current
->hwDstSrcBlend
|= SiS_D_DST_COLOR
;
135 case GL_ONE_MINUS_DST_COLOR
:
136 current
->hwDstSrcBlend
|= SiS_D_ONE_MINUS_DST_COLOR
;
139 current
->hwDstSrcBlend
|= SiS_D_DST_ALPHA
;
141 case GL_ONE_MINUS_DST_ALPHA
:
142 current
->hwDstSrcBlend
|= SiS_D_ONE_MINUS_DST_ALPHA
;
145 fprintf(stderr
, "Unknown dst blend function 0x%x\n", dfactorRGB
);
152 current
->hwDstSrcBlend
|= SiS_S_ZERO
;
155 current
->hwDstSrcBlend
|= SiS_S_ONE
;
158 current
->hwDstSrcBlend
|= SiS_S_SRC_COLOR
;
160 case GL_ONE_MINUS_SRC_COLOR
:
161 current
->hwDstSrcBlend
|= SiS_S_ONE_MINUS_SRC_COLOR
;
164 current
->hwDstSrcBlend
|= SiS_S_SRC_ALPHA
;
166 case GL_ONE_MINUS_SRC_ALPHA
:
167 current
->hwDstSrcBlend
|= SiS_S_ONE_MINUS_SRC_ALPHA
;
170 current
->hwDstSrcBlend
|= SiS_S_DST_COLOR
;
172 case GL_ONE_MINUS_DST_COLOR
:
173 current
->hwDstSrcBlend
|= SiS_S_ONE_MINUS_DST_COLOR
;
176 current
->hwDstSrcBlend
|= SiS_S_DST_ALPHA
;
178 case GL_ONE_MINUS_DST_ALPHA
:
179 current
->hwDstSrcBlend
|= SiS_S_ONE_MINUS_DST_ALPHA
;
181 case GL_SRC_ALPHA_SATURATE
:
182 current
->hwDstSrcBlend
|= SiS_S_SRC_ALPHA_SATURATE
;
185 fprintf(stderr
, "Unknown src blend function 0x%x\n", sfactorRGB
);
189 if (current
->hwDstSrcBlend
!= prev
->hwDstSrcBlend
) {
190 prev
->hwDstSrcBlend
= current
->hwDstSrcBlend
;
191 smesa
->GlobalFlag
|= GFLAG_DSTBLEND
;
195 /* =============================================================
200 sisDDDepthFunc( GLcontext
* ctx
, GLenum func
)
202 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
203 __GLSiSHardware
*prev
= &smesa
->prev
;
204 __GLSiSHardware
*current
= &smesa
->current
;
206 current
->hwZ
&= ~MASK_ZTestMode
;
210 current
->hwZ
|= SiS_Z_COMP_S_LT_B
;
213 current
->hwZ
|= SiS_Z_COMP_S_GE_B
;
216 current
->hwZ
|= SiS_Z_COMP_S_LE_B
;
219 current
->hwZ
|= SiS_Z_COMP_S_GT_B
;
222 current
->hwZ
|= SiS_Z_COMP_S_NE_B
;
225 current
->hwZ
|= SiS_Z_COMP_S_EQ_B
;
228 current
->hwZ
|= SiS_Z_COMP_ALWAYS
;
231 current
->hwZ
|= SiS_Z_COMP_NEVER
;
235 if (current
->hwZ
!= prev
->hwZ
) {
236 prev
->hwZ
= current
->hwZ
;
237 smesa
->GlobalFlag
|= GFLAG_ZSETTING
;
242 sisDDDepthMask( GLcontext
* ctx
, GLboolean flag
)
244 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
245 __GLSiSHardware
*prev
= &smesa
->prev
;
246 __GLSiSHardware
*current
= &smesa
->current
;
248 if (!ctx
->Depth
.Test
)
251 if (ctx
->Visual
.stencilBits
) {
252 if (flag
|| (ctx
->Stencil
.WriteMask
[0] != 0)) {
253 current
->hwCapEnable
|= MASK_ZWriteEnable
;
254 if (flag
&& (ctx
->Stencil
.WriteMask
[0] == 0xff)) {
255 current
->hwCapEnable2
&= ~MASK_ZMaskWriteEnable
;
257 current
->hwCapEnable2
|= MASK_ZMaskWriteEnable
;
258 current
->hwZMask
= (ctx
->Stencil
.WriteMask
[0] << 24) |
259 ((flag
) ? 0x00ffffff : 0);
261 if (current
->hwZMask
^ prev
->hwZMask
) {
262 prev
->hwZMask
= current
->hwZMask
;
263 smesa
->GlobalFlag
|= GFLAG_ZSETTING
;
267 current
->hwCapEnable
&= ~MASK_ZWriteEnable
;
271 current
->hwCapEnable
|= MASK_ZWriteEnable
;
272 current
->hwCapEnable2
&= ~MASK_ZMaskWriteEnable
;
274 current
->hwCapEnable
&= ~MASK_ZWriteEnable
;
279 /* =============================================================
284 sisUpdateClipping( GLcontext
*ctx
)
286 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
288 __GLSiSHardware
*prev
= &smesa
->prev
;
289 __GLSiSHardware
*current
= &smesa
->current
;
291 GLint x1
, y1
, x2
, y2
;
295 x2
= smesa
->width
- 1;
296 y2
= smesa
->height
- 1;
298 if (ctx
->Scissor
.Enabled
) {
299 if (ctx
->Scissor
.X
> x1
)
301 if (ctx
->Scissor
.Y
> y1
)
303 if (ctx
->Scissor
.X
+ ctx
->Scissor
.Width
- 1 < x2
)
304 x2
= ctx
->Scissor
.X
+ ctx
->Scissor
.Width
- 1;
305 if (ctx
->Scissor
.Y
+ ctx
->Scissor
.Height
- 1 < y2
)
306 y2
= ctx
->Scissor
.Y
+ ctx
->Scissor
.Height
- 1;
312 current
->clipTopBottom
= (y2
<< 13) | y1
;
313 current
->clipLeftRight
= (x1
<< 13) | x2
;
315 if ((current
->clipTopBottom
^ prev
->clipTopBottom
) ||
316 (current
->clipLeftRight
^ prev
->clipLeftRight
))
318 prev
->clipTopBottom
= current
->clipTopBottom
;
319 prev
->clipLeftRight
= current
->clipLeftRight
;
320 smesa
->GlobalFlag
|= GFLAG_CLIPPING
;
325 sisDDScissor( GLcontext
*ctx
, GLint x
, GLint y
, GLsizei w
, GLsizei h
)
327 if (ctx
->Scissor
.Enabled
)
328 sisUpdateClipping( ctx
);
331 /* =============================================================
336 sisUpdateCull( GLcontext
*ctx
)
338 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
339 GLint cullflag
, frontface
;
341 cullflag
= ctx
->Polygon
.CullFaceMode
;
342 frontface
= ctx
->Polygon
.FrontFace
;
344 smesa
->AGPParseSet
&= ~(MASK_PsCullDirection_CCW
);
345 smesa
->dwPrimitiveSet
&= ~(MASK_CullDirection
);
347 if((cullflag
== GL_FRONT
&& frontface
== GL_CCW
) ||
348 (cullflag
== GL_BACK
&& frontface
== GL_CW
))
350 smesa
->AGPParseSet
|= MASK_PsCullDirection_CCW
;
351 smesa
->dwPrimitiveSet
|= OP_3D_CullDirection_CCW
;
357 sisDDCullFace( GLcontext
*ctx
, GLenum mode
)
359 sisUpdateCull( ctx
);
363 sisDDFrontFace( GLcontext
*ctx
, GLenum mode
)
365 sisUpdateCull( ctx
);
368 /* =============================================================
372 static void sisDDColorMask( GLcontext
*ctx
,
373 GLboolean r
, GLboolean g
,
374 GLboolean b
, GLboolean a
)
376 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
377 __GLSiSHardware
*prev
= &smesa
->prev
;
378 __GLSiSHardware
*current
= &smesa
->current
;
380 if (r
&& g
&& b
&& ((ctx
->Visual
.alphaBits
== 0) || a
)) {
381 current
->hwCapEnable2
&= ~(MASK_AlphaMaskWriteEnable
|
382 MASK_ColorMaskWriteEnable
);
384 current
->hwCapEnable2
|= (MASK_AlphaMaskWriteEnable
|
385 MASK_ColorMaskWriteEnable
);
387 current
->hwDstMask
= (r
) ? smesa
->redMask
: 0 |
388 (g
) ? smesa
->greenMask
: 0 |
389 (b
) ? smesa
->blueMask
: 0 |
390 (a
) ? smesa
->alphaMask
: 0;
393 if (current
->hwDstMask
!= prev
->hwDstMask
) {
394 prev
->hwDstMask
= current
->hwDstMask
;
395 smesa
->GlobalFlag
|= GFLAG_DESTSETTING
;
399 /* =============================================================
400 * Rendering attributes
403 static void sisDDShadeModel( GLcontext
*ctx
, GLenum mode
)
405 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
407 /* Signal to sisRasterPrimitive to recalculate dwPrimitiveSet */
408 smesa
->hw_primitive
= -1;
411 /* =============================================================
415 /* =============================================================
419 static void sisCalcViewport( GLcontext
*ctx
)
421 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
422 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
423 GLfloat
*m
= smesa
->hw_viewport
;
425 /* See also sis_translate_vertex.
427 m
[MAT_SX
] = v
[MAT_SX
];
428 m
[MAT_TX
] = v
[MAT_TX
] + SUBPIXEL_X
;
429 m
[MAT_SY
] = - v
[MAT_SY
];
430 m
[MAT_TY
] = - v
[MAT_TY
] + smesa
->driDrawable
->h
+ SUBPIXEL_Y
;
431 m
[MAT_SZ
] = v
[MAT_SZ
] * smesa
->depth_scale
;
432 m
[MAT_TZ
] = v
[MAT_TZ
] * smesa
->depth_scale
;
435 static void sisDDViewport( GLcontext
*ctx
,
437 GLsizei width
, GLsizei height
)
439 sisCalcViewport( ctx
);
442 static void sisDDDepthRange( GLcontext
*ctx
,
443 GLclampd nearval
, GLclampd farval
)
445 sisCalcViewport( ctx
);
448 /* =============================================================
453 sisDDLogicOpCode( GLcontext
*ctx
, GLenum opcode
)
455 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
457 __GLSiSHardware
*prev
= &smesa
->prev
;
458 __GLSiSHardware
*current
= &smesa
->current
;
460 current
->hwDstSet
&= ~MASK_ROP2
;
464 current
->hwDstSet
|= LOP_CLEAR
;
467 current
->hwDstSet
|= LOP_SET
;
470 current
->hwDstSet
|= LOP_COPY
;
472 case GL_COPY_INVERTED
:
473 current
->hwDstSet
|= LOP_COPY_INVERTED
;
476 current
->hwDstSet
|= LOP_NOOP
;
479 current
->hwDstSet
|= LOP_INVERT
;
482 current
->hwDstSet
|= LOP_AND
;
485 current
->hwDstSet
|= LOP_NAND
;
488 current
->hwDstSet
|= LOP_OR
;
491 current
->hwDstSet
|= LOP_NOR
;
494 current
->hwDstSet
|= LOP_XOR
;
497 current
->hwDstSet
|= LOP_EQUIV
;
500 current
->hwDstSet
|= LOP_AND_REVERSE
;
502 case GL_AND_INVERTED
:
503 current
->hwDstSet
|= LOP_AND_INVERTED
;
506 current
->hwDstSet
|= LOP_OR_REVERSE
;
509 current
->hwDstSet
|= LOP_OR_INVERTED
;
513 if (current
->hwDstSet
^ prev
->hwDstSet
) {
514 prev
->hwDstSet
= current
->hwDstSet
;
515 smesa
->GlobalFlag
|= GFLAG_DESTSETTING
;
519 void sisDDDrawBuffer( GLcontext
*ctx
, GLenum mode
)
521 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
523 __GLSiSHardware
*prev
= &smesa
->prev
;
524 __GLSiSHardware
*current
= &smesa
->current
;
527 * _DrawDestMask is easier to cope with than <mode>.
529 switch ( ctx
->Color
._DrawDestMask
[0] ) {
530 case DD_FRONT_LEFT_BIT
:
531 case DD_BACK_LEFT_BIT
:
532 FALLBACK( smesa
, SIS_FALLBACK_DRAW_BUFFER
, GL_FALSE
);
535 /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */
536 FALLBACK( smesa
, SIS_FALLBACK_DRAW_BUFFER
, GL_TRUE
);
540 /* We want to update the s/w rast state too so that sisDDSetBuffer()
543 _swrast_DrawBuffer(ctx
, mode
);
545 current
->hwOffsetDest
= (smesa
->drawOffset
) >> 1;
546 current
->hwDstSet
&= ~MASK_DstBufferPitch
;
547 current
->hwDstSet
|= smesa
->drawPitch
>> 2;
549 if (current
->hwDstSet
!= prev
->hwDstSet
) {
550 prev
->hwDstSet
= current
->hwDstSet
;
551 smesa
->GlobalFlag
|= GFLAG_DESTSETTING
;
554 if (current
->hwOffsetDest
!= prev
->hwOffsetDest
) {
555 prev
->hwOffsetDest
= current
->hwOffsetDest
;
556 smesa
->GlobalFlag
|= GFLAG_DESTSETTING
;
560 /* =============================================================
564 /* =============================================================
568 /* =============================================================
569 * State enable/disable
573 sisDDEnable( GLcontext
* ctx
, GLenum cap
, GLboolean state
)
575 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
577 __GLSiSHardware
*current
= &smesa
->current
;
583 current
->hwCapEnable
|= MASK_AlphaTestEnable
;
585 current
->hwCapEnable
&= ~MASK_AlphaTestEnable
;
590 /* if (state & !ctx->Color.ColorLogicOpEnabled) */
591 current
->hwCapEnable
|= MASK_BlendEnable
;
593 current
->hwCapEnable
&= ~MASK_BlendEnable
;
597 current
->hwCapEnable
|= MASK_CullEnable
;
599 current
->hwCapEnable
&= ~MASK_CullEnable
;
602 if (state
&& smesa
->depthbuffer
)
603 current
->hwCapEnable
|= MASK_ZTestEnable
;
605 current
->hwCapEnable
&= ~MASK_ZTestEnable
;
606 sisDDDepthMask( ctx
, ctx
->Depth
.Mask
);
610 current
->hwCapEnable
|= MASK_DitherEnable
;
612 current
->hwCapEnable
&= ~MASK_DitherEnable
;
616 current
->hwCapEnable
|= MASK_FogEnable
;
618 current
->hwCapEnable
&= ~MASK_FogEnable
;
620 case GL_COLOR_LOGIC_OP
:
622 sisDDLogicOpCode( ctx
, ctx
->Color
.LogicOp
);
624 sisDDLogicOpCode( ctx
, GL_COPY
);
626 case GL_SCISSOR_TEST
:
627 sisUpdateClipping( ctx
);
629 case GL_STENCIL_TEST
:
631 if (smesa
->zFormat
!= SiS_ZFORMAT_S8Z24
)
632 FALLBACK(smesa
, SIS_FALLBACK_STENCIL
, 1);
634 current
->hwCapEnable
|= (MASK_StencilTestEnable
|
635 MASK_StencilWriteEnable
);
637 FALLBACK(smesa
, SIS_FALLBACK_STENCIL
, 0);
638 current
->hwCapEnable
&= ~(MASK_StencilTestEnable
|
639 MASK_StencilWriteEnable
);
646 /* =============================================================
647 * State initialization, management
650 /* Called before beginning of rendering. */
652 sisUpdateHWState( GLcontext
*ctx
)
654 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
655 __GLSiSHardware
*prev
= &smesa
->prev
;
656 __GLSiSHardware
*current
= &smesa
->current
;
658 /* enable setting 1 */
659 if (current
->hwCapEnable
^ prev
->hwCapEnable
) {
660 prev
->hwCapEnable
= current
->hwCapEnable
;
661 smesa
->GlobalFlag
|= GFLAG_ENABLESETTING
;
664 /* enable setting 2 */
665 if (current
->hwCapEnable2
^ prev
->hwCapEnable2
) {
666 prev
->hwCapEnable2
= current
->hwCapEnable2
;
667 smesa
->GlobalFlag
|= GFLAG_ENABLESETTING2
;
670 if (smesa
->GlobalFlag
& GFLAG_RENDER_STATES
)
671 sis_update_render_state( smesa
);
673 if (smesa
->GlobalFlag
& GFLAG_TEXTURE_STATES
)
674 sis_update_texture_state( smesa
);
678 sisDDInvalidateState( GLcontext
*ctx
, GLuint new_state
)
680 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
682 _swrast_InvalidateState( ctx
, new_state
);
683 _swsetup_InvalidateState( ctx
, new_state
);
684 _ac_InvalidateState( ctx
, new_state
);
685 _tnl_InvalidateState( ctx
, new_state
);
686 smesa
->NewGLState
|= new_state
;
689 /* Initialize the context's hardware state.
691 void sisDDInitState( sisContextPtr smesa
)
693 __GLSiSHardware
*current
= &smesa
->current
;
694 __GLSiSHardware
*prev
= &(smesa
->prev
);
695 GLcontext
*ctx
= smesa
->glCtx
;
697 /* add Texture Perspective Enable */
698 prev
->hwCapEnable
= MASK_FogPerspectiveEnable
| MASK_TextureCacheEnable
|
699 MASK_TexturePerspectiveEnable
| MASK_DitherEnable
;
700 /*| MASK_SpecularEnable*/
703 prev->hwCapEnable2 = 0x00aa0080;
705 /* if multi-texture enabled, disable Z pre-test */
706 prev
->hwCapEnable2
= MASK_TextureMipmapBiasEnable
;
708 /* Z test mode is LESS */
709 prev
->hwZ
= SiS_Z_COMP_S_LT_B
;
712 prev
->hwZMask
= 0xffffffff;
714 /* Alpha test mode is ALWAYS, alpha ref value is 0 */
715 prev
->hwAlpha
= SiS_ALPHA_ALWAYS
;
717 /* ROP2 is COPYPEN */
718 prev
->hwDstSet
= LOP_COPY
;
721 prev
->hwDstMask
= 0xffffffff;
723 /* LinePattern is 0, Repeat Factor is 0 */
724 prev
->hwLinePattern
= 0x00008000;
726 /* Src blend is BLEND_ONE, Dst blend is D3DBLEND_ZERO */
727 prev
->hwDstSrcBlend
= SiS_S_ONE
| SiS_D_ZERO
;
729 /* Stenciling disabled, function ALWAYS, ref value zero, mask all ones */
730 prev
->hwStSetting
= STENCIL_FORMAT_8
| SiS_STENCIL_ALWAYS
| 0xff;
731 /* Op is KEEP for all three operations */
732 prev
->hwStSetting2
= SiS_SFAIL_KEEP
| SiS_SPASS_ZFAIL_KEEP
|
733 SiS_SPASS_ZPASS_KEEP
;
735 /* Texture mapping mode is Tile */
737 prev
->texture
[0].hwTextureSet
= 0x00030000;
739 /* Magnified & minified texture filter is NEAREST */
741 prev
->texture
[0].hwTextureMip
= 0;
744 /* Texture Blending setting -- use fragment color/alpha*/
745 prev
->hwTexBlendColor0
= STAGE0_C_CF
;
746 prev
->hwTexBlendColor1
= STAGE1_C_CF
;
747 prev
->hwTexBlendAlpha0
= STAGE0_A_AF
;
748 prev
->hwTexBlendAlpha1
= STAGE1_A_AF
;
750 switch (smesa
->bytesPerPixel
)
753 prev
->hwDstSet
|= DST_FORMAT_RGB_565
;
756 prev
->hwDstSet
|= DST_FORMAT_ARGB_8888
;
760 switch (ctx
->Visual
.depthBits
)
763 prev
->hwCapEnable
&= ~MASK_ZWriteEnable
;
765 smesa
->zFormat
= SiS_ZFORMAT_Z16
;
766 prev
->hwCapEnable
|= MASK_ZWriteEnable
;
767 smesa
->depth_scale
= 1.0 / (GLfloat
)0xffff;
770 smesa
->zFormat
= SiS_ZFORMAT_Z32
;
771 prev
->hwCapEnable
|= MASK_ZWriteEnable
;
772 smesa
->depth_scale
= 1.0 / (GLfloat
)0xffffffff;
775 assert (ctx
->Visual
.stencilBits
);
776 smesa
->zFormat
= SiS_ZFORMAT_S8Z24
;
777 prev
->hwCapEnable
|= MASK_StencilBufferEnable
;
778 prev
->hwCapEnable
|= MASK_ZWriteEnable
;
779 smesa
->depth_scale
= 1.0 / (GLfloat
)0xffffff;
783 prev
->hwZ
|= smesa
->zFormat
;
785 /* TODO: need to clear cache? */
786 smesa
->clearTexCache
= GL_TRUE
;
788 smesa
->clearColorPattern
= 0;
790 smesa
->AGPParseSet
= MASK_PsTexture1FromB
| MASK_PsBumpTextureFromC
;
791 smesa
->dwPrimitiveSet
= OP_3D_Texture1FromB
| OP_3D_TextureBumpFromC
;
793 sisUpdateZStencilPattern( smesa
, 1.0, 0 );
794 sisUpdateCull( ctx
);
796 memcpy( current
, prev
, sizeof (__GLSiSHardware
) );
798 /* Set initial fog settings. Start and end are the same case. */
799 sisDDFogfv( ctx
, GL_FOG_DENSITY
, &ctx
->Fog
.Density
);
800 sisDDFogfv( ctx
, GL_FOG_END
, &ctx
->Fog
.End
);
801 sisDDFogfv( ctx
, GL_FOG_MODE
, NULL
);
804 /* Initialize the driver's state functions.
806 void sisDDInitStateFuncs( GLcontext
*ctx
)
808 ctx
->Driver
.UpdateState
= sisDDInvalidateState
;
810 ctx
->Driver
.Clear
= sisDDClear
;
811 ctx
->Driver
.ClearColor
= sisDDClearColor
;
812 ctx
->Driver
.ClearDepth
= sisDDClearDepth
;
813 ctx
->Driver
.ClearStencil
= sisDDClearStencil
;
815 ctx
->Driver
.AlphaFunc
= sisDDAlphaFunc
;
816 ctx
->Driver
.BlendFuncSeparate
= sisDDBlendFuncSeparate
;
817 ctx
->Driver
.ColorMask
= sisDDColorMask
;
818 ctx
->Driver
.CullFace
= sisDDCullFace
;
819 ctx
->Driver
.DepthMask
= sisDDDepthMask
;
820 ctx
->Driver
.DepthFunc
= sisDDDepthFunc
;
821 ctx
->Driver
.DepthRange
= sisDDDepthRange
;
822 ctx
->Driver
.DrawBuffer
= sisDDDrawBuffer
;
823 ctx
->Driver
.Enable
= sisDDEnable
;
824 ctx
->Driver
.FrontFace
= sisDDFrontFace
;
825 ctx
->Driver
.Fogfv
= sisDDFogfv
;
826 ctx
->Driver
.Hint
= NULL
;
827 ctx
->Driver
.Lightfv
= NULL
;
828 ctx
->Driver
.LogicOpcode
= sisDDLogicOpCode
;
829 ctx
->Driver
.PolygonMode
= NULL
;
830 ctx
->Driver
.PolygonStipple
= NULL
;
831 ctx
->Driver
.ReadBuffer
= NULL
;
832 ctx
->Driver
.RenderMode
= NULL
;
833 ctx
->Driver
.Scissor
= sisDDScissor
;
834 ctx
->Driver
.ShadeModel
= sisDDShadeModel
;
835 ctx
->Driver
.Viewport
= sisDDViewport
;
837 /* Pixel path fallbacks. */
838 ctx
->Driver
.Accum
= _swrast_Accum
;
839 ctx
->Driver
.Bitmap
= _swrast_Bitmap
;
840 ctx
->Driver
.CopyPixels
= _swrast_CopyPixels
;
841 ctx
->Driver
.DrawPixels
= _swrast_DrawPixels
;
842 ctx
->Driver
.ReadPixels
= _swrast_ReadPixels
;
844 /* Swrast hooks for imaging extensions:
846 ctx
->Driver
.CopyColorTable
= _swrast_CopyColorTable
;
847 ctx
->Driver
.CopyColorSubTable
= _swrast_CopyColorSubTable
;
848 ctx
->Driver
.CopyConvolutionFilter1D
= _swrast_CopyConvolutionFilter1D
;
849 ctx
->Driver
.CopyConvolutionFilter2D
= _swrast_CopyConvolutionFilter2D
;