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
;
294 /* XXX: 6326 has its own clipping for now. Should be fixed */
295 sis6326UpdateClipping(ctx
);
301 x2
= smesa
->width
- 1;
302 y2
= smesa
->height
- 1;
304 if (ctx
->Scissor
.Enabled
) {
305 if (ctx
->Scissor
.X
> x1
)
307 if (ctx
->Scissor
.Y
> y1
)
309 if (ctx
->Scissor
.X
+ ctx
->Scissor
.Width
- 1 < x2
)
310 x2
= ctx
->Scissor
.X
+ ctx
->Scissor
.Width
- 1;
311 if (ctx
->Scissor
.Y
+ ctx
->Scissor
.Height
- 1 < y2
)
312 y2
= ctx
->Scissor
.Y
+ ctx
->Scissor
.Height
- 1;
318 current
->clipTopBottom
= (y2
<< 13) | y1
;
319 current
->clipLeftRight
= (x1
<< 13) | x2
;
321 if ((current
->clipTopBottom
^ prev
->clipTopBottom
) ||
322 (current
->clipLeftRight
^ prev
->clipLeftRight
))
324 prev
->clipTopBottom
= current
->clipTopBottom
;
325 prev
->clipLeftRight
= current
->clipLeftRight
;
326 smesa
->GlobalFlag
|= GFLAG_CLIPPING
;
331 sisDDScissor( GLcontext
*ctx
, GLint x
, GLint y
, GLsizei w
, GLsizei h
)
333 if (ctx
->Scissor
.Enabled
)
334 sisUpdateClipping( ctx
);
337 /* =============================================================
342 sisUpdateCull( GLcontext
*ctx
)
344 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
345 GLint cullflag
, frontface
;
347 cullflag
= ctx
->Polygon
.CullFaceMode
;
348 frontface
= ctx
->Polygon
.FrontFace
;
350 smesa
->AGPParseSet
&= ~(MASK_PsCullDirection_CCW
);
351 smesa
->dwPrimitiveSet
&= ~(MASK_CullDirection
);
353 if((cullflag
== GL_FRONT
&& frontface
== GL_CCW
) ||
354 (cullflag
== GL_BACK
&& frontface
== GL_CW
))
356 smesa
->AGPParseSet
|= MASK_PsCullDirection_CCW
;
357 smesa
->dwPrimitiveSet
|= OP_3D_CullDirection_CCW
;
363 sisDDCullFace( GLcontext
*ctx
, GLenum mode
)
365 sisUpdateCull( ctx
);
369 sisDDFrontFace( GLcontext
*ctx
, GLenum mode
)
371 sisUpdateCull( ctx
);
374 /* =============================================================
378 static void sisDDColorMask( GLcontext
*ctx
,
379 GLboolean r
, GLboolean g
,
380 GLboolean b
, GLboolean a
)
382 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
383 __GLSiSHardware
*prev
= &smesa
->prev
;
384 __GLSiSHardware
*current
= &smesa
->current
;
386 if (r
&& g
&& b
&& ((ctx
->Visual
.alphaBits
== 0) || a
)) {
387 current
->hwCapEnable2
&= ~(MASK_AlphaMaskWriteEnable
|
388 MASK_ColorMaskWriteEnable
);
390 current
->hwCapEnable2
|= (MASK_AlphaMaskWriteEnable
|
391 MASK_ColorMaskWriteEnable
);
393 current
->hwDstMask
= (r
) ? smesa
->redMask
: 0 |
394 (g
) ? smesa
->greenMask
: 0 |
395 (b
) ? smesa
->blueMask
: 0 |
396 (a
) ? smesa
->alphaMask
: 0;
399 if (current
->hwDstMask
!= prev
->hwDstMask
) {
400 prev
->hwDstMask
= current
->hwDstMask
;
401 smesa
->GlobalFlag
|= GFLAG_DESTSETTING
;
405 /* =============================================================
406 * Rendering attributes
409 static void sisUpdateSpecular(GLcontext
*ctx
)
411 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
412 __GLSiSHardware
*current
= &smesa
->current
;
414 if (NEED_SECONDARY_COLOR(ctx
))
415 current
->hwCapEnable
|= MASK_SpecularEnable
;
417 current
->hwCapEnable
&= ~MASK_SpecularEnable
;
420 static void sisDDLightModelfv(GLcontext
*ctx
, GLenum pname
,
421 const GLfloat
*param
)
423 if (pname
== GL_LIGHT_MODEL_COLOR_CONTROL
) {
424 sisUpdateSpecular(ctx
);
428 static void sisDDShadeModel( GLcontext
*ctx
, GLenum mode
)
430 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
432 /* Signal to sisRasterPrimitive to recalculate dwPrimitiveSet */
433 smesa
->hw_primitive
= -1;
436 /* =============================================================
440 /* =============================================================
444 static void sisCalcViewport( GLcontext
*ctx
)
446 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
447 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
448 GLfloat
*m
= smesa
->hw_viewport
;
450 /* See also sis_translate_vertex.
452 m
[MAT_SX
] = v
[MAT_SX
];
453 m
[MAT_TX
] = v
[MAT_TX
] + SUBPIXEL_X
;
454 m
[MAT_SY
] = - v
[MAT_SY
];
455 m
[MAT_TY
] = - v
[MAT_TY
] + smesa
->driDrawable
->h
+ SUBPIXEL_Y
;
456 m
[MAT_SZ
] = v
[MAT_SZ
] * smesa
->depth_scale
;
457 m
[MAT_TZ
] = v
[MAT_TZ
] * smesa
->depth_scale
;
460 static void sisDDViewport( GLcontext
*ctx
,
462 GLsizei width
, GLsizei height
)
464 sisCalcViewport( ctx
);
467 static void sisDDDepthRange( GLcontext
*ctx
,
468 GLclampd nearval
, GLclampd farval
)
470 sisCalcViewport( ctx
);
473 /* =============================================================
478 sisDDLogicOpCode( GLcontext
*ctx
, GLenum opcode
)
480 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
482 __GLSiSHardware
*prev
= &smesa
->prev
;
483 __GLSiSHardware
*current
= &smesa
->current
;
485 current
->hwDstSet
&= ~MASK_ROP2
;
489 current
->hwDstSet
|= LOP_CLEAR
;
492 current
->hwDstSet
|= LOP_SET
;
495 current
->hwDstSet
|= LOP_COPY
;
497 case GL_COPY_INVERTED
:
498 current
->hwDstSet
|= LOP_COPY_INVERTED
;
501 current
->hwDstSet
|= LOP_NOOP
;
504 current
->hwDstSet
|= LOP_INVERT
;
507 current
->hwDstSet
|= LOP_AND
;
510 current
->hwDstSet
|= LOP_NAND
;
513 current
->hwDstSet
|= LOP_OR
;
516 current
->hwDstSet
|= LOP_NOR
;
519 current
->hwDstSet
|= LOP_XOR
;
522 current
->hwDstSet
|= LOP_EQUIV
;
525 current
->hwDstSet
|= LOP_AND_REVERSE
;
527 case GL_AND_INVERTED
:
528 current
->hwDstSet
|= LOP_AND_INVERTED
;
531 current
->hwDstSet
|= LOP_OR_REVERSE
;
534 current
->hwDstSet
|= LOP_OR_INVERTED
;
538 if (current
->hwDstSet
^ prev
->hwDstSet
) {
539 prev
->hwDstSet
= current
->hwDstSet
;
540 smesa
->GlobalFlag
|= GFLAG_DESTSETTING
;
544 void sisDDDrawBuffer( GLcontext
*ctx
, GLenum mode
)
546 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
547 __GLSiSHardware
*prev
= &smesa
->prev
;
548 __GLSiSHardware
*current
= &smesa
->current
;
551 * _DrawDestMask is easier to cope with than <mode>.
553 current
->hwDstSet
&= ~MASK_DstBufferPitch
;
554 switch ( ctx
->DrawBuffer
->_ColorDrawBufferMask
[0] ) {
555 case BUFFER_BIT_FRONT_LEFT
:
556 FALLBACK( smesa
, SIS_FALLBACK_DRAW_BUFFER
, GL_FALSE
);
557 current
->hwOffsetDest
= smesa
->front
.offset
>> 1;
558 current
->hwDstSet
|= smesa
->front
.pitch
>> 2;
560 case BUFFER_BIT_BACK_LEFT
:
561 FALLBACK( smesa
, SIS_FALLBACK_DRAW_BUFFER
, GL_FALSE
);
562 current
->hwOffsetDest
= smesa
->back
.offset
>> 1;
563 current
->hwDstSet
|= smesa
->back
.pitch
>> 2;
566 /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */
567 FALLBACK( smesa
, SIS_FALLBACK_DRAW_BUFFER
, GL_TRUE
);
571 if (current
->hwDstSet
!= prev
->hwDstSet
) {
572 prev
->hwDstSet
= current
->hwDstSet
;
573 smesa
->GlobalFlag
|= GFLAG_DESTSETTING
;
576 if (current
->hwOffsetDest
!= prev
->hwOffsetDest
) {
577 prev
->hwOffsetDest
= current
->hwOffsetDest
;
578 smesa
->GlobalFlag
|= GFLAG_DESTSETTING
;
582 /* =============================================================
586 /* =============================================================
590 /* =============================================================
591 * State enable/disable
595 sisDDEnable( GLcontext
* ctx
, GLenum cap
, GLboolean state
)
597 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
599 __GLSiSHardware
*current
= &smesa
->current
;
605 current
->hwCapEnable
|= MASK_AlphaTestEnable
;
607 current
->hwCapEnable
&= ~MASK_AlphaTestEnable
;
612 /* if (state & !ctx->Color.ColorLogicOpEnabled) */
613 current
->hwCapEnable
|= MASK_BlendEnable
;
615 current
->hwCapEnable
&= ~MASK_BlendEnable
;
619 current
->hwCapEnable
|= MASK_CullEnable
;
621 current
->hwCapEnable
&= ~MASK_CullEnable
;
624 if (state
&& smesa
->depth
.offset
!= 0)
625 current
->hwCapEnable
|= MASK_ZTestEnable
;
627 current
->hwCapEnable
&= ~MASK_ZTestEnable
;
628 sisDDDepthMask( ctx
, ctx
->Depth
.Mask
);
632 current
->hwCapEnable
|= MASK_DitherEnable
;
634 current
->hwCapEnable
&= ~MASK_DitherEnable
;
638 current
->hwCapEnable
|= MASK_FogEnable
;
640 current
->hwCapEnable
&= ~MASK_FogEnable
;
642 case GL_COLOR_LOGIC_OP
:
644 sisDDLogicOpCode( ctx
, ctx
->Color
.LogicOp
);
646 sisDDLogicOpCode( ctx
, GL_COPY
);
648 case GL_SCISSOR_TEST
:
649 sisUpdateClipping( ctx
);
651 case GL_STENCIL_TEST
:
653 if (smesa
->zFormat
!= SiS_ZFORMAT_S8Z24
)
654 FALLBACK(smesa
, SIS_FALLBACK_STENCIL
, 1);
656 current
->hwCapEnable
|= (MASK_StencilTestEnable
|
657 MASK_StencilWriteEnable
);
659 FALLBACK(smesa
, SIS_FALLBACK_STENCIL
, 0);
660 current
->hwCapEnable
&= ~(MASK_StencilTestEnable
|
661 MASK_StencilWriteEnable
);
665 case GL_COLOR_SUM_EXT
:
666 sisUpdateSpecular(ctx
);
672 /* =============================================================
673 * State initialization, management
676 /* Called before beginning of rendering. */
678 sisUpdateHWState( GLcontext
*ctx
)
680 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
681 __GLSiSHardware
*prev
= &smesa
->prev
;
682 __GLSiSHardware
*current
= &smesa
->current
;
684 /* enable setting 1 */
685 if (current
->hwCapEnable
^ prev
->hwCapEnable
) {
686 prev
->hwCapEnable
= current
->hwCapEnable
;
687 smesa
->GlobalFlag
|= GFLAG_ENABLESETTING
;
690 /* enable setting 2 */
691 if (current
->hwCapEnable2
^ prev
->hwCapEnable2
) {
692 prev
->hwCapEnable2
= current
->hwCapEnable2
;
693 smesa
->GlobalFlag
|= GFLAG_ENABLESETTING2
;
696 if (smesa
->GlobalFlag
& GFLAG_RENDER_STATES
)
697 sis_update_render_state( smesa
);
699 if (smesa
->GlobalFlag
& GFLAG_TEXTURE_STATES
)
700 sis_update_texture_state( smesa
);
704 sisDDInvalidateState( GLcontext
*ctx
, GLuint new_state
)
706 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
708 _swrast_InvalidateState( ctx
, new_state
);
709 _swsetup_InvalidateState( ctx
, new_state
);
710 _ac_InvalidateState( ctx
, new_state
);
711 _tnl_InvalidateState( ctx
, new_state
);
712 smesa
->NewGLState
|= new_state
;
715 /* Initialize the context's hardware state.
717 void sisDDInitState( sisContextPtr smesa
)
719 __GLSiSHardware
*current
= &smesa
->current
;
720 __GLSiSHardware
*prev
= &(smesa
->prev
);
721 GLcontext
*ctx
= smesa
->glCtx
;
723 /* add Texture Perspective Enable */
724 prev
->hwCapEnable
= MASK_FogPerspectiveEnable
| MASK_TextureCacheEnable
|
725 MASK_TexturePerspectiveEnable
| MASK_DitherEnable
;
728 prev->hwCapEnable2 = 0x00aa0080;
730 /* if multi-texture enabled, disable Z pre-test */
731 prev
->hwCapEnable2
= MASK_TextureMipmapBiasEnable
;
733 /* Z test mode is LESS */
734 prev
->hwZ
= SiS_Z_COMP_S_LT_B
;
737 prev
->hwZMask
= 0xffffffff;
739 /* Alpha test mode is ALWAYS, alpha ref value is 0 */
740 prev
->hwAlpha
= SiS_ALPHA_ALWAYS
;
742 /* ROP2 is COPYPEN */
743 prev
->hwDstSet
= LOP_COPY
;
746 prev
->hwDstMask
= 0xffffffff;
748 /* LinePattern is 0, Repeat Factor is 0 */
749 prev
->hwLinePattern
= 0x00008000;
751 /* Src blend is BLEND_ONE, Dst blend is D3DBLEND_ZERO */
752 prev
->hwDstSrcBlend
= SiS_S_ONE
| SiS_D_ZERO
;
754 /* Stenciling disabled, function ALWAYS, ref value zero, mask all ones */
755 prev
->hwStSetting
= STENCIL_FORMAT_8
| SiS_STENCIL_ALWAYS
| 0xff;
756 /* Op is KEEP for all three operations */
757 prev
->hwStSetting2
= SiS_SFAIL_KEEP
| SiS_SPASS_ZFAIL_KEEP
|
758 SiS_SPASS_ZPASS_KEEP
;
760 /* Texture mapping mode is Tile */
762 prev
->texture
[0].hwTextureSet
= 0x00030000;
764 /* Magnified & minified texture filter is NEAREST */
766 prev
->texture
[0].hwTextureMip
= 0;
769 /* Texture Blending setting -- use fragment color/alpha*/
770 prev
->hwTexBlendColor0
= STAGE0_C_CF
;
771 prev
->hwTexBlendColor1
= STAGE1_C_CF
;
772 prev
->hwTexBlendAlpha0
= STAGE0_A_AF
;
773 prev
->hwTexBlendAlpha1
= STAGE1_A_AF
;
775 switch (smesa
->bytesPerPixel
)
778 prev
->hwDstSet
|= DST_FORMAT_RGB_565
;
781 prev
->hwDstSet
|= DST_FORMAT_ARGB_8888
;
785 switch (ctx
->Visual
.depthBits
)
788 prev
->hwCapEnable
&= ~MASK_ZWriteEnable
;
790 smesa
->zFormat
= SiS_ZFORMAT_Z16
;
791 prev
->hwCapEnable
|= MASK_ZWriteEnable
;
792 smesa
->depth_scale
= 1.0 / (GLfloat
)0xffff;
795 smesa
->zFormat
= SiS_ZFORMAT_Z32
;
796 prev
->hwCapEnable
|= MASK_ZWriteEnable
;
797 smesa
->depth_scale
= 1.0 / (GLfloat
)0xffffffff;
800 assert (ctx
->Visual
.stencilBits
);
801 smesa
->zFormat
= SiS_ZFORMAT_S8Z24
;
802 prev
->hwCapEnable
|= MASK_StencilBufferEnable
;
803 prev
->hwCapEnable
|= MASK_ZWriteEnable
;
804 smesa
->depth_scale
= 1.0 / (GLfloat
)0xffffff;
808 prev
->hwZ
|= smesa
->zFormat
;
810 /* TODO: need to clear cache? */
811 smesa
->clearTexCache
= GL_TRUE
;
813 smesa
->clearColorPattern
= 0;
815 smesa
->AGPParseSet
= MASK_PsTexture1FromB
| MASK_PsBumpTextureFromC
;
816 smesa
->dwPrimitiveSet
= OP_3D_Texture1FromB
| OP_3D_TextureBumpFromC
;
818 sisUpdateZStencilPattern( smesa
, 1.0, 0 );
819 sisUpdateCull( ctx
);
821 memcpy( current
, prev
, sizeof (__GLSiSHardware
) );
823 /* Set initial fog settings. Start and end are the same case. */
824 sisDDFogfv( ctx
, GL_FOG_DENSITY
, &ctx
->Fog
.Density
);
825 sisDDFogfv( ctx
, GL_FOG_END
, &ctx
->Fog
.End
);
826 sisDDFogfv( ctx
, GL_FOG_COORDINATE_SOURCE_EXT
, NULL
);
827 sisDDFogfv( ctx
, GL_FOG_MODE
, NULL
);
830 /* Initialize the driver's state functions.
832 void sisDDInitStateFuncs( GLcontext
*ctx
)
834 ctx
->Driver
.UpdateState
= sisDDInvalidateState
;
836 ctx
->Driver
.Clear
= sisDDClear
;
837 ctx
->Driver
.ClearColor
= sisDDClearColor
;
838 ctx
->Driver
.ClearDepth
= sisDDClearDepth
;
839 ctx
->Driver
.ClearStencil
= sisDDClearStencil
;
841 ctx
->Driver
.AlphaFunc
= sisDDAlphaFunc
;
842 ctx
->Driver
.BlendFuncSeparate
= sisDDBlendFuncSeparate
;
843 ctx
->Driver
.ColorMask
= sisDDColorMask
;
844 ctx
->Driver
.CullFace
= sisDDCullFace
;
845 ctx
->Driver
.DepthMask
= sisDDDepthMask
;
846 ctx
->Driver
.DepthFunc
= sisDDDepthFunc
;
847 ctx
->Driver
.DepthRange
= sisDDDepthRange
;
848 ctx
->Driver
.DrawBuffer
= sisDDDrawBuffer
;
849 ctx
->Driver
.Enable
= sisDDEnable
;
850 ctx
->Driver
.FrontFace
= sisDDFrontFace
;
851 ctx
->Driver
.Fogfv
= sisDDFogfv
;
852 ctx
->Driver
.Hint
= NULL
;
853 ctx
->Driver
.Lightfv
= NULL
;
854 ctx
->Driver
.LogicOpcode
= sisDDLogicOpCode
;
855 ctx
->Driver
.PolygonMode
= NULL
;
856 ctx
->Driver
.PolygonStipple
= NULL
;
857 ctx
->Driver
.ReadBuffer
= NULL
;
858 ctx
->Driver
.RenderMode
= NULL
;
859 ctx
->Driver
.Scissor
= sisDDScissor
;
860 ctx
->Driver
.ShadeModel
= sisDDShadeModel
;
861 ctx
->Driver
.LightModelfv
= sisDDLightModelfv
;
862 ctx
->Driver
.Viewport
= sisDDViewport
;
864 /* Pixel path fallbacks. */
865 ctx
->Driver
.Accum
= _swrast_Accum
;
866 ctx
->Driver
.Bitmap
= _swrast_Bitmap
;
867 ctx
->Driver
.CopyPixels
= _swrast_CopyPixels
;
868 ctx
->Driver
.DrawPixels
= _swrast_DrawPixels
;
869 ctx
->Driver
.ReadPixels
= _swrast_ReadPixels
;
871 ctx
->Driver
.ResizeBuffers
= sisReAllocateBuffers
;
872 /* Swrast hooks for imaging extensions:
874 ctx
->Driver
.CopyColorTable
= _swrast_CopyColorTable
;
875 ctx
->Driver
.CopyColorSubTable
= _swrast_CopyColorSubTable
;
876 ctx
->Driver
.CopyConvolutionFilter1D
= _swrast_CopyConvolutionFilter1D
;
877 ctx
->Driver
.CopyConvolutionFilter2D
= _swrast_CopyConvolutionFilter2D
;