2 * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
3 * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sub license,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
36 #include "via_context.h"
37 #include "via_state.h"
41 #include "via_ioctl.h"
43 #include "swrast/swrast.h"
44 #include "array_cache/acache.h"
46 #include "swrast_setup/swrast_setup.h"
48 #include "tnl/t_pipeline.h"
51 static GLuint ROP
[16] = {
52 HC_HROP_BLACK
, /* GL_CLEAR 0 */
53 HC_HROP_DPa
, /* GL_AND s & d */
54 HC_HROP_PDna
, /* GL_AND_REVERSE s & ~d */
55 HC_HROP_P
, /* GL_COPY s */
56 HC_HROP_DPna
, /* GL_AND_INVERTED ~s & d */
57 HC_HROP_D
, /* GL_NOOP d */
58 HC_HROP_DPx
, /* GL_XOR s ^ d */
59 HC_HROP_DPo
, /* GL_OR s | d */
60 HC_HROP_DPon
, /* GL_NOR ~(s | d) */
61 HC_HROP_DPxn
, /* GL_EQUIV ~(s ^ d) */
62 HC_HROP_Dn
, /* GL_INVERT ~d */
63 HC_HROP_PDno
, /* GL_OR_REVERSE s | ~d */
64 HC_HROP_Pn
, /* GL_COPY_INVERTED ~s */
65 HC_HROP_DPno
, /* GL_OR_INVERTED ~s | d */
66 HC_HROP_DPan
, /* GL_NAND ~(s & d) */
67 HC_HROP_WHITE
/* GL_SET 1 */
70 static __inline__ GLuint
viaPackColor(GLuint format
,
76 return PACK_COLOR_565(r
, g
, b
);
78 return PACK_COLOR_8888(a
, r
, g
, b
);
81 if (VIA_DEBUG
) fprintf(stderr
, "unknown format %d\n", (int)format
);
83 return PACK_COLOR_8888(a
, r
, g
, b
);
87 static void viaAlphaFunc(GLcontext
*ctx
, GLenum func
, GLfloat ref
)
89 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
93 static void viaBlendEquationSeparate(GLcontext
*ctx
, GLenum rgbMode
, GLenum aMode
)
96 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
99 /* GL_EXT_blend_equation_separate not supported */
100 ASSERT(rgbMode
== aMode
);
102 /* Can only do GL_ADD equation in hardware */
103 FALLBACK(VIA_CONTEXT(ctx
), VIA_FALLBACK_BLEND_EQ
, rgbMode
!= GL_FUNC_ADD_EXT
);
105 /* BlendEquation sets ColorLogicOpEnabled in an unexpected
108 FALLBACK(VIA_CONTEXT(ctx
), VIA_FALLBACK_LOGICOP
,
109 (ctx
->Color
.ColorLogicOpEnabled
&&
110 ctx
->Color
.LogicOp
!= GL_COPY
));
112 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
116 static void viaBlendFunc(GLcontext
*ctx
, GLenum sfactor
, GLenum dfactor
)
118 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
119 GLboolean fallback
= GL_FALSE
;
121 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
123 switch (ctx
->Color
.BlendSrcRGB
) {
125 case GL_SRC_ALPHA
: break;
127 case GL_DST_COLOR
: break;
128 case GL_ONE_MINUS_DST_COLOR
: break;
129 case GL_ONE_MINUS_SRC_ALPHA
: break;
130 case GL_DST_ALPHA
: break;
131 case GL_ONE_MINUS_DST_ALPHA
: break;
132 case GL_SRC_ALPHA_SATURATE
: /*a |= SDM_SRC_SRC_ALPHA; break;*/
133 case GL_CONSTANT_COLOR
:
134 case GL_ONE_MINUS_CONSTANT_COLOR
:
135 case GL_CONSTANT_ALPHA
:
136 case GL_ONE_MINUS_CONSTANT_ALPHA
:
143 switch (ctx
->Color
.BlendDstRGB
) {
144 case GL_SRC_ALPHA
: break;
145 case GL_ONE_MINUS_SRC_ALPHA
: break;
148 case GL_SRC_COLOR
: break;
149 case GL_ONE_MINUS_SRC_COLOR
: break;
150 case GL_DST_ALPHA
: break;
151 case GL_ONE_MINUS_DST_ALPHA
: break;
152 case GL_CONSTANT_COLOR
:
153 case GL_ONE_MINUS_CONSTANT_COLOR
:
154 case GL_CONSTANT_ALPHA
:
155 case GL_ONE_MINUS_CONSTANT_ALPHA
:
162 FALLBACK(vmesa
, VIA_FALLBACK_BLEND_FUNC
, fallback
);
164 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
168 /* Shouldn't be called as the extension is disabled.
170 static void viaBlendFuncSeparate(GLcontext
*ctx
, GLenum sfactorRGB
,
171 GLenum dfactorRGB
, GLenum sfactorA
,
174 if (dfactorRGB
!= dfactorA
|| sfactorRGB
!= sfactorA
) {
175 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glBlendEquation (disabled)");
178 viaBlendFunc(ctx
, sfactorRGB
, dfactorRGB
);
182 static void viaDepthFunc(GLcontext
*ctx
, GLenum func
)
184 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
188 static void viaDepthMask(GLcontext
*ctx
, GLboolean flag
)
190 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
194 static void viaPolygonStipple(GLcontext
*ctx
, const GLubyte
*mask
)
196 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
201 /* =============================================================
204 static void viaScissor(GLcontext
*ctx
, GLint x
, GLint y
,
205 GLsizei w
, GLsizei h
)
207 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
209 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
211 if (ctx
->Scissor
.Enabled
) {
212 VIA_FIREVERTICES(vmesa
); /* don't pipeline cliprect changes */
213 vmesa
->uploadCliprects
= GL_TRUE
;
216 vmesa
->scissorRect
.x1
= x
;
217 vmesa
->scissorRect
.y1
= vmesa
->driDrawable
->h
- (y
+ h
);
218 vmesa
->scissorRect
.x2
= x
+ w
;
219 vmesa
->scissorRect
.y2
= vmesa
->driDrawable
->h
- y
;
221 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
226 static void viaLogicOp(GLcontext
*ctx
, GLenum opcode
)
229 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
230 if (VIA_DEBUG
) fprintf(stderr
, "opcode = %x\n", opcode
);
231 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
235 /* Fallback to swrast for select and feedback.
237 static void viaRenderMode(GLcontext
*ctx
, GLenum mode
)
239 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
241 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
243 FALLBACK(vmesa
, VIA_FALLBACK_RENDERMODE
, (mode
!= GL_RENDER
));
245 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
250 static void viaDrawBuffer(GLcontext
*ctx
, GLenum mode
)
252 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
254 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
256 if (mode
== GL_FRONT
) {
257 VIA_FIREVERTICES(vmesa
);
258 VIA_STATECHANGE(vmesa
, VIA_UPLOAD_BUFFERS
);
259 vmesa
->drawMap
= (char *)vmesa
->driScreen
->pFB
;
260 vmesa
->readMap
= (char *)vmesa
->driScreen
->pFB
;
261 vmesa
->drawPitch
= vmesa
->front
.pitch
;
262 vmesa
->readPitch
= vmesa
->front
.pitch
;
263 viaXMesaSetFrontClipRects(vmesa
);
264 FALLBACK(vmesa
, VIA_FALLBACK_DRAW_BUFFER
, GL_FALSE
);
267 else if (mode
== GL_BACK
) {
268 VIA_FIREVERTICES(vmesa
);
269 VIA_STATECHANGE(vmesa
, VIA_UPLOAD_BUFFERS
);
270 vmesa
->drawMap
= vmesa
->back
.map
;
271 vmesa
->readMap
= vmesa
->back
.map
;
272 vmesa
->drawPitch
= vmesa
->back
.pitch
;
273 vmesa
->readPitch
= vmesa
->back
.pitch
;
274 viaXMesaSetBackClipRects(vmesa
);
275 FALLBACK(vmesa
, VIA_FALLBACK_DRAW_BUFFER
, GL_FALSE
);
279 FALLBACK(vmesa
, VIA_FALLBACK_DRAW_BUFFER
, GL_TRUE
);
283 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
287 static void viaClearColor(GLcontext
*ctx
, const GLfloat color
[4])
289 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
291 pcolor
[0] = (GLubyte
) (255 * color
[0]);
292 pcolor
[1] = (GLubyte
) (255 * color
[1]);
293 pcolor
[2] = (GLubyte
) (255 * color
[2]);
294 pcolor
[3] = (GLubyte
) (255 * color
[3]);
295 vmesa
->ClearColor
= viaPackColor(vmesa
->viaScreen
->bitsPerPixel
,
296 pcolor
[0], pcolor
[1],
297 pcolor
[2], pcolor
[3]);
301 /* =============================================================
302 * Culling - the via isn't quite as clean here as the rest of
303 * its interfaces, but it's not bad.
305 static void viaCullFaceFrontFace(GLcontext
*ctx
, GLenum unused
)
307 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
311 static void viaLineWidth(GLcontext
*ctx
, GLfloat widthf
)
313 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
317 static void viaPointSize(GLcontext
*ctx
, GLfloat sz
)
319 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
323 static void viaBitmap( GLcontext
*ctx
, GLint px
, GLint py
,
324 GLsizei width
, GLsizei height
,
325 const struct gl_pixelstore_attrib
*unpack
,
326 const GLubyte
*bitmap
)
328 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
330 /*=* [DBG] csmash : fix background overlap option menu *=*/
331 LOCK_HARDWARE(vmesa
);
332 viaFlushPrimsLocked(vmesa
);
333 UNLOCK_HARDWARE(vmesa
);
336 /*=* [DBG] csmash : fix segmentation fault *=*/
337 /*=* John Sheng [2003.7.18] texenv *=*/
338 /*if (!vmesa->drawMap && !vmesa->readMap) {*/
340 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
341 viaDrawBuffer(ctx
, GL_BACK
);
344 viaDrawBuffer(ctx
, GL_FRONT
);
347 /*=* [DBG] csmash : white option words become brown *=*/
348 /*_swrast_Bitmap(ctx, px, py, width, height, unpack, bitmap );*/
351 fog
= ctx
->Fog
.Enabled
;
352 ctx
->Fog
.Enabled
= GL_FALSE
;
353 _swrast_Bitmap(ctx
, px
, py
, width
, height
, unpack
, bitmap
);
354 ctx
->Fog
.Enabled
= fog
;
358 /* =============================================================
361 static void viaColorMask(GLcontext
*ctx
,
362 GLboolean r
, GLboolean g
,
363 GLboolean b
, GLboolean a
)
365 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
369 /* Seperate specular not fully implemented on the via.
371 static void viaLightModelfv(GLcontext
*ctx
, GLenum pname
,
372 const GLfloat
*param
)
374 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
379 /* In Mesa 3.5 we can reliably do native flatshading.
381 static void viaShadeModel(GLcontext
*ctx
, GLenum mode
)
383 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
387 /* =============================================================
390 static void viaFogfv(GLcontext
*ctx
, GLenum pname
, const GLfloat
*param
)
392 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
396 /* =============================================================
398 static void viaEnable(GLcontext
*ctx
, GLenum cap
, GLboolean state
)
400 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
404 /* =============================================================
406 void viaEmitDrawingRectangle(viaContextPtr vmesa
)
408 __DRIdrawablePrivate
*dPriv
= vmesa
->driDrawable
;
409 viaScreenPrivate
*viaScreen
= vmesa
->viaScreen
;
410 int x0
= vmesa
->drawX
;
411 int y0
= vmesa
->drawY
;
412 int x1
= x0
+ dPriv
->w
;
413 int y1
= y0
+ dPriv
->h
;
414 /* GLuint dr2, dr3, dr4;
417 /* Coordinate origin of the window - may be offscreen.
419 /* dr4 = vmesa->BufferSetup[VIA_DESTREG_DR4] = ((y0 << 16) |
420 (((unsigned)x0) & 0xFFFF));
427 if (x1
> viaScreen
->width
- 1) x1
= viaScreen
->width
- 1;
428 if (y1
> viaScreen
->height
- 1) y1
= viaScreen
->height
- 1;
430 /* Onscreen drawing rectangle.
432 /* dr2 = vmesa->BufferSetup[VIA_DESTREG_DR2] = ((y0 << 16) | x0);
433 dr3 = vmesa->BufferSetup[VIA_DESTREG_DR3] = (((y1 + 1) << 16) | (x1 + 1));
436 vmesa
->dirty
|= VIA_UPLOAD_BUFFERS
;
440 void viaCalcViewport(GLcontext
*ctx
)
442 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
443 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
444 GLfloat
*m
= vmesa
->ViewportMatrix
.m
;
446 /* See also via_translate_vertex. SUBPIXEL adjustments can be done
447 * via state vars, too.
449 m
[MAT_SX
] = v
[MAT_SX
];
450 m
[MAT_TX
] = v
[MAT_TX
] + vmesa
->drawXoff
;
451 m
[MAT_SY
] = - v
[MAT_SY
];
452 m
[MAT_TY
] = - v
[MAT_TY
] + vmesa
->driDrawable
->h
;
453 /*=* John Sheng [2003.7.2] for visual config & viewperf drv-08 *=*/
454 if (vmesa
->depth
.bpp
== 16) {
455 m
[MAT_SZ
] = v
[MAT_SZ
] * (1.0 / 0xffff);
456 m
[MAT_TZ
] = v
[MAT_TZ
] * (1.0 / 0xffff);
459 m
[MAT_SZ
] = v
[MAT_SZ
] * (1.0 / 0xffffffff);
460 m
[MAT_TZ
] = v
[MAT_TZ
] * (1.0 / 0xffffffff);
464 static void viaViewport(GLcontext
*ctx
,
466 GLsizei width
, GLsizei height
)
468 /* update size of Mesa/software ancillary buffers */
469 _mesa_ResizeBuffersMESA();
470 viaCalcViewport(ctx
);
473 static void viaDepthRange(GLcontext
*ctx
,
474 GLclampd nearval
, GLclampd farval
)
476 viaCalcViewport(ctx
);
479 void viaPrintDirty(const char *msg
, GLuint state
)
483 fprintf(stderr
, "%s (0x%x): %s%s%s%s\n",
485 (unsigned int) state
,
486 (state
& VIA_UPLOAD_TEX0
) ? "upload-tex0, " : "",
487 (state
& VIA_UPLOAD_TEX1
) ? "upload-tex1, " : "",
488 (state
& VIA_UPLOAD_CTX
) ? "upload-ctx, " : "",
489 (state
& VIA_UPLOAD_BUFFERS
) ? "upload-bufs, " : ""
495 void viaInitState(GLcontext
*ctx
)
497 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
499 vmesa
->regCmdA
= HC_ACMD_HCmdA
;
500 vmesa
->regCmdB
= HC_ACMD_HCmdB
| HC_HVPMSK_X
| HC_HVPMSK_Y
| HC_HVPMSK_Z
;
501 vmesa
->regEnable
= HC_HenCW_MASK
;
503 if (vmesa
->glCtx
->Color
._DrawDestMask
[0] == __GL_BACK_BUFFER_MASK
) {
504 vmesa
->drawMap
= vmesa
->back
.map
;
505 vmesa
->readMap
= vmesa
->back
.map
;
508 vmesa
->drawMap
= (char *)vmesa
->driScreen
->pFB
;
509 vmesa
->readMap
= (char *)vmesa
->driScreen
->pFB
;
514 * Convert S and T texture coordinate wrap modes to hardware bits.
517 get_wrap_mode( GLenum sWrap
, GLenum tWrap
)
524 v
|= HC_HTXnMPMD_Srepeat
;
527 case GL_CLAMP_TO_EDGE
:
528 v
|= HC_HTXnMPMD_Sclamp
;
530 case GL_MIRRORED_REPEAT
:
531 v
|= HC_HTXnMPMD_Smirror
;
537 v
|= HC_HTXnMPMD_Trepeat
;
540 case GL_CLAMP_TO_EDGE
:
541 v
|= HC_HTXnMPMD_Tclamp
;
543 case GL_MIRRORED_REPEAT
:
544 v
|= HC_HTXnMPMD_Tmirror
;
552 void viaChooseTextureState(GLcontext
*ctx
)
554 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
555 struct gl_texture_unit
*texUnit0
= &ctx
->Texture
.Unit
[0];
556 struct gl_texture_unit
*texUnit1
= &ctx
->Texture
.Unit
[1];
557 /*=* John Sheng [2003.7.18] texture combine *=*/
560 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
562 if (texUnit0
->_ReallyEnabled
|| texUnit1
->_ReallyEnabled
) {
565 fprintf(stderr
, "Texture._ReallyEnabled - in\n");
566 fprintf(stderr
, "texUnit0->_ReallyEnabled = %x\n",texUnit0
->_ReallyEnabled
);
572 struct gl_texture_object
*texObj0
= texUnit0
->_Current
;
573 struct gl_texture_object
*texObj1
= texUnit1
->_Current
;
575 fprintf(stderr
, "env mode: 0x%04x / 0x%04x\n", texUnit0
->EnvMode
, texUnit1
->EnvMode
);
577 if ( (texObj0
!= NULL
) && (texObj0
->Image
[0][0] != NULL
) )
578 fprintf(stderr
, "format 0: 0x%04x\n", texObj0
->Image
[0][0]->Format
);
580 if ( (texObj1
!= NULL
) && (texObj1
->Image
[0][0] != NULL
) )
581 fprintf(stderr
, "format 1: 0x%04x\n", texObj1
->Image
[0][0]->Format
);
586 if (texUnit0
->_ReallyEnabled
) {
587 struct gl_texture_object
*texObj
= texUnit0
->_Current
;
588 struct gl_texture_image
*texImage
= texObj
->Image
[0][0];
591 if (VIA_DEBUG
) fprintf(stderr
, "texUnit0->_ReallyEnabled\n");
593 if (texImage
->Border
) {
594 FALLBACK(vmesa
, VIA_FALLBACK_TEXTURE
, GL_TRUE
);
597 vmesa
->regCmdB
|= HC_HVPMSK_S
| HC_HVPMSK_T
| HC_HVPMSK_W
| HC_HVPMSK_Cs
;
598 vmesa
->regEnable
|= HC_HenTXMP_MASK
| HC_HenTXCH_MASK
| HC_HenTXPP_MASK
;
600 switch (texObj
->MinFilter
) {
602 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Nearest
|
606 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Linear
|
609 case GL_NEAREST_MIPMAP_NEAREST
:
610 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Nearest
|
612 vmesa
->regHTXnTB_0
|= HC_HTXnFLDs_Nearest
;
614 case GL_LINEAR_MIPMAP_NEAREST
:
615 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Linear
|
617 vmesa
->regHTXnTB_0
|= HC_HTXnFLDs_Nearest
;
619 case GL_NEAREST_MIPMAP_LINEAR
:
620 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Nearest
|
622 vmesa
->regHTXnTB_0
|= HC_HTXnFLDs_Linear
;
624 case GL_LINEAR_MIPMAP_LINEAR
:
625 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Linear
|
627 vmesa
->regHTXnTB_0
|= HC_HTXnFLDs_Linear
;
633 if (texObj
->MagFilter
) {
634 vmesa
->regHTXnTB_0
|= HC_HTXnFLSe_Linear
|
638 vmesa
->regHTXnTB_0
|= HC_HTXnFLSe_Nearest
|
642 vmesa
->regHTXnMPMD_0
&= ~(HC_HTXnMPMD_SMASK
| HC_HTXnMPMD_TMASK
);
643 vmesa
->regHTXnMPMD_0
|= get_wrap_mode( texObj
->WrapS
,
647 if (VIA_DEBUG
) fprintf(stderr
, "texUnit0->EnvMode %x\n",texUnit0
->EnvMode
);
650 viaTexCombineState( vmesa
, texUnit0
->_CurrentCombine
, 0 );
653 /* Should turn Cs off if actually no Cs */
656 if (texUnit1
->_ReallyEnabled
) {
657 struct gl_texture_object
*texObj
= texUnit1
->_Current
;
658 struct gl_texture_image
*texImage
= texObj
->Image
[0][0];
660 if (texImage
->Border
) {
661 FALLBACK(vmesa
, VIA_FALLBACK_TEXTURE
, GL_TRUE
);
665 switch (texObj
->MinFilter
) {
667 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Nearest
|
671 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Linear
|
674 case GL_NEAREST_MIPMAP_NEAREST
:
675 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Nearest
|
677 vmesa
->regHTXnTB_1
|= HC_HTXnFLDs_Nearest
;
679 case GL_LINEAR_MIPMAP_NEAREST
:
680 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Linear
|
682 vmesa
->regHTXnTB_1
|= HC_HTXnFLDs_Nearest
;
684 case GL_NEAREST_MIPMAP_LINEAR
:
685 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Nearest
|
687 vmesa
->regHTXnTB_1
|= HC_HTXnFLDs_Linear
;
689 case GL_LINEAR_MIPMAP_LINEAR
:
690 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Linear
|
692 vmesa
->regHTXnTB_1
|= HC_HTXnFLDs_Linear
;
698 switch(texObj
->MagFilter
) {
700 vmesa
->regHTXnTB_1
|= HC_HTXnFLSs_Nearest
|
704 vmesa
->regHTXnTB_1
|= HC_HTXnFLSs_Linear
|
709 vmesa
->regHTXnMPMD_1
&= ~(HC_HTXnMPMD_SMASK
| HC_HTXnMPMD_TMASK
);
710 vmesa
->regHTXnMPMD_1
|= get_wrap_mode( texObj
->WrapS
,
713 viaTexCombineState( vmesa
, texUnit1
->_CurrentCombine
, 1 );
715 vmesa
->dirty
|= VIA_UPLOAD_TEXTURE
;
719 fprintf( stderr
, "Csat_0 / Cop_0 = 0x%08x / 0x%08x\n",
720 vmesa
->regHTXnTBLCsat_0
, vmesa
->regHTXnTBLCop_0
);
721 fprintf( stderr
, "Asat_0 = 0x%08x\n",
722 vmesa
->regHTXnTBLAsat_0
);
723 fprintf( stderr
, "RCb_0 / RAa_0 = 0x%08x / 0x%08x\n",
724 vmesa
->regHTXnTBLRCb_0
, vmesa
->regHTXnTBLRAa_0
);
725 fprintf( stderr
, "RCa_0 / RCc_0 = 0x%08x / 0x%08x\n",
726 vmesa
->regHTXnTBLRCa_0
, vmesa
->regHTXnTBLRCc_0
);
727 fprintf( stderr
, "RCbias_0 = 0x%08x\n",
728 vmesa
->regHTXnTBLRCbias_0
);
733 if (ctx
->Fog
.Enabled
)
734 vmesa
->regCmdB
&= (~(HC_HVPMSK_S
| HC_HVPMSK_T
));
736 vmesa
->regCmdB
&= (~(HC_HVPMSK_S
| HC_HVPMSK_T
| HC_HVPMSK_W
));
737 vmesa
->regEnable
&= (~(HC_HenTXMP_MASK
| HC_HenTXCH_MASK
| HC_HenTXPP_MASK
));
738 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
741 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
746 void viaChooseColorState(GLcontext
*ctx
)
748 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
749 GLenum s
= ctx
->Color
.BlendSrcRGB
;
750 GLenum d
= ctx
->Color
.BlendDstRGB
;
752 /* The HW's blending equation is:
753 * (Ca * FCa + Cbias + Cb * FCb) << Cshift
756 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
759 if (ctx
->Color
.BlendEnabled
) {
760 vmesa
->regEnable
|= HC_HenABL_MASK
;
761 /* Ca -- always from source color.
763 vmesa
->regHABLCsat
= HC_HABLCsat_MASK
| HC_HABLCa_OPC
|
765 /* Aa -- always from source alpha.
767 vmesa
->regHABLAsat
= HC_HABLAsat_MASK
| HC_HABLAa_OPA
|
769 /* FCa -- depend on following condition.
770 * FAa -- depend on following condition.
776 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_HABLRCa
;
777 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_HABLFRA
;
778 vmesa
->regHABLRFCa
= 0x0;
779 vmesa
->regHABLRAa
= 0x0;
784 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_HABLRCa
;
785 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_HABLFRA
;
786 vmesa
->regHABLRFCa
= 0x0;
787 vmesa
->regHABLRAa
= 0x0;
792 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_Csrc
;
793 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_Asrc
;
795 case GL_ONE_MINUS_SRC_COLOR
:
796 /* (1, 1, 1, 1) - (Rs, Gs, Bs, As)
798 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_Csrc
;
799 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_Asrc
;
804 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_Cdst
;
805 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_Adst
;
807 case GL_ONE_MINUS_DST_COLOR
:
808 /* (1, 1, 1, 1) - (Rd, Gd, Bd, Ad)
810 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_Cdst
;
811 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_Adst
;
816 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_Asrc
;
817 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_Asrc
;
819 case GL_ONE_MINUS_SRC_ALPHA
:
820 /* (1, 1, 1, 1) - (As, As, As, As)
822 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_Asrc
;
823 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_Asrc
;
827 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
830 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_HABLRCa
;
831 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_HABLFRA
;
832 vmesa
->regHABLRFCa
= 0x0;
833 vmesa
->regHABLRAa
= 0x0;
838 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_Adst
;
839 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_Adst
;
843 case GL_ONE_MINUS_DST_ALPHA
:
845 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
846 /* (1, 1, 1, 1) - (1, 1, 1, 1) = (0, 0, 0, 0)
848 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_HABLRCa
;
849 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_HABLFRA
;
850 vmesa
->regHABLRFCa
= 0x0;
851 vmesa
->regHABLRAa
= 0x0;
854 /* (1, 1, 1, 1) - (Ad, Ad, Ad, Ad)
856 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_Adst
;
857 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_Adst
;
861 case GL_SRC_ALPHA_SATURATE
:
863 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
864 /* (f, f, f, 1), f = min(As, 1 - Ad) = min(As, 1 - 1) = 0
865 * So (f, f, f, 1) = (0, 0, 0, 1)
867 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_HABLRCa
;
868 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_HABLFRA
;
869 vmesa
->regHABLRFCa
= 0x0;
870 vmesa
->regHABLRAa
= 0x0;
873 /* (f, f, f, 1), f = min(As, 1 - Ad)
875 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_mimAsrcInvAdst
;
876 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_HABLFRA
;
877 vmesa
->regHABLRFCa
= 0x0;
878 vmesa
->regHABLRAa
= 0x0;
889 vmesa
->regHABLCsat
|= HC_HABLCbias_HABLRCbias
;
890 vmesa
->regHABLAsat
|= HC_HABLAbias_HABLRAbias
;
892 /* Cb -- always from destination color.
894 vmesa
->regHABLCop
= HC_HABLCb_OPC
| HC_HABLCb_Cdst
;
895 /* Ab -- always from destination alpha.
897 vmesa
->regHABLAop
= HC_HABLAb_OPA
| HC_HABLAb_Adst
;
898 /* FCb -- depend on following condition.
904 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_HABLRCb
;
905 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_HABLFRA
;
906 vmesa
->regHABLRFCb
= 0x0;
907 vmesa
->regHABLRAb
= 0x0;
912 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_HABLRCb
;
913 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_HABLFRA
;
914 vmesa
->regHABLRFCb
= 0x0;
915 vmesa
->regHABLRAb
= 0x0;
920 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_Csrc
;
921 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_Asrc
;
923 case GL_ONE_MINUS_SRC_COLOR
:
924 /* (1, 1, 1, 1) - (Rs, Gs, Bs, As)
926 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_Csrc
;
927 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_Asrc
;
932 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_Cdst
;
933 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_Adst
;
935 case GL_ONE_MINUS_DST_COLOR
:
936 /* (1, 1, 1, 1) - (Rd, Gd, Bd, Ad)
938 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_Cdst
;
939 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_Adst
;
944 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_Asrc
;
945 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_Asrc
;
947 case GL_ONE_MINUS_SRC_ALPHA
:
948 /* (1, 1, 1, 1) - (As, As, As, As)
950 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_Asrc
;
951 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_Asrc
;
955 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
958 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_HABLRCb
;
959 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_HABLFRA
;
960 vmesa
->regHABLRFCb
= 0x0;
961 vmesa
->regHABLRAb
= 0x0;
966 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_Adst
;
967 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_Adst
;
971 case GL_ONE_MINUS_DST_ALPHA
:
973 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
974 /* (1, 1, 1, 1) - (1, 1, 1, 1) = (0, 0, 0, 0)
976 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_HABLRCb
;
977 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_HABLFRA
;
978 vmesa
->regHABLRFCb
= 0x0;
979 vmesa
->regHABLRAb
= 0x0;
982 /* (1, 1, 1, 1) - (Ad, Ad, Ad, Ad)
984 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_Adst
;
985 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_Adst
;
990 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_HABLRCb
;
991 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_HABLFRA
;
992 vmesa
->regHABLRFCb
= 0x0;
993 vmesa
->regHABLRAb
= 0x0;
997 if (vmesa
->viaScreen
->bitsPerPixel
<= 16)
998 vmesa
->regEnable
&= ~HC_HenDT_MASK
;
1000 vmesa
->dirty
|= (VIA_UPLOAD_BLEND
| VIA_UPLOAD_ENABLE
);
1003 vmesa
->regEnable
&= (~HC_HenABL_MASK
);
1004 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
1007 if (ctx
->Color
.AlphaEnabled
) {
1008 vmesa
->regEnable
|= HC_HenAT_MASK
;
1009 vmesa
->regHATMD
= (((GLchan
)ctx
->Color
.AlphaRef
) & 0xFF) |
1010 ((ctx
->Color
.AlphaFunc
- GL_NEVER
) << 8);
1011 vmesa
->dirty
|= (VIA_UPLOAD_ALPHATEST
| VIA_UPLOAD_ENABLE
);
1014 vmesa
->regEnable
&= (~HC_HenAT_MASK
);
1015 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
1018 if (ctx
->Color
.DitherFlag
&& (vmesa
->viaScreen
->bitsPerPixel
< 32)) {
1019 if (ctx
->Color
.BlendEnabled
) {
1020 vmesa
->regEnable
&= ~HC_HenDT_MASK
;
1023 vmesa
->regEnable
|= HC_HenDT_MASK
;
1025 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
1028 if (ctx
->Color
.ColorLogicOpEnabled
)
1029 vmesa
->regHROP
= ROP
[ctx
->Color
.LogicOp
& 0xF];
1031 vmesa
->regHROP
= HC_HROP_P
;
1033 vmesa
->regHFBBMSKL
= (*(GLuint
*)&ctx
->Color
.ColorMask
[0]) & 0xFFFFFF;
1034 vmesa
->regHROP
|= ((*(GLuint
*)&ctx
->Color
.ColorMask
[0]) >> 24) & 0xFF;
1035 vmesa
->dirty
|= VIA_UPLOAD_MASK_ROP
;
1037 if ((GLuint
)((GLuint
*)&ctx
->Color
.ColorMask
[0]) & 0xFF000000)
1038 vmesa
->regEnable
|= HC_HenAW_MASK
;
1040 vmesa
->regEnable
&= (~HC_HenAW_MASK
);
1041 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
1043 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
1047 void viaChooseFogState(GLcontext
*ctx
)
1049 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1051 if (ctx
->Fog
.Enabled
) {
1054 vmesa
->regCmdB
|= (HC_HVPMSK_Cd
| HC_HVPMSK_Cs
| HC_HVPMSK_W
);
1055 vmesa
->regEnable
|= HC_HenFOG_MASK
;
1057 /* Use fog equation 0 (OpenGL's default) & local fog.
1059 vmesa
->regHFogLF
= 0x0;
1061 r
= (GLubyte
)(ctx
->Fog
.Color
[0] * 255.0F
);
1062 g
= (GLubyte
)(ctx
->Fog
.Color
[1] * 255.0F
);
1063 b
= (GLubyte
)(ctx
->Fog
.Color
[2] * 255.0F
);
1064 a
= (GLubyte
)(ctx
->Fog
.Color
[3] * 255.0F
);
1065 vmesa
->regHFogCL
= (r
<< 16) | (g
<< 8) | b
;
1066 vmesa
->regHFogCH
= a
;
1067 vmesa
->dirty
|= (VIA_UPLOAD_FOG
| VIA_UPLOAD_ENABLE
);
1070 if (!ctx
->Texture
._EnabledUnits
) {
1071 vmesa
->regCmdB
&= ~ HC_HVPMSK_W
;
1072 vmesa
->regCmdB
&= ~ HC_HVPMSK_Cs
;
1074 vmesa
->regEnable
&= ~HC_HenFOG_MASK
;
1075 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
1079 void viaChooseDepthState(GLcontext
*ctx
)
1081 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1082 if (ctx
->Depth
.Test
) {
1083 vmesa
->regCmdB
|= HC_HVPMSK_Z
;
1084 vmesa
->regEnable
|= HC_HenZT_MASK
;
1085 if (ctx
->Depth
.Mask
)
1086 vmesa
->regEnable
|= HC_HenZW_MASK
;
1088 vmesa
->regEnable
&= (~HC_HenZW_MASK
);
1089 vmesa
->regHZWTMD
= (ctx
->Depth
.Func
- GL_NEVER
) << 16;
1090 vmesa
->dirty
|= (VIA_UPLOAD_DEPTH
| VIA_UPLOAD_ENABLE
);
1094 /* Still need to send parameter Z.
1097 vmesa
->regCmdB
|= HC_HVPMSK_Z
;
1098 vmesa
->regEnable
&= ~HC_HenZT_MASK
;
1100 /*=* [DBG] racer : can't display cars in car selection menu *=*/
1101 /*if (ctx->Depth.Mask)
1102 vmesa->regEnable |= HC_HenZW_MASK;
1104 vmesa->regEnable &= (~HC_HenZW_MASK);*/
1105 vmesa
->regEnable
&= (~HC_HenZW_MASK
);
1107 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
1111 void viaChooseLightState(GLcontext
*ctx
)
1113 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1115 if (ctx
->Light
.ShadeModel
== GL_SMOOTH
) {
1116 vmesa
->regCmdA
|= HC_HShading_Gouraud
;
1117 vmesa
->regCmdB
|= HC_HVPMSK_Cd
;
1120 vmesa
->regCmdA
&= ~HC_HShading_Gouraud
;
1121 vmesa
->regCmdB
|= HC_HVPMSK_Cd
;
1125 void viaChooseLineState(GLcontext
*ctx
)
1127 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1129 if (ctx
->Line
.SmoothFlag
) {
1130 vmesa
->regEnable
|= HC_HenAA_MASK
;
1133 if (!ctx
->Polygon
.SmoothFlag
) {
1134 vmesa
->regEnable
&= ~HC_HenAA_MASK
;
1138 if (ctx
->Line
.StippleFlag
) {
1139 vmesa
->regEnable
|= HC_HenLP_MASK
;
1140 vmesa
->regHLP
= ctx
->Line
.StipplePattern
;
1141 vmesa
->regHLPRF
= ctx
->Line
.StippleFactor
;
1142 vmesa
->dirty
|= VIA_UPLOAD_LINESTIPPLE
;
1145 vmesa
->regEnable
&= ~HC_HenLP_MASK
;
1147 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
1150 void viaChoosePolygonState(GLcontext
*ctx
)
1152 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1154 if (ctx
->Polygon
.SmoothFlag
) {
1155 vmesa
->regEnable
|= HC_HenAA_MASK
;
1158 if (!ctx
->Line
.SmoothFlag
) {
1159 vmesa
->regEnable
&= ~HC_HenAA_MASK
;
1163 if (ctx
->Polygon
.StippleFlag
) {
1164 vmesa
->regEnable
|= HC_HenSP_MASK
;
1165 vmesa
->dirty
|= VIA_UPLOAD_POLYGONSTIPPLE
;
1168 vmesa
->regEnable
&= ~HC_HenSP_MASK
;
1171 if (ctx
->Polygon
.CullFlag
) {
1172 vmesa
->regEnable
|= HC_HenFBCull_MASK
;
1175 vmesa
->regEnable
&= ~HC_HenFBCull_MASK
;
1177 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
1180 void viaChooseStencilState(GLcontext
*ctx
)
1182 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1184 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
1187 if (ctx
->Stencil
.Enabled
) {
1190 vmesa
->regEnable
|= HC_HenST_MASK
;
1191 temp
= (ctx
->Stencil
.Ref
[0] & 0xFF) << HC_HSTREF_SHIFT
;
1192 temp
|= 0xFF << HC_HSTOPMSK_SHIFT
;
1193 temp
|= (ctx
->Stencil
.ValueMask
[0] & 0xFF);
1194 vmesa
->regHSTREF
= temp
;
1196 temp
= (ctx
->Stencil
.Function
[0] - GL_NEVER
) << 16;
1198 switch (ctx
->Stencil
.FailFunc
[0]) {
1200 temp
|= HC_HSTOPSF_KEEP
;
1203 temp
|= HC_HSTOPSF_ZERO
;
1206 temp
|= HC_HSTOPSF_REPLACE
;
1209 temp
|= HC_HSTOPSF_INVERT
;
1212 temp
|= HC_HSTOPSF_INCR
;
1215 temp
|= HC_HSTOPSF_DECR
;
1219 switch (ctx
->Stencil
.ZFailFunc
[0]) {
1221 temp
|= HC_HSTOPSPZF_KEEP
;
1224 temp
|= HC_HSTOPSPZF_ZERO
;
1227 temp
|= HC_HSTOPSPZF_REPLACE
;
1230 temp
|= HC_HSTOPSPZF_INVERT
;
1233 temp
|= HC_HSTOPSPZF_INCR
;
1236 temp
|= HC_HSTOPSPZF_DECR
;
1240 switch (ctx
->Stencil
.ZPassFunc
[0]) {
1242 temp
|= HC_HSTOPSPZP_KEEP
;
1245 temp
|= HC_HSTOPSPZP_ZERO
;
1248 temp
|= HC_HSTOPSPZP_REPLACE
;
1251 temp
|= HC_HSTOPSPZP_INVERT
;
1254 temp
|= HC_HSTOPSPZP_INCR
;
1257 temp
|= HC_HSTOPSPZP_DECR
;
1260 vmesa
->regHSTMD
= temp
;
1262 vmesa
->dirty
|= (VIA_UPLOAD_STENCIL
| VIA_UPLOAD_STENCIL
);
1265 vmesa
->regEnable
&= ~HC_HenST_MASK
;
1266 vmesa
->dirty
|= VIA_UPLOAD_ENABLE
;
1269 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
1273 void viaChoosePoint(GLcontext
*ctx
)
1278 void viaChooseLine(GLcontext
*ctx
)
1283 void viaChooseTriangle(GLcontext
*ctx
)
1285 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1287 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
1289 if (VIA_DEBUG
) fprintf(stderr
, "GL_CULL_FACE = %x\n", GL_CULL_FACE
);
1290 if (VIA_DEBUG
) fprintf(stderr
, "ctx->Polygon.CullFlag = %x\n", ctx
->Polygon
.CullFlag
);
1292 if (VIA_DEBUG
) fprintf(stderr
, "GL_FRONT = %x\n", GL_FRONT
);
1293 if (VIA_DEBUG
) fprintf(stderr
, "ctx->Polygon.CullFaceMode = %x\n", ctx
->Polygon
.CullFaceMode
);
1294 if (VIA_DEBUG
) fprintf(stderr
, "GL_CCW = %x\n", GL_CCW
);
1295 if (VIA_DEBUG
) fprintf(stderr
, "ctx->Polygon.FrontFace = %x\n", ctx
->Polygon
.FrontFace
);
1297 if (ctx
->Polygon
.CullFlag
== GL_TRUE
) {
1298 switch (ctx
->Polygon
.CullFaceMode
) {
1300 if (ctx
->Polygon
.FrontFace
== GL_CCW
)
1301 vmesa
->regCmdB
|= HC_HBFace_MASK
;
1303 vmesa
->regCmdB
&= ~HC_HBFace_MASK
;
1306 if (ctx
->Polygon
.FrontFace
== GL_CW
)
1307 vmesa
->regCmdB
|= HC_HBFace_MASK
;
1309 vmesa
->regCmdB
&= ~HC_HBFace_MASK
;
1311 case GL_FRONT_AND_BACK
:
1316 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
1320 static void viaChooseState(GLcontext
*ctx
, GLuint newState
)
1322 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1323 struct gl_texture_unit
*texUnit0
= &ctx
->Texture
.Unit
[0];
1324 struct gl_texture_unit
*texUnit1
= &ctx
->Texture
.Unit
[1];
1326 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
1328 if (VIA_DEBUG
) fprintf(stderr
, "newState = %x\n", newState
);
1330 if (!(newState
& (_NEW_COLOR
|
1337 _NEW_POLYGONSTIPPLE
|
1342 vmesa
->newState
= newState
;
1344 if (texUnit0
->_ReallyEnabled
|| texUnit1
->_ReallyEnabled
|| ctx
->Fog
.Enabled
) {
1345 vmesa
->regCmdB
|= HC_HVPMSK_Cs
;
1348 vmesa
->regCmdB
&= ~ HC_HVPMSK_Cs
;
1351 if (newState
& _NEW_TEXTURE
)
1352 viaChooseTextureState(ctx
);
1354 if (newState
& _NEW_COLOR
)
1355 viaChooseColorState(ctx
);
1357 if (newState
& _NEW_DEPTH
)
1358 viaChooseDepthState(ctx
);
1360 if (newState
& _NEW_FOG
)
1361 viaChooseFogState(ctx
);
1363 if (newState
& _NEW_LIGHT
)
1364 viaChooseLightState(ctx
);
1366 if (newState
& _NEW_LINE
)
1367 viaChooseLineState(ctx
);
1369 if (newState
& (_NEW_POLYGON
| _NEW_POLYGONSTIPPLE
))
1370 viaChoosePolygonState(ctx
);
1372 if (newState
& _NEW_STENCIL
)
1373 viaChooseStencilState(ctx
);
1375 viaChooseTriangle(ctx
);
1378 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
1382 static void viaInvalidateState(GLcontext
*ctx
, GLuint newState
)
1384 _swrast_InvalidateState(ctx
, newState
);
1385 _swsetup_InvalidateState(ctx
, newState
);
1386 _ac_InvalidateState(ctx
, newState
);
1387 _tnl_InvalidateState(ctx
, newState
);
1388 viaChooseState(ctx
, newState
);
1391 void viaInitStateFuncs(GLcontext
*ctx
)
1393 /* Callbacks for internal Mesa events.
1395 ctx
->Driver
.UpdateState
= viaInvalidateState
;
1399 ctx
->Driver
.AlphaFunc
= viaAlphaFunc
;
1400 ctx
->Driver
.BlendEquationSeparate
= viaBlendEquationSeparate
;
1401 ctx
->Driver
.BlendFuncSeparate
= viaBlendFuncSeparate
;
1402 ctx
->Driver
.ClearColor
= viaClearColor
;
1403 ctx
->Driver
.ColorMask
= viaColorMask
;
1404 ctx
->Driver
.CullFace
= viaCullFaceFrontFace
;
1405 ctx
->Driver
.DepthFunc
= viaDepthFunc
;
1406 ctx
->Driver
.DepthMask
= viaDepthMask
;
1407 ctx
->Driver
.DrawBuffer
= viaDrawBuffer
;
1408 ctx
->Driver
.Enable
= viaEnable
;
1409 ctx
->Driver
.Fogfv
= viaFogfv
;
1410 ctx
->Driver
.FrontFace
= viaCullFaceFrontFace
;
1411 ctx
->Driver
.LineWidth
= viaLineWidth
;
1412 ctx
->Driver
.LogicOpcode
= viaLogicOp
;
1413 ctx
->Driver
.PolygonStipple
= viaPolygonStipple
;
1414 ctx
->Driver
.RenderMode
= viaRenderMode
;
1415 ctx
->Driver
.Scissor
= viaScissor
;
1416 ctx
->Driver
.ShadeModel
= viaShadeModel
;
1417 ctx
->Driver
.DepthRange
= viaDepthRange
;
1418 ctx
->Driver
.Viewport
= viaViewport
;
1419 ctx
->Driver
.PointSize
= viaPointSize
;
1420 ctx
->Driver
.LightModelfv
= viaLightModelfv
;
1422 /* Pixel path fallbacks.
1424 ctx
->Driver
.Accum
= _swrast_Accum
;
1425 ctx
->Driver
.Bitmap
= viaBitmap
;
1427 ctx
->Driver
.CopyPixels
= _swrast_CopyPixels
;
1428 ctx
->Driver
.DrawPixels
= _swrast_DrawPixels
;
1429 ctx
->Driver
.ReadPixels
= _swrast_ReadPixels
;
1430 ctx
->Driver
.ResizeBuffers
= viaReAllocateBuffers
;
1432 /* Swrast hooks for imaging extensions:
1434 ctx
->Driver
.CopyColorTable
= _swrast_CopyColorTable
;
1435 ctx
->Driver
.CopyColorSubTable
= _swrast_CopyColorSubTable
;
1436 ctx
->Driver
.CopyConvolutionFilter1D
= _swrast_CopyConvolutionFilter1D
;
1437 ctx
->Driver
.CopyConvolutionFilter2D
= _swrast_CopyConvolutionFilter2D
;