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 **************************************************************************/
30 * Sung-Ching Lin <sclin@sis.com.tw>
31 * Eric Anholt <anholt@FreeBSD.org>
36 #include "sis_context.h"
37 #include "sis_state.h"
40 #include "sis_stencil.h"
43 #include "sis_alloc.h"
45 #include "main/imports.h"
47 #include "main/framebuffer.h"
49 #include "drivers/common/driverfuncs.h"
51 #include "swrast/swrast.h"
52 #include "swrast_setup/swrast_setup.h"
57 #define need_GL_EXT_fog_coord
58 #define need_GL_EXT_secondary_color
59 #include "main/remap_helper.h"
65 int GlobalCurrentHwcx
= -1;
66 int GlobalHwcxCountBase
= 1;
67 int GlobalCmdQueueLen
= 0;
69 static struct dri_extension card_extensions
[] =
71 { "GL_ARB_multitexture", NULL
},
72 { "GL_ARB_texture_border_clamp", NULL
},
73 { "GL_ARB_texture_mirrored_repeat", NULL
},
74 /*{ "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },*/
75 { "GL_EXT_texture_lod_bias", NULL
},
76 { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions
},
77 { "GL_EXT_stencil_wrap", NULL
},
78 { "GL_MESA_ycbcr_texture", NULL
},
79 { "GL_NV_blend_square", NULL
},
84 static struct dri_extension card_extensions_6326
[] =
86 /*{ "GL_ARB_texture_border_clamp", NULL },*/
87 /*{ "GL_ARB_texture_mirrored_repeat", NULL },*/
88 /*{ "GL_MESA_ycbcr_texture", NULL },*/
93 static const struct dri_debug_control debug_control
[] =
95 { "fall", DEBUG_FALLBACKS
},
100 WaitEngIdle (sisContextPtr smesa
)
106 engineState
= MMIO_READ(REG_3D_EngineFire
); /* XXX right reg? */
107 } while ((engineState
& ENG_3DIDLEQE
) != 0);
110 engineState
= MMIO_READ(REG_CommandQueue
);
111 } while ((engineState
& SiS_EngIdle
) != SiS_EngIdle
);
116 Wait2DEngIdle (sisContextPtr smesa
)
122 engineState
= MMIO_READ(REG_6326_BitBlt_Cmd
);
123 } while ((engineState
& BLT_BUSY
) != 0);
126 engineState
= MMIO_READ(REG_CommandQueue
);
127 } while ((engineState
& SiS_EngIdle2d
) != SiS_EngIdle2d
);
131 /* To be called from mWait3DCmdQueue. Separate function for profiling
132 * purposes, and speed doesn't matter because we're spinning anyway.
135 WaitingFor3dIdle(sisContextPtr smesa
, int wLen
)
138 while (*(smesa
->CurrentQueueLenPtr
) < wLen
) {
139 *(smesa
->CurrentQueueLenPtr
) =
140 ((GLuint
)MMIO_READ(REG_3D_EngineFire
) >> 16) * 2;
143 while (*(smesa
->CurrentQueueLenPtr
) < wLen
) {
144 *(smesa
->CurrentQueueLenPtr
) =
145 (MMIO_READ(REG_CommandQueue
) & MASK_QueueLen
) - 20;
150 void sisReAllocateBuffers(GLcontext
*ctx
, GLframebuffer
*drawbuffer
,
151 GLuint width
, GLuint height
)
153 sisContextPtr smesa
= SIS_CONTEXT(ctx
);
155 sisUpdateBufferSize(smesa
);
157 _mesa_resize_framebuffer(ctx
, drawbuffer
, width
, height
);
161 sisCreateContext( const __GLcontextModes
*glVisual
,
162 __DRIcontext
*driContextPriv
,
163 void *sharedContextPrivate
)
165 GLcontext
*ctx
, *shareCtx
;
166 __DRIscreen
*sPriv
= driContextPriv
->driScreenPriv
;
168 sisScreenPtr sisScreen
;
170 struct dd_function_table functions
;
172 smesa
= (sisContextPtr
)CALLOC( sizeof(*smesa
) );
176 /* Init default driver functions then plug in our SIS-specific functions
177 * (the texture functions are especially important)
179 _mesa_init_driver_functions(&functions
);
180 sisInitDriverFuncs(&functions
);
181 sisInitTextureFuncs(&functions
);
183 /* Allocate the Mesa context */
184 if (sharedContextPrivate
)
185 shareCtx
= ((sisContextPtr
)sharedContextPrivate
)->glCtx
;
188 smesa
->glCtx
= _mesa_create_context( glVisual
, shareCtx
,
189 &functions
, (void *) smesa
);
194 driContextPriv
->driverPrivate
= smesa
;
197 sisScreen
= smesa
->sisScreen
= (sisScreenPtr
)(sPriv
->private);
199 smesa
->is6326
= GL_FALSE
; /* XXX */
200 smesa
->driContext
= driContextPriv
;
201 smesa
->driScreen
= sPriv
;
202 smesa
->driDrawable
= NULL
;
203 smesa
->hHWContext
= driContextPriv
->hHWContext
;
204 smesa
->driHwLock
= &sPriv
->pSAREA
->lock
;
205 smesa
->driFd
= sPriv
->fd
;
207 smesa
->virtualX
= sisScreen
->screenX
;
208 smesa
->virtualY
= sisScreen
->screenY
;
209 smesa
->bytesPerPixel
= sisScreen
->cpp
;
210 smesa
->IOBase
= sisScreen
->mmio
.map
;
211 smesa
->Chipset
= sisScreen
->deviceID
;
213 smesa
->FbBase
= sPriv
->pFB
;
214 smesa
->displayWidth
= sPriv
->fbWidth
;
215 smesa
->front
.pitch
= sPriv
->fbStride
;
217 smesa
->sarea
= (SISSAREAPriv
*)((char *)sPriv
->pSAREA
+
218 sisScreen
->sarea_priv_offset
);
220 /* support ARGB8888 and RGB565 */
221 switch (smesa
->bytesPerPixel
)
224 smesa
->redMask
= 0x00ff0000;
225 smesa
->greenMask
= 0x0000ff00;
226 smesa
->blueMask
= 0x000000ff;
227 smesa
->alphaMask
= 0xff000000;
228 smesa
->colorFormat
= DST_FORMAT_ARGB_8888
;
231 smesa
->redMask
= 0xf800;
232 smesa
->greenMask
= 0x07e0;
233 smesa
->blueMask
= 0x001f;
234 smesa
->alphaMask
= 0;
235 smesa
->colorFormat
= DST_FORMAT_RGB_565
;
238 sis_fatal_error("Bad bytesPerPixel %d.\n", smesa
->bytesPerPixel
);
242 ctx
->Const
.MaxTextureUnits
= 1;
243 ctx
->Const
.MaxTextureLevels
= 9;
245 ctx
->Const
.MaxTextureUnits
= 2;
246 ctx
->Const
.MaxTextureLevels
= 11;
248 ctx
->Const
.MaxTextureImageUnits
= ctx
->Const
.MaxTextureUnits
;
249 ctx
->Const
.MaxTextureCoordUnits
= ctx
->Const
.MaxTextureUnits
;
251 /* Parse configuration files */
252 driParseConfigFiles (&smesa
->optionCache
, &sisScreen
->optionCache
,
253 sisScreen
->driScreen
->myNum
, "sis");
256 SIS_DEBUG
= driParseDebugString(getenv("SIS_DEBUG"), debug_control
);
259 /* TODO: index mode */
261 smesa
->CurrentQueueLenPtr
= &(smesa
->sarea
->QueueLength
);
262 smesa
->FrameCountPtr
= &(smesa
->sarea
->FrameCount
);
265 smesa
->AGPSize
= sisScreen
->agp
.size
;
266 smesa
->AGPBase
= sisScreen
->agp
.map
;
267 smesa
->AGPAddr
= sisScreen
->agpBaseOffset
;
269 /* Create AGP command buffer */
270 if (smesa
->AGPSize
!= 0 &&
271 !driQueryOptionb(&smesa
->optionCache
, "agp_disable"))
273 smesa
->vb
= sisAllocAGP(smesa
, 64 * 1024, &smesa
->vb_agp_handle
);
274 if (smesa
->vb
!= NULL
) {
275 smesa
->using_agp
= GL_TRUE
;
276 smesa
->vb_cur
= smesa
->vb
;
277 smesa
->vb_last
= smesa
->vb
;
278 smesa
->vb_end
= smesa
->vb
+ 64 * 1024;
279 smesa
->vb_agp_offset
= ((long)smesa
->vb
- (long)smesa
->AGPBase
+
280 (long)smesa
->AGPAddr
);
283 if (!smesa
->using_agp
) {
284 smesa
->vb
= malloc(64 * 1024);
285 if (smesa
->vb
== NULL
) {
289 smesa
->vb_cur
= smesa
->vb
;
290 smesa
->vb_last
= smesa
->vb
;
291 smesa
->vb_end
= smesa
->vb
+ 64 * 1024;
294 smesa
->GlobalFlag
= 0L;
298 /* Initialize the software rasterizer and helper modules.
300 _swrast_CreateContext( ctx
);
301 _vbo_CreateContext( ctx
);
302 _tnl_CreateContext( ctx
);
303 _swsetup_CreateContext( ctx
);
305 _swrast_allow_pixel_fog( ctx
, GL_TRUE
);
306 _swrast_allow_vertex_fog( ctx
, GL_FALSE
);
307 _tnl_allow_pixel_fog( ctx
, GL_TRUE
);
308 _tnl_allow_vertex_fog( ctx
, GL_FALSE
);
310 /* XXX these should really go right after _mesa_init_driver_functions() */
312 sis6326DDInitStateFuncs( ctx
);
313 sis6326DDInitState( smesa
); /* Initializes smesa->zFormat, important */
315 sisDDInitStateFuncs( ctx
);
316 sisDDInitState( smesa
); /* Initializes smesa->zFormat, important */
317 sisDDInitStencilFuncs( ctx
);
319 sisInitTriFuncs( ctx
);
320 sisDDInitSpanFuncs( ctx
);
322 driInitExtensions( ctx
, card_extensions
, GL_FALSE
);
324 for (i
= 0; i
< SIS_MAX_TEXTURES
; i
++) {
325 smesa
->TexStates
[i
] = 0;
326 smesa
->PrevTexFormat
[i
] = 0;
329 if (driQueryOptionb(&smesa
->optionCache
, "no_rast")) {
330 fprintf(stderr
, "disabling 3D acceleration\n");
331 FALLBACK(smesa
, SIS_FALLBACK_DISABLE
, 1);
333 smesa
->texture_depth
= driQueryOptioni(&smesa
->optionCache
, "texture_depth");
339 sisDestroyContext ( __DRIcontext
*driContextPriv
)
341 sisContextPtr smesa
= (sisContextPtr
)driContextPriv
->driverPrivate
;
343 assert( smesa
!= NULL
);
345 if ( smesa
!= NULL
) {
346 _swsetup_DestroyContext( smesa
->glCtx
);
347 _tnl_DestroyContext( smesa
->glCtx
);
348 _vbo_DestroyContext( smesa
->glCtx
);
349 _swrast_DestroyContext( smesa
->glCtx
);
351 if (smesa
->using_agp
)
352 sisFreeAGP(smesa
, smesa
->vb_agp_handle
);
354 /* free the Mesa context */
355 /* XXX: Is the next line needed? The DriverCtx (smesa) reference is
356 * needed for sisDDDeleteTexture, since it needs to call the FB/AGP free
359 /* smesa->glCtx->DriverCtx = NULL; */
360 _mesa_destroy_context(smesa
->glCtx
);
367 sisMakeCurrent( __DRIcontext
*driContextPriv
,
368 __DRIdrawable
*driDrawPriv
,
369 __DRIdrawable
*driReadPriv
)
371 if ( driContextPriv
) {
372 GET_CURRENT_CONTEXT(ctx
);
373 sisContextPtr oldSisCtx
= ctx
? SIS_CONTEXT(ctx
) : NULL
;
374 sisContextPtr newSisCtx
= (sisContextPtr
) driContextPriv
->driverPrivate
;
375 struct gl_framebuffer
*drawBuffer
, *readBuffer
;
377 if ( newSisCtx
!= oldSisCtx
) {
378 newSisCtx
->GlobalFlag
= GFLAG_ALL
;
381 newSisCtx
->driDrawable
= driDrawPriv
;
383 drawBuffer
= (GLframebuffer
*)driDrawPriv
->driverPrivate
;
384 readBuffer
= (GLframebuffer
*)driReadPriv
->driverPrivate
;
386 _mesa_make_current( newSisCtx
->glCtx
, drawBuffer
, readBuffer
);
388 sisUpdateBufferSize( newSisCtx
);
389 sisUpdateClipping( newSisCtx
->glCtx
);
391 _mesa_make_current( NULL
, NULL
, NULL
);
398 sisUnbindContext( __DRIcontext
*driContextPriv
)
404 sis_update_render_state( sisContextPtr smesa
)
406 __GLSiSHardware
*prev
= &smesa
->prev
;
408 mWait3DCmdQueue (45);
410 if (smesa
->GlobalFlag
& GFLAG_ENABLESETTING
) {
411 if (!smesa
->clearTexCache
) {
412 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
);
414 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
| MASK_TextureCacheClear
);
415 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
);
416 smesa
->clearTexCache
= GL_FALSE
;
420 if (smesa
->GlobalFlag
& GFLAG_ENABLESETTING2
)
421 MMIO(REG_3D_TEnable2
, prev
->hwCapEnable2
);
424 if (smesa
->GlobalFlag
& GFLAG_ZSETTING
)
426 MMIO(REG_3D_ZSet
, prev
->hwZ
);
427 MMIO(REG_3D_ZStWriteMask
, prev
->hwZMask
);
428 MMIO(REG_3D_ZAddress
, prev
->hwOffsetZ
);
432 if (smesa
->GlobalFlag
& GFLAG_ALPHASETTING
)
433 MMIO(REG_3D_AlphaSet
, prev
->hwAlpha
);
435 if (smesa
->GlobalFlag
& GFLAG_DESTSETTING
) {
436 MMIO(REG_3D_DstSet
, prev
->hwDstSet
);
437 MMIO(REG_3D_DstAlphaWriteMask
, prev
->hwDstMask
);
438 MMIO(REG_3D_DstAddress
, prev
->hwOffsetDest
);
443 if (smesa
->GlobalFlag
& GFLAG_LINESETTING
)
444 MMIO(REG_3D_LinePattern
, prev
->hwLinePattern
);
448 if (smesa
->GlobalFlag
& GFLAG_FOGSETTING
)
450 MMIO(REG_3D_FogSet
, prev
->hwFog
);
451 MMIO(REG_3D_FogInverseDistance
, prev
->hwFogInverse
);
452 MMIO(REG_3D_FogFarDistance
, prev
->hwFogFar
);
453 MMIO(REG_3D_FogFactorDensity
, prev
->hwFogDensity
);
456 /* Stencil Setting */
457 if (smesa
->GlobalFlag
& GFLAG_STENCILSETTING
) {
458 MMIO(REG_3D_StencilSet
, prev
->hwStSetting
);
459 MMIO(REG_3D_StencilSet2
, prev
->hwStSetting2
);
462 /* Miscellaneous Setting */
463 if (smesa
->GlobalFlag
& GFLAG_DSTBLEND
)
464 MMIO(REG_3D_DstBlendMode
, prev
->hwDstSrcBlend
);
465 if (smesa
->GlobalFlag
& GFLAG_CLIPPING
) {
466 MMIO(REG_3D_ClipTopBottom
, prev
->clipTopBottom
);
467 MMIO(REG_3D_ClipLeftRight
, prev
->clipLeftRight
);
470 smesa
->GlobalFlag
&= ~GFLAG_RENDER_STATES
;
474 sis_update_texture_state (sisContextPtr smesa
)
476 __GLSiSHardware
*prev
= &smesa
->prev
;
478 mWait3DCmdQueue (55);
479 if (smesa
->clearTexCache
|| (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS
)) {
480 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
| MASK_TextureCacheClear
);
481 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
);
482 smesa
->clearTexCache
= GL_FALSE
;
485 /* Texture Setting */
486 if (smesa
->GlobalFlag
& CFLAG_TEXTURERESET
)
487 MMIO(REG_3D_TextureSet
, prev
->texture
[0].hwTextureSet
);
489 if (smesa
->GlobalFlag
& GFLAG_TEXTUREMIPMAP
)
490 MMIO(REG_3D_TextureMip
, prev
->texture
[0].hwTextureMip
);
493 MMIO(REG_3D_TextureTransparencyColorHigh, prev->texture[0].hwTextureClrHigh);
494 MMIO(REG_3D_TextureTransparencyColorLow, prev->texture[0].hwTextureClrLow);
497 if (smesa
->GlobalFlag
& GFLAG_TEXBORDERCOLOR
)
498 MMIO(REG_3D_TextureBorderColor
, prev
->texture
[0].hwTextureBorderColor
);
500 if (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS
) {
501 switch ((prev
->texture
[0].hwTextureSet
& MASK_TextureLevel
) >> 8)
504 MMIO(REG_3D_TextureAddress11
, prev
->texture
[0].texOffset11
);
506 MMIO(REG_3D_TextureAddress10
, prev
->texture
[0].texOffset10
);
507 MMIO(REG_3D_TexturePitch10
, prev
->texture
[0].texPitch10
);
509 MMIO(REG_3D_TextureAddress9
, prev
->texture
[0].texOffset9
);
511 MMIO(REG_3D_TextureAddress8
, prev
->texture
[0].texOffset8
);
512 MMIO(REG_3D_TexturePitch8
, prev
->texture
[0].texPitch89
);
514 MMIO(REG_3D_TextureAddress7
, prev
->texture
[0].texOffset7
);
516 MMIO(REG_3D_TextureAddress6
, prev
->texture
[0].texOffset6
);
517 MMIO(REG_3D_TexturePitch6
, prev
->texture
[0].texPitch67
);
519 MMIO(REG_3D_TextureAddress5
, prev
->texture
[0].texOffset5
);
521 MMIO(REG_3D_TextureAddress4
, prev
->texture
[0].texOffset4
);
522 MMIO(REG_3D_TexturePitch4
, prev
->texture
[0].texPitch45
);
524 MMIO(REG_3D_TextureAddress3
, prev
->texture
[0].texOffset3
);
526 MMIO(REG_3D_TextureAddress2
, prev
->texture
[0].texOffset2
);
527 MMIO(REG_3D_TexturePitch2
, prev
->texture
[0].texPitch23
);
529 MMIO(REG_3D_TextureAddress1
, prev
->texture
[0].texOffset1
);
531 MMIO(REG_3D_TextureAddress0
, prev
->texture
[0].texOffset0
);
532 MMIO(REG_3D_TexturePitch0
, prev
->texture
[0].texPitch01
);
535 if (smesa
->GlobalFlag
& CFLAG_TEXTURERESET_1
)
536 MMIO(REG_3D_Texture1Set
, prev
->texture
[1].hwTextureSet
);
537 if (smesa
->GlobalFlag
& GFLAG_TEXTUREMIPMAP_1
)
538 MMIO(REG_3D_Texture1Mip
, prev
->texture
[1].hwTextureMip
);
540 if (smesa
->GlobalFlag
& GFLAG_TEXBORDERCOLOR_1
) {
541 MMIO(REG_3D_Texture1BorderColor
,
542 prev
->texture
[1].hwTextureBorderColor
);
544 if (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS_1
) {
545 switch ((prev
->texture
[1].hwTextureSet
& MASK_TextureLevel
) >> 8)
548 MMIO(REG_3D_Texture1Address11
, prev
->texture
[1].texOffset11
);
550 MMIO(REG_3D_Texture1Address10
, prev
->texture
[1].texOffset10
);
551 MMIO(REG_3D_Texture1Pitch10
, prev
->texture
[1].texPitch10
);
553 MMIO(REG_3D_Texture1Address9
, prev
->texture
[1].texOffset9
);
555 MMIO(REG_3D_Texture1Address8
, prev
->texture
[1].texOffset8
);
556 MMIO(REG_3D_Texture1Pitch8
, prev
->texture
[1].texPitch89
);
558 MMIO(REG_3D_Texture1Address7
, prev
->texture
[1].texOffset7
);
560 MMIO(REG_3D_Texture1Address6
, prev
->texture
[1].texOffset6
);
561 MMIO(REG_3D_Texture1Pitch6
, prev
->texture
[1].texPitch67
);
563 MMIO(REG_3D_Texture1Address5
, prev
->texture
[1].texOffset5
);
565 MMIO(REG_3D_Texture1Address4
, prev
->texture
[1].texOffset4
);
566 MMIO(REG_3D_Texture1Pitch4
, prev
->texture
[1].texPitch45
);
568 MMIO(REG_3D_Texture1Address3
, prev
->texture
[1].texOffset3
);
570 MMIO(REG_3D_Texture1Address2
, prev
->texture
[1].texOffset2
);
571 MMIO(REG_3D_Texture1Pitch2
, prev
->texture
[1].texPitch23
);
573 MMIO(REG_3D_Texture1Address1
, prev
->texture
[1].texOffset1
);
575 MMIO(REG_3D_Texture1Address0
, prev
->texture
[1].texOffset0
);
576 MMIO(REG_3D_Texture1Pitch0
, prev
->texture
[1].texPitch01
);
580 /* texture environment */
581 if (smesa
->GlobalFlag
& GFLAG_TEXTUREENV
) {
582 MMIO(REG_3D_TextureBlendFactor
, prev
->hwTexEnvColor
);
583 MMIO(REG_3D_TextureColorBlendSet0
, prev
->hwTexBlendColor0
);
584 MMIO(REG_3D_TextureAlphaBlendSet0
, prev
->hwTexBlendAlpha0
);
586 if (smesa
->GlobalFlag
& GFLAG_TEXTUREENV_1
) {
587 MMIO(REG_3D_TextureBlendFactor
, prev
->hwTexEnvColor
);
588 MMIO(REG_3D_TextureColorBlendSet1
, prev
->hwTexBlendColor1
);
589 MMIO(REG_3D_TextureAlphaBlendSet1
, prev
->hwTexBlendAlpha1
);
592 smesa
->GlobalFlag
&= ~GFLAG_TEXTURE_STATES
;
596 sis6326_update_render_state( sisContextPtr smesa
)
598 __GLSiSHardware
*prev
= &smesa
->prev
;
600 mWait3DCmdQueue (45);
602 if (smesa
->GlobalFlag
& GFLAG_ENABLESETTING
) {
603 if (!smesa
->clearTexCache
) {
604 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
);
606 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
& ~S_ENABLE_TextureCache
);
607 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
);
608 smesa
->clearTexCache
= GL_FALSE
;
613 if (smesa
->GlobalFlag
& GFLAG_ZSETTING
) {
614 MMIO(REG_6326_3D_ZSet
, prev
->hwZ
);
615 MMIO(REG_6326_3D_ZAddress
, prev
->hwOffsetZ
);
619 if (smesa
->GlobalFlag
& GFLAG_ALPHASETTING
)
620 MMIO(REG_6326_3D_AlphaSet
, prev
->hwAlpha
);
622 if (smesa
->GlobalFlag
& GFLAG_DESTSETTING
) {
623 MMIO(REG_6326_3D_DstSet
, prev
->hwDstSet
);
624 MMIO(REG_6326_3D_DstAddress
, prev
->hwOffsetDest
);
628 if (smesa
->GlobalFlag
& GFLAG_FOGSETTING
) {
629 MMIO(REG_6326_3D_FogSet
, prev
->hwFog
);
632 /* Miscellaneous Setting */
633 if (smesa
->GlobalFlag
& GFLAG_DSTBLEND
)
634 MMIO(REG_6326_3D_DstSrcBlendMode
, prev
->hwDstSrcBlend
);
636 if (smesa
->GlobalFlag
& GFLAG_CLIPPING
) {
637 MMIO(REG_6326_3D_ClipTopBottom
, prev
->clipTopBottom
);
638 MMIO(REG_6326_3D_ClipLeftRight
, prev
->clipLeftRight
);
641 smesa
->GlobalFlag
&= ~GFLAG_RENDER_STATES
;
645 sis6326_update_texture_state (sisContextPtr smesa
)
647 __GLSiSHardware
*prev
= &smesa
->prev
;
649 mWait3DCmdQueue (55);
650 if (smesa
->clearTexCache
|| (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS
)) {
651 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
& ~S_ENABLE_TextureCache
);
652 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
);
653 smesa
->clearTexCache
= GL_FALSE
;
656 /* Texture Setting */
657 if (smesa
->GlobalFlag
& CFLAG_TEXTURERESET
)
658 MMIO(REG_6326_3D_TextureSet
, prev
->texture
[0].hwTextureSet
);
660 if (smesa
->GlobalFlag
& GFLAG_TEXTUREMIPMAP
)
661 MMIO(REG_6326_3D_TextureWidthHeight
, prev
->texture
[0].hwTexWidthHeight
);
664 MMIO(REG_3D_TextureTransparencyColorHigh, prev->texture[0].hwTextureClrHigh);
665 MMIO(REG_3D_TextureTransparencyColorLow, prev->texture[0].hwTextureClrLow);
668 if (smesa
->GlobalFlag
& GFLAG_TEXBORDERCOLOR
)
669 MMIO(REG_6326_3D_TextureBorderColor
, prev
->texture
[0].hwTextureBorderColor
);
671 if (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS
) {
672 switch ((prev
->texture
[0].hwTextureSet
& MASK_6326_TextureLevel
) >> 8)
675 MMIO(REG_6326_3D_TextureAddress9
, prev
->texture
[0].texOffset9
);
678 MMIO(REG_6326_3D_TextureAddress8
, prev
->texture
[0].texOffset8
);
679 MMIO(REG_6326_3D_TexturePitch89
, prev
->texture
[0].texPitch89
);
682 MMIO(REG_6326_3D_TextureAddress7
, prev
->texture
[0].texOffset7
);
685 MMIO(REG_6326_3D_TextureAddress6
, prev
->texture
[0].texOffset6
);
686 MMIO(REG_6326_3D_TexturePitch67
, prev
->texture
[0].texPitch67
);
689 MMIO(REG_6326_3D_TextureAddress5
, prev
->texture
[0].texOffset5
);
692 MMIO(REG_6326_3D_TextureAddress4
, prev
->texture
[0].texOffset4
);
693 MMIO(REG_6326_3D_TexturePitch45
, prev
->texture
[0].texPitch45
);
696 MMIO(REG_6326_3D_TextureAddress3
, prev
->texture
[0].texOffset3
);
699 MMIO(REG_6326_3D_TextureAddress2
, prev
->texture
[0].texOffset2
);
700 MMIO(REG_6326_3D_TexturePitch23
, prev
->texture
[0].texPitch23
);
703 MMIO(REG_6326_3D_TextureAddress1
, prev
->texture
[0].texOffset1
);
706 MMIO(REG_6326_3D_TextureAddress0
, prev
->texture
[0].texOffset0
);
707 MMIO(REG_6326_3D_TexturePitch01
, prev
->texture
[0].texPitch01
);
712 /* texture environment */
713 if (smesa
->GlobalFlag
& GFLAG_TEXTUREENV
) {
714 MMIO(REG_6326_3D_TextureBlendSet
, prev
->hwTexBlendSet
);
717 smesa
->GlobalFlag
&= ~GFLAG_TEXTURE_STATES
;