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( gl_api api
,
162 const __GLcontextModes
*glVisual
,
163 __DRIcontext
*driContextPriv
,
164 void *sharedContextPrivate
)
166 GLcontext
*ctx
, *shareCtx
;
167 __DRIscreen
*sPriv
= driContextPriv
->driScreenPriv
;
169 sisScreenPtr sisScreen
;
171 struct dd_function_table functions
;
173 smesa
= (sisContextPtr
)CALLOC( sizeof(*smesa
) );
177 /* Init default driver functions then plug in our SIS-specific functions
178 * (the texture functions are especially important)
180 _mesa_init_driver_functions(&functions
);
181 sisInitDriverFuncs(&functions
);
182 sisInitTextureFuncs(&functions
);
184 /* Allocate the Mesa context */
185 if (sharedContextPrivate
)
186 shareCtx
= ((sisContextPtr
)sharedContextPrivate
)->glCtx
;
189 smesa
->glCtx
= _mesa_create_context( glVisual
, shareCtx
,
190 &functions
, (void *) smesa
);
195 driContextPriv
->driverPrivate
= smesa
;
198 sisScreen
= smesa
->sisScreen
= (sisScreenPtr
)(sPriv
->private);
200 smesa
->is6326
= GL_FALSE
; /* XXX */
201 smesa
->driContext
= driContextPriv
;
202 smesa
->driScreen
= sPriv
;
203 smesa
->driDrawable
= NULL
;
204 smesa
->hHWContext
= driContextPriv
->hHWContext
;
205 smesa
->driHwLock
= &sPriv
->pSAREA
->lock
;
206 smesa
->driFd
= sPriv
->fd
;
208 smesa
->virtualX
= sisScreen
->screenX
;
209 smesa
->virtualY
= sisScreen
->screenY
;
210 smesa
->bytesPerPixel
= sisScreen
->cpp
;
211 smesa
->IOBase
= sisScreen
->mmio
.map
;
212 smesa
->Chipset
= sisScreen
->deviceID
;
214 smesa
->FbBase
= sPriv
->pFB
;
215 smesa
->displayWidth
= sPriv
->fbWidth
;
216 smesa
->front
.pitch
= sPriv
->fbStride
;
218 smesa
->sarea
= (SISSAREAPriv
*)((char *)sPriv
->pSAREA
+
219 sisScreen
->sarea_priv_offset
);
221 /* support ARGB8888 and RGB565 */
222 switch (smesa
->bytesPerPixel
)
225 smesa
->redMask
= 0x00ff0000;
226 smesa
->greenMask
= 0x0000ff00;
227 smesa
->blueMask
= 0x000000ff;
228 smesa
->alphaMask
= 0xff000000;
229 smesa
->colorFormat
= DST_FORMAT_ARGB_8888
;
232 smesa
->redMask
= 0xf800;
233 smesa
->greenMask
= 0x07e0;
234 smesa
->blueMask
= 0x001f;
235 smesa
->alphaMask
= 0;
236 smesa
->colorFormat
= DST_FORMAT_RGB_565
;
239 sis_fatal_error("Bad bytesPerPixel %d.\n", smesa
->bytesPerPixel
);
243 ctx
->Const
.MaxTextureUnits
= 1;
244 ctx
->Const
.MaxTextureLevels
= 9;
246 ctx
->Const
.MaxTextureUnits
= 2;
247 ctx
->Const
.MaxTextureLevels
= 11;
249 ctx
->Const
.MaxTextureImageUnits
= ctx
->Const
.MaxTextureUnits
;
250 ctx
->Const
.MaxTextureCoordUnits
= ctx
->Const
.MaxTextureUnits
;
252 /* Parse configuration files */
253 driParseConfigFiles (&smesa
->optionCache
, &sisScreen
->optionCache
,
254 sisScreen
->driScreen
->myNum
, "sis");
257 SIS_DEBUG
= driParseDebugString(getenv("SIS_DEBUG"), debug_control
);
260 /* TODO: index mode */
262 smesa
->CurrentQueueLenPtr
= &(smesa
->sarea
->QueueLength
);
263 smesa
->FrameCountPtr
= &(smesa
->sarea
->FrameCount
);
266 smesa
->AGPSize
= sisScreen
->agp
.size
;
267 smesa
->AGPBase
= sisScreen
->agp
.map
;
268 smesa
->AGPAddr
= sisScreen
->agpBaseOffset
;
270 /* Create AGP command buffer */
271 if (smesa
->AGPSize
!= 0 &&
272 !driQueryOptionb(&smesa
->optionCache
, "agp_disable"))
274 smesa
->vb
= sisAllocAGP(smesa
, 64 * 1024, &smesa
->vb_agp_handle
);
275 if (smesa
->vb
!= NULL
) {
276 smesa
->using_agp
= GL_TRUE
;
277 smesa
->vb_cur
= smesa
->vb
;
278 smesa
->vb_last
= smesa
->vb
;
279 smesa
->vb_end
= smesa
->vb
+ 64 * 1024;
280 smesa
->vb_agp_offset
= ((long)smesa
->vb
- (long)smesa
->AGPBase
+
281 (long)smesa
->AGPAddr
);
284 if (!smesa
->using_agp
) {
285 smesa
->vb
= malloc(64 * 1024);
286 if (smesa
->vb
== NULL
) {
290 smesa
->vb_cur
= smesa
->vb
;
291 smesa
->vb_last
= smesa
->vb
;
292 smesa
->vb_end
= smesa
->vb
+ 64 * 1024;
295 smesa
->GlobalFlag
= 0L;
299 /* Initialize the software rasterizer and helper modules.
301 _swrast_CreateContext( ctx
);
302 _vbo_CreateContext( ctx
);
303 _tnl_CreateContext( ctx
);
304 _swsetup_CreateContext( ctx
);
306 _swrast_allow_pixel_fog( ctx
, GL_TRUE
);
307 _swrast_allow_vertex_fog( ctx
, GL_FALSE
);
308 _tnl_allow_pixel_fog( ctx
, GL_TRUE
);
309 _tnl_allow_vertex_fog( ctx
, GL_FALSE
);
311 /* XXX these should really go right after _mesa_init_driver_functions() */
313 sis6326DDInitStateFuncs( ctx
);
314 sis6326DDInitState( smesa
); /* Initializes smesa->zFormat, important */
316 sisDDInitStateFuncs( ctx
);
317 sisDDInitState( smesa
); /* Initializes smesa->zFormat, important */
318 sisDDInitStencilFuncs( ctx
);
320 sisInitTriFuncs( ctx
);
321 sisDDInitSpanFuncs( ctx
);
323 driInitExtensions( ctx
, card_extensions
, GL_FALSE
);
325 for (i
= 0; i
< SIS_MAX_TEXTURES
; i
++) {
326 smesa
->TexStates
[i
] = 0;
327 smesa
->PrevTexFormat
[i
] = 0;
330 if (driQueryOptionb(&smesa
->optionCache
, "no_rast")) {
331 fprintf(stderr
, "disabling 3D acceleration\n");
332 FALLBACK(smesa
, SIS_FALLBACK_DISABLE
, 1);
334 smesa
->texture_depth
= driQueryOptioni(&smesa
->optionCache
, "texture_depth");
340 sisDestroyContext ( __DRIcontext
*driContextPriv
)
342 sisContextPtr smesa
= (sisContextPtr
)driContextPriv
->driverPrivate
;
344 assert( smesa
!= NULL
);
346 if ( smesa
!= NULL
) {
347 _swsetup_DestroyContext( smesa
->glCtx
);
348 _tnl_DestroyContext( smesa
->glCtx
);
349 _vbo_DestroyContext( smesa
->glCtx
);
350 _swrast_DestroyContext( smesa
->glCtx
);
352 if (smesa
->using_agp
)
353 sisFreeAGP(smesa
, smesa
->vb_agp_handle
);
355 /* free the Mesa context */
356 /* XXX: Is the next line needed? The DriverCtx (smesa) reference is
357 * needed for sisDDDeleteTexture, since it needs to call the FB/AGP free
360 /* smesa->glCtx->DriverCtx = NULL; */
361 _mesa_destroy_context(smesa
->glCtx
);
368 sisMakeCurrent( __DRIcontext
*driContextPriv
,
369 __DRIdrawable
*driDrawPriv
,
370 __DRIdrawable
*driReadPriv
)
372 if ( driContextPriv
) {
373 GET_CURRENT_CONTEXT(ctx
);
374 sisContextPtr oldSisCtx
= ctx
? SIS_CONTEXT(ctx
) : NULL
;
375 sisContextPtr newSisCtx
= (sisContextPtr
) driContextPriv
->driverPrivate
;
376 struct gl_framebuffer
*drawBuffer
, *readBuffer
;
378 if ( newSisCtx
!= oldSisCtx
) {
379 newSisCtx
->GlobalFlag
= GFLAG_ALL
;
382 newSisCtx
->driDrawable
= driDrawPriv
;
384 drawBuffer
= (GLframebuffer
*)driDrawPriv
->driverPrivate
;
385 readBuffer
= (GLframebuffer
*)driReadPriv
->driverPrivate
;
387 _mesa_make_current( newSisCtx
->glCtx
, drawBuffer
, readBuffer
);
389 sisUpdateBufferSize( newSisCtx
);
390 sisUpdateClipping( newSisCtx
->glCtx
);
392 _mesa_make_current( NULL
, NULL
, NULL
);
399 sisUnbindContext( __DRIcontext
*driContextPriv
)
405 sis_update_render_state( sisContextPtr smesa
)
407 __GLSiSHardware
*prev
= &smesa
->prev
;
409 mWait3DCmdQueue (45);
411 if (smesa
->GlobalFlag
& GFLAG_ENABLESETTING
) {
412 if (!smesa
->clearTexCache
) {
413 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
);
415 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
| MASK_TextureCacheClear
);
416 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
);
417 smesa
->clearTexCache
= GL_FALSE
;
421 if (smesa
->GlobalFlag
& GFLAG_ENABLESETTING2
)
422 MMIO(REG_3D_TEnable2
, prev
->hwCapEnable2
);
425 if (smesa
->GlobalFlag
& GFLAG_ZSETTING
)
427 MMIO(REG_3D_ZSet
, prev
->hwZ
);
428 MMIO(REG_3D_ZStWriteMask
, prev
->hwZMask
);
429 MMIO(REG_3D_ZAddress
, prev
->hwOffsetZ
);
433 if (smesa
->GlobalFlag
& GFLAG_ALPHASETTING
)
434 MMIO(REG_3D_AlphaSet
, prev
->hwAlpha
);
436 if (smesa
->GlobalFlag
& GFLAG_DESTSETTING
) {
437 MMIO(REG_3D_DstSet
, prev
->hwDstSet
);
438 MMIO(REG_3D_DstAlphaWriteMask
, prev
->hwDstMask
);
439 MMIO(REG_3D_DstAddress
, prev
->hwOffsetDest
);
444 if (smesa
->GlobalFlag
& GFLAG_LINESETTING
)
445 MMIO(REG_3D_LinePattern
, prev
->hwLinePattern
);
449 if (smesa
->GlobalFlag
& GFLAG_FOGSETTING
)
451 MMIO(REG_3D_FogSet
, prev
->hwFog
);
452 MMIO(REG_3D_FogInverseDistance
, prev
->hwFogInverse
);
453 MMIO(REG_3D_FogFarDistance
, prev
->hwFogFar
);
454 MMIO(REG_3D_FogFactorDensity
, prev
->hwFogDensity
);
457 /* Stencil Setting */
458 if (smesa
->GlobalFlag
& GFLAG_STENCILSETTING
) {
459 MMIO(REG_3D_StencilSet
, prev
->hwStSetting
);
460 MMIO(REG_3D_StencilSet2
, prev
->hwStSetting2
);
463 /* Miscellaneous Setting */
464 if (smesa
->GlobalFlag
& GFLAG_DSTBLEND
)
465 MMIO(REG_3D_DstBlendMode
, prev
->hwDstSrcBlend
);
466 if (smesa
->GlobalFlag
& GFLAG_CLIPPING
) {
467 MMIO(REG_3D_ClipTopBottom
, prev
->clipTopBottom
);
468 MMIO(REG_3D_ClipLeftRight
, prev
->clipLeftRight
);
471 smesa
->GlobalFlag
&= ~GFLAG_RENDER_STATES
;
475 sis_update_texture_state (sisContextPtr smesa
)
477 __GLSiSHardware
*prev
= &smesa
->prev
;
479 mWait3DCmdQueue (55);
480 if (smesa
->clearTexCache
|| (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS
)) {
481 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
| MASK_TextureCacheClear
);
482 MMIO(REG_3D_TEnable
, prev
->hwCapEnable
);
483 smesa
->clearTexCache
= GL_FALSE
;
486 /* Texture Setting */
487 if (smesa
->GlobalFlag
& CFLAG_TEXTURERESET
)
488 MMIO(REG_3D_TextureSet
, prev
->texture
[0].hwTextureSet
);
490 if (smesa
->GlobalFlag
& GFLAG_TEXTUREMIPMAP
)
491 MMIO(REG_3D_TextureMip
, prev
->texture
[0].hwTextureMip
);
494 MMIO(REG_3D_TextureTransparencyColorHigh, prev->texture[0].hwTextureClrHigh);
495 MMIO(REG_3D_TextureTransparencyColorLow, prev->texture[0].hwTextureClrLow);
498 if (smesa
->GlobalFlag
& GFLAG_TEXBORDERCOLOR
)
499 MMIO(REG_3D_TextureBorderColor
, prev
->texture
[0].hwTextureBorderColor
);
501 if (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS
) {
502 switch ((prev
->texture
[0].hwTextureSet
& MASK_TextureLevel
) >> 8)
505 MMIO(REG_3D_TextureAddress11
, prev
->texture
[0].texOffset11
);
507 MMIO(REG_3D_TextureAddress10
, prev
->texture
[0].texOffset10
);
508 MMIO(REG_3D_TexturePitch10
, prev
->texture
[0].texPitch10
);
510 MMIO(REG_3D_TextureAddress9
, prev
->texture
[0].texOffset9
);
512 MMIO(REG_3D_TextureAddress8
, prev
->texture
[0].texOffset8
);
513 MMIO(REG_3D_TexturePitch8
, prev
->texture
[0].texPitch89
);
515 MMIO(REG_3D_TextureAddress7
, prev
->texture
[0].texOffset7
);
517 MMIO(REG_3D_TextureAddress6
, prev
->texture
[0].texOffset6
);
518 MMIO(REG_3D_TexturePitch6
, prev
->texture
[0].texPitch67
);
520 MMIO(REG_3D_TextureAddress5
, prev
->texture
[0].texOffset5
);
522 MMIO(REG_3D_TextureAddress4
, prev
->texture
[0].texOffset4
);
523 MMIO(REG_3D_TexturePitch4
, prev
->texture
[0].texPitch45
);
525 MMIO(REG_3D_TextureAddress3
, prev
->texture
[0].texOffset3
);
527 MMIO(REG_3D_TextureAddress2
, prev
->texture
[0].texOffset2
);
528 MMIO(REG_3D_TexturePitch2
, prev
->texture
[0].texPitch23
);
530 MMIO(REG_3D_TextureAddress1
, prev
->texture
[0].texOffset1
);
532 MMIO(REG_3D_TextureAddress0
, prev
->texture
[0].texOffset0
);
533 MMIO(REG_3D_TexturePitch0
, prev
->texture
[0].texPitch01
);
536 if (smesa
->GlobalFlag
& CFLAG_TEXTURERESET_1
)
537 MMIO(REG_3D_Texture1Set
, prev
->texture
[1].hwTextureSet
);
538 if (smesa
->GlobalFlag
& GFLAG_TEXTUREMIPMAP_1
)
539 MMIO(REG_3D_Texture1Mip
, prev
->texture
[1].hwTextureMip
);
541 if (smesa
->GlobalFlag
& GFLAG_TEXBORDERCOLOR_1
) {
542 MMIO(REG_3D_Texture1BorderColor
,
543 prev
->texture
[1].hwTextureBorderColor
);
545 if (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS_1
) {
546 switch ((prev
->texture
[1].hwTextureSet
& MASK_TextureLevel
) >> 8)
549 MMIO(REG_3D_Texture1Address11
, prev
->texture
[1].texOffset11
);
551 MMIO(REG_3D_Texture1Address10
, prev
->texture
[1].texOffset10
);
552 MMIO(REG_3D_Texture1Pitch10
, prev
->texture
[1].texPitch10
);
554 MMIO(REG_3D_Texture1Address9
, prev
->texture
[1].texOffset9
);
556 MMIO(REG_3D_Texture1Address8
, prev
->texture
[1].texOffset8
);
557 MMIO(REG_3D_Texture1Pitch8
, prev
->texture
[1].texPitch89
);
559 MMIO(REG_3D_Texture1Address7
, prev
->texture
[1].texOffset7
);
561 MMIO(REG_3D_Texture1Address6
, prev
->texture
[1].texOffset6
);
562 MMIO(REG_3D_Texture1Pitch6
, prev
->texture
[1].texPitch67
);
564 MMIO(REG_3D_Texture1Address5
, prev
->texture
[1].texOffset5
);
566 MMIO(REG_3D_Texture1Address4
, prev
->texture
[1].texOffset4
);
567 MMIO(REG_3D_Texture1Pitch4
, prev
->texture
[1].texPitch45
);
569 MMIO(REG_3D_Texture1Address3
, prev
->texture
[1].texOffset3
);
571 MMIO(REG_3D_Texture1Address2
, prev
->texture
[1].texOffset2
);
572 MMIO(REG_3D_Texture1Pitch2
, prev
->texture
[1].texPitch23
);
574 MMIO(REG_3D_Texture1Address1
, prev
->texture
[1].texOffset1
);
576 MMIO(REG_3D_Texture1Address0
, prev
->texture
[1].texOffset0
);
577 MMIO(REG_3D_Texture1Pitch0
, prev
->texture
[1].texPitch01
);
581 /* texture environment */
582 if (smesa
->GlobalFlag
& GFLAG_TEXTUREENV
) {
583 MMIO(REG_3D_TextureBlendFactor
, prev
->hwTexEnvColor
);
584 MMIO(REG_3D_TextureColorBlendSet0
, prev
->hwTexBlendColor0
);
585 MMIO(REG_3D_TextureAlphaBlendSet0
, prev
->hwTexBlendAlpha0
);
587 if (smesa
->GlobalFlag
& GFLAG_TEXTUREENV_1
) {
588 MMIO(REG_3D_TextureBlendFactor
, prev
->hwTexEnvColor
);
589 MMIO(REG_3D_TextureColorBlendSet1
, prev
->hwTexBlendColor1
);
590 MMIO(REG_3D_TextureAlphaBlendSet1
, prev
->hwTexBlendAlpha1
);
593 smesa
->GlobalFlag
&= ~GFLAG_TEXTURE_STATES
;
597 sis6326_update_render_state( sisContextPtr smesa
)
599 __GLSiSHardware
*prev
= &smesa
->prev
;
601 mWait3DCmdQueue (45);
603 if (smesa
->GlobalFlag
& GFLAG_ENABLESETTING
) {
604 if (!smesa
->clearTexCache
) {
605 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
);
607 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
& ~S_ENABLE_TextureCache
);
608 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
);
609 smesa
->clearTexCache
= GL_FALSE
;
614 if (smesa
->GlobalFlag
& GFLAG_ZSETTING
) {
615 MMIO(REG_6326_3D_ZSet
, prev
->hwZ
);
616 MMIO(REG_6326_3D_ZAddress
, prev
->hwOffsetZ
);
620 if (smesa
->GlobalFlag
& GFLAG_ALPHASETTING
)
621 MMIO(REG_6326_3D_AlphaSet
, prev
->hwAlpha
);
623 if (smesa
->GlobalFlag
& GFLAG_DESTSETTING
) {
624 MMIO(REG_6326_3D_DstSet
, prev
->hwDstSet
);
625 MMIO(REG_6326_3D_DstAddress
, prev
->hwOffsetDest
);
629 if (smesa
->GlobalFlag
& GFLAG_FOGSETTING
) {
630 MMIO(REG_6326_3D_FogSet
, prev
->hwFog
);
633 /* Miscellaneous Setting */
634 if (smesa
->GlobalFlag
& GFLAG_DSTBLEND
)
635 MMIO(REG_6326_3D_DstSrcBlendMode
, prev
->hwDstSrcBlend
);
637 if (smesa
->GlobalFlag
& GFLAG_CLIPPING
) {
638 MMIO(REG_6326_3D_ClipTopBottom
, prev
->clipTopBottom
);
639 MMIO(REG_6326_3D_ClipLeftRight
, prev
->clipLeftRight
);
642 smesa
->GlobalFlag
&= ~GFLAG_RENDER_STATES
;
646 sis6326_update_texture_state (sisContextPtr smesa
)
648 __GLSiSHardware
*prev
= &smesa
->prev
;
650 mWait3DCmdQueue (55);
651 if (smesa
->clearTexCache
|| (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS
)) {
652 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
& ~S_ENABLE_TextureCache
);
653 MMIO(REG_6326_3D_TEnable
, prev
->hwCapEnable
);
654 smesa
->clearTexCache
= GL_FALSE
;
657 /* Texture Setting */
658 if (smesa
->GlobalFlag
& CFLAG_TEXTURERESET
)
659 MMIO(REG_6326_3D_TextureSet
, prev
->texture
[0].hwTextureSet
);
661 if (smesa
->GlobalFlag
& GFLAG_TEXTUREMIPMAP
)
662 MMIO(REG_6326_3D_TextureWidthHeight
, prev
->texture
[0].hwTexWidthHeight
);
665 MMIO(REG_3D_TextureTransparencyColorHigh, prev->texture[0].hwTextureClrHigh);
666 MMIO(REG_3D_TextureTransparencyColorLow, prev->texture[0].hwTextureClrLow);
669 if (smesa
->GlobalFlag
& GFLAG_TEXBORDERCOLOR
)
670 MMIO(REG_6326_3D_TextureBorderColor
, prev
->texture
[0].hwTextureBorderColor
);
672 if (smesa
->GlobalFlag
& GFLAG_TEXTUREADDRESS
) {
673 switch ((prev
->texture
[0].hwTextureSet
& MASK_6326_TextureLevel
) >> 8)
676 MMIO(REG_6326_3D_TextureAddress9
, prev
->texture
[0].texOffset9
);
679 MMIO(REG_6326_3D_TextureAddress8
, prev
->texture
[0].texOffset8
);
680 MMIO(REG_6326_3D_TexturePitch89
, prev
->texture
[0].texPitch89
);
683 MMIO(REG_6326_3D_TextureAddress7
, prev
->texture
[0].texOffset7
);
686 MMIO(REG_6326_3D_TextureAddress6
, prev
->texture
[0].texOffset6
);
687 MMIO(REG_6326_3D_TexturePitch67
, prev
->texture
[0].texPitch67
);
690 MMIO(REG_6326_3D_TextureAddress5
, prev
->texture
[0].texOffset5
);
693 MMIO(REG_6326_3D_TextureAddress4
, prev
->texture
[0].texOffset4
);
694 MMIO(REG_6326_3D_TexturePitch45
, prev
->texture
[0].texPitch45
);
697 MMIO(REG_6326_3D_TextureAddress3
, prev
->texture
[0].texOffset3
);
700 MMIO(REG_6326_3D_TextureAddress2
, prev
->texture
[0].texOffset2
);
701 MMIO(REG_6326_3D_TexturePitch23
, prev
->texture
[0].texPitch23
);
704 MMIO(REG_6326_3D_TextureAddress1
, prev
->texture
[0].texOffset1
);
707 MMIO(REG_6326_3D_TextureAddress0
, prev
->texture
[0].texOffset0
);
708 MMIO(REG_6326_3D_TexturePitch01
, prev
->texture
[0].texPitch01
);
713 /* texture environment */
714 if (smesa
->GlobalFlag
& GFLAG_TEXTUREENV
) {
715 MMIO(REG_6326_3D_TextureBlendSet
, prev
->hwTexBlendSet
);
718 smesa
->GlobalFlag
&= ~GFLAG_TEXTURE_STATES
;