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"
40 #include "via_ioctl.h"
42 #include "swrast/swrast.h"
43 #include "array_cache/acache.h"
45 #include "swrast_setup/swrast_setup.h"
47 #include "tnl/t_pipeline.h"
50 static GLuint ROP
[16] = {
51 HC_HROP_BLACK
, /* GL_CLEAR 0 */
52 HC_HROP_DPa
, /* GL_AND s & d */
53 HC_HROP_PDna
, /* GL_AND_REVERSE s & ~d */
54 HC_HROP_P
, /* GL_COPY s */
55 HC_HROP_DPna
, /* GL_AND_INVERTED ~s & d */
56 HC_HROP_D
, /* GL_NOOP d */
57 HC_HROP_DPx
, /* GL_XOR s ^ d */
58 HC_HROP_DPo
, /* GL_OR s | d */
59 HC_HROP_DPon
, /* GL_NOR ~(s | d) */
60 HC_HROP_DPxn
, /* GL_EQUIV ~(s ^ d) */
61 HC_HROP_Dn
, /* GL_INVERT ~d */
62 HC_HROP_PDno
, /* GL_OR_REVERSE s | ~d */
63 HC_HROP_Pn
, /* GL_COPY_INVERTED ~s */
64 HC_HROP_DPno
, /* GL_OR_INVERTED ~s | d */
65 HC_HROP_DPan
, /* GL_NAND ~(s & d) */
66 HC_HROP_WHITE
/* GL_SET 1 */
71 void viaEmitState(viaContextPtr vmesa
)
73 GLcontext
*ctx
= vmesa
->glCtx
;
78 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
80 viaCheckDma(vmesa
, 0x110);
83 OUT_RING( HC_HEADER2
);
84 OUT_RING( (HC_ParaType_NotTex
<< 16) );
85 OUT_RING( ((HC_SubA_HEnable
<< 24) | vmesa
->regEnable
) );
86 OUT_RING( ((HC_SubA_HFBBMSKL
<< 24) | vmesa
->regHFBBMSKL
) );
87 OUT_RING( ((HC_SubA_HROP
<< 24) | vmesa
->regHROP
) );
90 if (vmesa
->have_hw_stencil
) {
91 GLuint pitch
, format
, offset
;
93 format
= HC_HZWBFM_24
;
94 offset
= vmesa
->depth
.offset
;
95 pitch
= vmesa
->depth
.pitch
;
98 OUT_RING( ((HC_SubA_HZWBBasL
<< 24) | (offset
& 0xFFFFFF)) );
99 OUT_RING( ((HC_SubA_HZWBBasH
<< 24) | ((offset
& 0xFF000000) >> 24)) );
100 OUT_RING( ((HC_SubA_HZWBType
<< 24) | HC_HDBLoc_Local
| HC_HZONEasFF_MASK
|
102 OUT_RING( ((HC_SubA_HZWTMD
<< 24) | vmesa
->regHZWTMD
) );
103 OUT_RING( ((HC_SubA_HSTREF
<< 24) | vmesa
->regHSTREF
) );
104 OUT_RING( ((HC_SubA_HSTMD
<< 24) | vmesa
->regHSTMD
) );
107 else if (vmesa
->hasDepth
) {
108 GLuint pitch
, format
, offset
;
110 if (vmesa
->depthBits
== 16) {
111 /* We haven't support 16bit depth yet */
112 format
= HC_HZWBFM_16
;
113 /*format = HC_HZWBFM_32;*/
114 if (VIA_DEBUG
) fprintf(stderr
, "z format = 16\n");
117 format
= HC_HZWBFM_32
;
118 if (VIA_DEBUG
) fprintf(stderr
, "z format = 32\n");
122 offset
= vmesa
->depth
.offset
;
123 pitch
= vmesa
->depth
.pitch
;
126 OUT_RING( ((HC_SubA_HZWBBasL
<< 24) | (offset
& 0xFFFFFF)) );
127 OUT_RING( ((HC_SubA_HZWBBasH
<< 24) | ((offset
& 0xFF000000) >> 24)) );
128 OUT_RING( ((HC_SubA_HZWBType
<< 24) | HC_HDBLoc_Local
| HC_HZONEasFF_MASK
|
130 OUT_RING( ((HC_SubA_HZWTMD
<< 24) | vmesa
->regHZWTMD
) );
134 if (ctx
->Color
.AlphaEnabled
) {
136 OUT_RING( ((HC_SubA_HATMD
<< 24) | vmesa
->regHATMD
) );
141 if (ctx
->Color
.BlendEnabled
) {
143 OUT_RING( ((HC_SubA_HABLCsat
<< 24) | vmesa
->regHABLCsat
) );
144 OUT_RING( ((HC_SubA_HABLCop
<< 24) | vmesa
->regHABLCop
) );
145 OUT_RING( ((HC_SubA_HABLAsat
<< 24) | vmesa
->regHABLAsat
) );
146 OUT_RING( ((HC_SubA_HABLAop
<< 24) | vmesa
->regHABLAop
) );
147 OUT_RING( ((HC_SubA_HABLRCa
<< 24) | vmesa
->regHABLRCa
) );
148 OUT_RING( ((HC_SubA_HABLRFCa
<< 24) | vmesa
->regHABLRFCa
) );
149 OUT_RING( ((HC_SubA_HABLRCbias
<< 24) | vmesa
->regHABLRCbias
) );
150 OUT_RING( ((HC_SubA_HABLRCb
<< 24) | vmesa
->regHABLRCb
) );
151 OUT_RING( ((HC_SubA_HABLRFCb
<< 24) | vmesa
->regHABLRFCb
) );
152 OUT_RING( ((HC_SubA_HABLRAa
<< 24) | vmesa
->regHABLRAa
) );
153 OUT_RING( ((HC_SubA_HABLRAb
<< 24) | vmesa
->regHABLRAb
) );
157 if (ctx
->Fog
.Enabled
) {
159 OUT_RING( ((HC_SubA_HFogLF
<< 24) | vmesa
->regHFogLF
) );
160 OUT_RING( ((HC_SubA_HFogCL
<< 24) | vmesa
->regHFogCL
) );
161 OUT_RING( ((HC_SubA_HFogCH
<< 24) | vmesa
->regHFogCH
) );
165 if (0 && ctx
->Line
.StippleFlag
) {
167 OUT_RING( ((HC_SubA_HLP
<< 24) | ctx
->Line
.StipplePattern
) );
168 OUT_RING( ((HC_SubA_HLPRF
<< 24) | ctx
->Line
.StippleFactor
) );
173 OUT_RING( ((HC_SubA_HLP
<< 24) | 0xFFFF) );
174 OUT_RING( ((HC_SubA_HLPRF
<< 24) | 0x1) );
179 OUT_RING( ((HC_SubA_HPixGC
<< 24) | 0x0) );
185 if (ctx
->Texture
._EnabledUnits
) {
187 struct gl_texture_unit
*texUnit0
= &ctx
->Texture
.Unit
[0];
188 struct gl_texture_unit
*texUnit1
= &ctx
->Texture
.Unit
[1];
191 GLuint nDummyValue
= 0;
194 OUT_RING( HC_HEADER2
);
195 OUT_RING( (HC_ParaType_Tex
<< 16) | (HC_SubType_TexGeneral
<< 24) );
197 if (texUnit0
->Enabled
&& texUnit1
->Enabled
) {
198 if (VIA_DEBUG
) fprintf(stderr
, "multi texture\n");
199 nDummyValue
= (HC_SubA_HTXSMD
<< 24) | (1 << 3);
203 if (VIA_DEBUG
) fprintf(stderr
, "single texture\n");
204 nDummyValue
= (HC_SubA_HTXSMD
<< 24) | 0;
207 if (vmesa
->clearTexCache
) {
208 vmesa
->clearTexCache
= 0;
209 OUT_RING( nDummyValue
| HC_HTXCHCLR_MASK
);
210 OUT_RING( nDummyValue
);
213 OUT_RING( nDummyValue
);
214 OUT_RING( nDummyValue
);
217 OUT_RING( HC_HEADER2
);
218 OUT_RING( HC_ParaType_NotTex
<< 16 );
219 OUT_RING( (HC_SubA_HEnable
<< 24) | vmesa
->regEnable
);
220 OUT_RING( (HC_SubA_HEnable
<< 24) | vmesa
->regEnable
);
224 if (texUnit0
->Enabled
) {
225 struct gl_texture_object
*texObj
= texUnit0
->_Current
;
226 viaTextureObjectPtr t
= (viaTextureObjectPtr
)texObj
->DriverData
;
227 GLuint numLevels
= t
->lastLevel
- t
->firstLevel
+ 1;
229 fprintf(stderr
, "texture0 enabled\n");
230 fprintf(stderr
, "texture level %d\n", t
->actualLevel
);
232 if (numLevels
== 8) {
234 OUT_RING( HC_HEADER2
);
235 OUT_RING( (HC_ParaType_Tex
<< 16) | (0 << 24) );
236 OUT_RING( t
->regTexFM
);
237 OUT_RING( (HC_SubA_HTXnL0OS
<< 24) |
238 ((t
->lastLevel
) << HC_HTXnLVmax_SHIFT
) | t
->firstLevel
);
239 OUT_RING( t
->regTexWidthLog2
[0] );
240 OUT_RING( t
->regTexWidthLog2
[1] );
241 OUT_RING( t
->regTexHeightLog2
[0] );
242 OUT_RING( t
->regTexHeightLog2
[1] );
243 OUT_RING( t
->regTexBaseH
[0] );
244 OUT_RING( t
->regTexBaseH
[1] );
245 OUT_RING( t
->regTexBaseH
[2] );
246 OUT_RING( t
->regTexBaseAndPitch
[0].baseL
);
247 OUT_RING( t
->regTexBaseAndPitch
[0].pitchLog2
);
248 OUT_RING( t
->regTexBaseAndPitch
[1].baseL
);
249 OUT_RING( t
->regTexBaseAndPitch
[1].pitchLog2
);
250 OUT_RING( t
->regTexBaseAndPitch
[2].baseL
);
251 OUT_RING( t
->regTexBaseAndPitch
[2].pitchLog2
);
252 OUT_RING( t
->regTexBaseAndPitch
[3].baseL
);
253 OUT_RING( t
->regTexBaseAndPitch
[3].pitchLog2
);
254 OUT_RING( t
->regTexBaseAndPitch
[4].baseL
);
255 OUT_RING( t
->regTexBaseAndPitch
[4].pitchLog2
);
256 OUT_RING( t
->regTexBaseAndPitch
[5].baseL
);
257 OUT_RING( t
->regTexBaseAndPitch
[5].pitchLog2
);
258 OUT_RING( t
->regTexBaseAndPitch
[6].baseL
);
259 OUT_RING( t
->regTexBaseAndPitch
[6].pitchLog2
);
260 OUT_RING( t
->regTexBaseAndPitch
[7].baseL
);
261 OUT_RING( t
->regTexBaseAndPitch
[7].pitchLog2
);
264 else if (numLevels
> 1) {
266 BEGIN_RING(12 + numLevels
* 2);
267 OUT_RING( HC_HEADER2
);
268 OUT_RING( (HC_ParaType_Tex
<< 16) | (0 << 24) );
269 OUT_RING( t
->regTexFM
);
270 OUT_RING( (HC_SubA_HTXnL0OS
<< 24) |
271 ((t
->lastLevel
) << HC_HTXnLVmax_SHIFT
) | t
->firstLevel
);
272 OUT_RING( t
->regTexWidthLog2
[0] );
273 OUT_RING( t
->regTexHeightLog2
[0] );
276 OUT_RING( t
->regTexWidthLog2
[1] );
277 OUT_RING( t
->regTexHeightLog2
[1] );
280 OUT_RING( t
->regTexBaseH
[0] );
283 OUT_RING( t
->regTexBaseH
[1] );
286 OUT_RING( t
->regTexBaseH
[2] );
289 OUT_RING( t
->regTexBaseH
[3] );
292 for (j
= 0; j
< numLevels
; j
++) {
293 OUT_RING( t
->regTexBaseAndPitch
[j
].baseL
);
294 OUT_RING( t
->regTexBaseAndPitch
[j
].pitchLog2
);
297 ADVANCE_RING_VARIABLE();
302 OUT_RING( HC_HEADER2
);
303 OUT_RING( (HC_ParaType_Tex
<< 16) | (0 << 24) );
304 OUT_RING( t
->regTexFM
);
305 OUT_RING( (HC_SubA_HTXnL0OS
<< 24) |
306 ((t
->lastLevel
) << HC_HTXnLVmax_SHIFT
) | t
->firstLevel
);
307 OUT_RING( t
->regTexWidthLog2
[0] );
308 OUT_RING( t
->regTexHeightLog2
[0] );
309 OUT_RING( t
->regTexBaseH
[0] );
310 OUT_RING( t
->regTexBaseAndPitch
[0].baseL
);
311 OUT_RING( t
->regTexBaseAndPitch
[0].pitchLog2
);
316 OUT_RING( (HC_SubA_HTXnTB
<< 24) | vmesa
->regHTXnTB_0
);
317 OUT_RING( (HC_SubA_HTXnMPMD
<< 24) | vmesa
->regHTXnMPMD_0
);
318 OUT_RING( (HC_SubA_HTXnTBLCsat
<< 24) | vmesa
->regHTXnTBLCsat_0
);
319 OUT_RING( (HC_SubA_HTXnTBLCop
<< 24) | vmesa
->regHTXnTBLCop_0
);
320 OUT_RING( (HC_SubA_HTXnTBLMPfog
<< 24) | vmesa
->regHTXnTBLMPfog_0
);
321 OUT_RING( (HC_SubA_HTXnTBLAsat
<< 24) | vmesa
->regHTXnTBLAsat_0
);
322 OUT_RING( (HC_SubA_HTXnTBLRCb
<< 24) | vmesa
->regHTXnTBLRCb_0
);
323 OUT_RING( (HC_SubA_HTXnTBLRAa
<< 24) | vmesa
->regHTXnTBLRAa_0
);
324 OUT_RING( (HC_SubA_HTXnTBLRFog
<< 24) | vmesa
->regHTXnTBLRFog_0
);
325 OUT_RING( (HC_SubA_HTXnTBLRCa
<< 24) | vmesa
->regHTXnTBLRCa_0
);
326 OUT_RING( (HC_SubA_HTXnTBLRCc
<< 24) | vmesa
->regHTXnTBLRCc_0
);
327 OUT_RING( (HC_SubA_HTXnTBLRCbias
<< 24) | vmesa
->regHTXnTBLRCbias_0
);
330 if (t
->regTexFM
== HC_HTXnFM_Index8
) {
331 struct gl_color_table
*table
= &texObj
->Palette
;
332 GLfloat
*tableF
= (GLfloat
*)table
->Table
;
334 BEGIN_RING(2 + table
->Size
);
335 OUT_RING( HC_HEADER2
);
336 OUT_RING( (HC_ParaType_Palette
<< 16) | (0 << 24) );
337 for (j
= 0; j
< table
->Size
; j
++)
338 OUT_RING( tableF
[j
] );
346 if (texUnit1
->Enabled
) {
347 struct gl_texture_object
*texObj
= texUnit1
->_Current
;
348 viaTextureObjectPtr t
= (viaTextureObjectPtr
)texObj
->DriverData
;
349 GLuint numLevels
= t
->lastLevel
- t
->firstLevel
+ 1;
350 int texunit
= (texUnit0
->Enabled
? 1 : 0);
352 fprintf(stderr
, "texture1 enabled\n");
353 fprintf(stderr
, "texture level %d\n", t
->actualLevel
);
355 if (numLevels
== 8) {
357 OUT_RING( HC_HEADER2
);
358 OUT_RING( (HC_ParaType_Tex
<< 16) | (texunit
<< 24) );
359 OUT_RING( t
->regTexFM
);
360 OUT_RING( (HC_SubA_HTXnL0OS
<< 24) |
361 ((t
->lastLevel
) << HC_HTXnLVmax_SHIFT
) | t
->firstLevel
);
362 OUT_RING( t
->regTexWidthLog2
[0] );
363 OUT_RING( t
->regTexWidthLog2
[1] );
364 OUT_RING( t
->regTexHeightLog2
[0] );
365 OUT_RING( t
->regTexHeightLog2
[1] );
366 OUT_RING( t
->regTexBaseH
[0] );
367 OUT_RING( t
->regTexBaseH
[1] );
368 OUT_RING( t
->regTexBaseH
[2] );
369 OUT_RING( t
->regTexBaseAndPitch
[0].baseL
);
370 OUT_RING( t
->regTexBaseAndPitch
[0].pitchLog2
);
371 OUT_RING( t
->regTexBaseAndPitch
[1].baseL
);
372 OUT_RING( t
->regTexBaseAndPitch
[1].pitchLog2
);
373 OUT_RING( t
->regTexBaseAndPitch
[2].baseL
);
374 OUT_RING( t
->regTexBaseAndPitch
[2].pitchLog2
);
375 OUT_RING( t
->regTexBaseAndPitch
[3].baseL
);
376 OUT_RING( t
->regTexBaseAndPitch
[3].pitchLog2
);
377 OUT_RING( t
->regTexBaseAndPitch
[4].baseL
);
378 OUT_RING( t
->regTexBaseAndPitch
[4].pitchLog2
);
379 OUT_RING( t
->regTexBaseAndPitch
[5].baseL
);
380 OUT_RING( t
->regTexBaseAndPitch
[5].pitchLog2
);
381 OUT_RING( t
->regTexBaseAndPitch
[6].baseL
);
382 OUT_RING( t
->regTexBaseAndPitch
[6].pitchLog2
);
383 OUT_RING( t
->regTexBaseAndPitch
[7].baseL
);
384 OUT_RING( t
->regTexBaseAndPitch
[7].pitchLog2
);
387 else if (numLevels
> 1) {
388 BEGIN_RING(12 + numLevels
* 2);
389 OUT_RING( HC_HEADER2
);
390 OUT_RING( (HC_ParaType_Tex
<< 16) | (texunit
<< 24) );
391 OUT_RING( t
->regTexFM
);
392 OUT_RING( (HC_SubA_HTXnL0OS
<< 24) |
393 ((t
->lastLevel
) << HC_HTXnLVmax_SHIFT
) | t
->firstLevel
);
394 OUT_RING( t
->regTexWidthLog2
[0] );
395 OUT_RING( t
->regTexHeightLog2
[0] );
398 OUT_RING( t
->regTexWidthLog2
[1] );
399 OUT_RING( t
->regTexHeightLog2
[1] );
403 OUT_RING( t
->regTexBaseH
[0] );
406 OUT_RING( t
->regTexBaseH
[1] );
409 OUT_RING( t
->regTexBaseH
[2] );
412 OUT_RING( t
->regTexBaseH
[3] );
415 for (j
= 0; j
< numLevels
; j
++) {
416 OUT_RING( t
->regTexBaseAndPitch
[j
].baseL
);
417 OUT_RING( t
->regTexBaseAndPitch
[j
].pitchLog2
);
419 ADVANCE_RING_VARIABLE();
423 OUT_RING( HC_HEADER2
);
424 OUT_RING( (HC_ParaType_Tex
<< 16) | (texunit
<< 24) );
425 OUT_RING( t
->regTexFM
);
426 OUT_RING( (HC_SubA_HTXnL0OS
<< 24) |
427 ((t
->lastLevel
) << HC_HTXnLVmax_SHIFT
) | t
->firstLevel
);
428 OUT_RING( t
->regTexWidthLog2
[0] );
429 OUT_RING( t
->regTexHeightLog2
[0] );
430 OUT_RING( t
->regTexBaseH
[0] );
431 OUT_RING( t
->regTexBaseAndPitch
[0].baseL
);
432 OUT_RING( t
->regTexBaseAndPitch
[0].pitchLog2
);
437 OUT_RING( (HC_SubA_HTXnTB
<< 24) | vmesa
->regHTXnTB_1
);
438 OUT_RING( (HC_SubA_HTXnMPMD
<< 24) | vmesa
->regHTXnMPMD_1
);
439 OUT_RING( (HC_SubA_HTXnTBLCsat
<< 24) | vmesa
->regHTXnTBLCsat_1
);
440 OUT_RING( (HC_SubA_HTXnTBLCop
<< 24) | vmesa
->regHTXnTBLCop_1
);
441 OUT_RING( (HC_SubA_HTXnTBLMPfog
<< 24) | vmesa
->regHTXnTBLMPfog_1
);
442 OUT_RING( (HC_SubA_HTXnTBLAsat
<< 24) | vmesa
->regHTXnTBLAsat_1
);
443 OUT_RING( (HC_SubA_HTXnTBLRCb
<< 24) | vmesa
->regHTXnTBLRCb_1
);
444 OUT_RING( (HC_SubA_HTXnTBLRAa
<< 24) | vmesa
->regHTXnTBLRAa_1
);
445 OUT_RING( (HC_SubA_HTXnTBLRFog
<< 24) | vmesa
->regHTXnTBLRFog_1
);
446 OUT_RING( (HC_SubA_HTXnTBLRCa
<< 24) | vmesa
->regHTXnTBLRCa_1
);
447 OUT_RING( (HC_SubA_HTXnTBLRCc
<< 24) | vmesa
->regHTXnTBLRCc_1
);
448 OUT_RING( (HC_SubA_HTXnTBLRCbias
<< 24) | vmesa
->regHTXnTBLRCbias_1
);
451 if (t
->regTexFM
== HC_HTXnFM_Index8
) {
452 struct gl_color_table
*table
= &texObj
->Palette
;
453 GLfloat
*tableF
= (GLfloat
*)table
->Table
;
455 BEGIN_RING(2 + table
->Size
);
456 OUT_RING( HC_HEADER2
);
457 OUT_RING( (HC_ParaType_Palette
<< 16) | (texunit
<< 24) );
458 for (j
= 0; j
< table
->Size
; j
++) {
459 OUT_RING( tableF
[j
] );
468 if (ctx
->Polygon
.StippleFlag
) {
469 GLuint
*stipple
= &vmesa
->stipple
[0];
472 OUT_RING( HC_HEADER2
);
473 OUT_RING( ((HC_ParaType_Palette
<< 16) | (HC_SubType_Stipple
<< 24)) );
474 OUT_RING( stipple
[31] );
475 OUT_RING( stipple
[30] );
476 OUT_RING( stipple
[29] );
477 OUT_RING( stipple
[28] );
478 OUT_RING( stipple
[27] );
479 OUT_RING( stipple
[26] );
480 OUT_RING( stipple
[25] );
481 OUT_RING( stipple
[24] );
482 OUT_RING( stipple
[23] );
483 OUT_RING( stipple
[22] );
484 OUT_RING( stipple
[21] );
485 OUT_RING( stipple
[20] );
486 OUT_RING( stipple
[19] );
487 OUT_RING( stipple
[18] );
488 OUT_RING( stipple
[17] );
489 OUT_RING( stipple
[16] );
490 OUT_RING( stipple
[15] );
491 OUT_RING( stipple
[14] );
492 OUT_RING( stipple
[13] );
493 OUT_RING( stipple
[12] );
494 OUT_RING( stipple
[11] );
495 OUT_RING( stipple
[10] );
496 OUT_RING( stipple
[9] );
497 OUT_RING( stipple
[8] );
498 OUT_RING( stipple
[7] );
499 OUT_RING( stipple
[6] );
500 OUT_RING( stipple
[5] );
501 OUT_RING( stipple
[4] );
502 OUT_RING( stipple
[3] );
503 OUT_RING( stipple
[2] );
504 OUT_RING( stipple
[1] );
505 OUT_RING( stipple
[0] );
506 OUT_RING( HC_HEADER2
);
507 OUT_RING( (HC_ParaType_NotTex
<< 16) );
508 OUT_RING( ((HC_SubA_HSPXYOS
<< 24) | (0x20 - (vmesa
->driDrawable
->h
& 0x1F))) );
509 OUT_RING( ((HC_SubA_HSPXYOS
<< 24) | (0x20 - (vmesa
->driDrawable
->h
& 0x1F))) );
513 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
515 vmesa
->newEmitState
= 0;
519 static __inline__ GLuint
viaPackColor(GLuint format
,
520 GLubyte r
, GLubyte g
,
521 GLubyte b
, GLubyte a
)
525 return PACK_COLOR_565(r
, g
, b
);
527 return PACK_COLOR_8888(a
, r
, g
, b
);
529 if (VIA_DEBUG
) fprintf(stderr
, "unknown format %d\n", (int)format
);
530 return PACK_COLOR_8888(a
, r
, g
, b
);
534 static void viaBlendEquationSeparate(GLcontext
*ctx
, GLenum rgbMode
, GLenum aMode
)
536 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
538 /* GL_EXT_blend_equation_separate not supported */
539 ASSERT(rgbMode
== aMode
);
541 /* Can only do GL_ADD equation in hardware */
542 FALLBACK(VIA_CONTEXT(ctx
), VIA_FALLBACK_BLEND_EQ
, rgbMode
!= GL_FUNC_ADD_EXT
);
544 /* BlendEquation sets ColorLogicOpEnabled in an unexpected
547 FALLBACK(VIA_CONTEXT(ctx
), VIA_FALLBACK_LOGICOP
,
548 (ctx
->Color
.ColorLogicOpEnabled
&&
549 ctx
->Color
.LogicOp
!= GL_COPY
));
550 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
553 static void viaBlendFunc(GLcontext
*ctx
, GLenum sfactor
, GLenum dfactor
)
555 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
556 GLboolean fallback
= GL_FALSE
;
557 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
559 switch (ctx
->Color
.BlendSrcRGB
) {
560 case GL_SRC_ALPHA_SATURATE
:
561 case GL_CONSTANT_COLOR
:
562 case GL_ONE_MINUS_CONSTANT_COLOR
:
563 case GL_CONSTANT_ALPHA
:
564 case GL_ONE_MINUS_CONSTANT_ALPHA
:
571 switch (ctx
->Color
.BlendDstRGB
) {
572 case GL_CONSTANT_COLOR
:
573 case GL_ONE_MINUS_CONSTANT_COLOR
:
574 case GL_CONSTANT_ALPHA
:
575 case GL_ONE_MINUS_CONSTANT_ALPHA
:
582 FALLBACK(vmesa
, VIA_FALLBACK_BLEND_FUNC
, fallback
);
583 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
586 /* Shouldn't be called as the extension is disabled.
588 static void viaBlendFuncSeparate(GLcontext
*ctx
, GLenum sfactorRGB
,
589 GLenum dfactorRGB
, GLenum sfactorA
,
592 if (dfactorRGB
!= dfactorA
|| sfactorRGB
!= sfactorA
) {
593 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glBlendEquation (disabled)");
596 viaBlendFunc(ctx
, sfactorRGB
, dfactorRGB
);
602 /* =============================================================
605 static void viaScissor(GLcontext
*ctx
, GLint x
, GLint y
,
606 GLsizei w
, GLsizei h
)
608 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
610 if (!vmesa
->driDrawable
)
614 fprintf(stderr
, "%s %d,%d %dx%d, drawH %d\n", __FUNCTION__
, x
,y
,w
,h
, vmesa
->driDrawable
->h
);
616 if (vmesa
->scissor
) {
617 VIA_FLUSH_DMA(vmesa
); /* don't pipeline cliprect changes */
620 vmesa
->scissorRect
.x1
= x
;
621 vmesa
->scissorRect
.y1
= vmesa
->driDrawable
->h
- y
- h
;
622 vmesa
->scissorRect
.x2
= x
+ w
;
623 vmesa
->scissorRect
.y2
= vmesa
->driDrawable
->h
- y
;
625 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
628 static void viaEnable(GLcontext
*ctx
, GLenum cap
, GLboolean state
)
630 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
633 case GL_SCISSOR_TEST
:
634 VIA_FLUSH_DMA(vmesa
);
635 vmesa
->scissor
= state
;
644 /* Fallback to swrast for select and feedback.
646 static void viaRenderMode(GLcontext
*ctx
, GLenum mode
)
648 FALLBACK(VIA_CONTEXT(ctx
), VIA_FALLBACK_RENDERMODE
, (mode
!= GL_RENDER
));
652 static void viaDrawBuffer(GLcontext
*ctx
, GLenum mode
)
654 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
655 if (VIA_DEBUG
) fprintf(stderr
, "%s in\n", __FUNCTION__
);
656 if (mode
== GL_FRONT
) {
657 VIA_FLUSH_DMA(vmesa
);
658 vmesa
->drawBuffer
= vmesa
->readBuffer
= &vmesa
->front
;
659 FALLBACK(vmesa
, VIA_FALLBACK_DRAW_BUFFER
, GL_FALSE
);
662 else if (mode
== GL_BACK
) {
663 VIA_FLUSH_DMA(vmesa
);
664 vmesa
->drawBuffer
= vmesa
->readBuffer
= &vmesa
->back
;
665 FALLBACK(vmesa
, VIA_FALLBACK_DRAW_BUFFER
, GL_FALSE
);
669 FALLBACK(vmesa
, VIA_FALLBACK_DRAW_BUFFER
, GL_TRUE
);
673 viaXMesaWindowMoved(vmesa
);
675 /* We want to update the s/w rast state too so that viaSetBuffer()
678 _swrast_DrawBuffer(ctx
, mode
);
681 if (VIA_DEBUG
) fprintf(stderr
, "%s out\n", __FUNCTION__
);
684 static void viaClearColor(GLcontext
*ctx
, const GLfloat color
[4])
686 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
688 CLAMPED_FLOAT_TO_UBYTE(pcolor
[0], color
[0]);
689 CLAMPED_FLOAT_TO_UBYTE(pcolor
[1], color
[1]);
690 CLAMPED_FLOAT_TO_UBYTE(pcolor
[2], color
[2]);
691 CLAMPED_FLOAT_TO_UBYTE(pcolor
[3], color
[3]);
692 vmesa
->ClearColor
= viaPackColor(vmesa
->viaScreen
->bitsPerPixel
,
693 pcolor
[0], pcolor
[1],
694 pcolor
[2], pcolor
[3]);
698 #define WRITEMASK_ALPHA_SHIFT 31
699 #define WRITEMASK_RED_SHIFT 30
700 #define WRITEMASK_GREEN_SHIFT 29
701 #define WRITEMASK_BLUE_SHIFT 28
703 static void viaColorMask(GLcontext
*ctx
,
704 GLboolean r
, GLboolean g
,
705 GLboolean b
, GLboolean a
)
707 viaContextPtr vmesa
= VIA_CONTEXT( ctx
);
710 fprintf(stderr
, "%s r(%d) g(%d) b(%d) a(%d)\n", __FUNCTION__
, r
, g
, b
, a
);
712 vmesa
->ClearMask
= (((!r
) << WRITEMASK_RED_SHIFT
) |
713 ((!g
) << WRITEMASK_GREEN_SHIFT
) |
714 ((!b
) << WRITEMASK_BLUE_SHIFT
) |
715 ((!a
) << WRITEMASK_ALPHA_SHIFT
));
719 /* =============================================================
723 /* Using drawXoff like this is incorrect outside of locked regions.
724 * This hardware just isn't capable of private back buffers without
725 * glitches and/or a hefty locking scheme.
727 void viaCalcViewport(GLcontext
*ctx
)
729 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
730 const GLfloat
*v
= ctx
->Viewport
._WindowMap
.m
;
731 GLfloat
*m
= vmesa
->ViewportMatrix
.m
;
733 /* See also via_translate_vertex.
735 m
[MAT_SX
] = v
[MAT_SX
];
736 m
[MAT_TX
] = v
[MAT_TX
] + SUBPIXEL_X
+ vmesa
->drawXoff
;
737 m
[MAT_SY
] = - v
[MAT_SY
];
738 m
[MAT_TY
] = - v
[MAT_TY
] + vmesa
->driDrawable
->h
+ SUBPIXEL_Y
;
739 m
[MAT_SZ
] = v
[MAT_SZ
] * (1.0 / vmesa
->depth_max
);
740 m
[MAT_TZ
] = v
[MAT_TZ
] * (1.0 / vmesa
->depth_max
);
743 static void viaViewport(GLcontext
*ctx
,
745 GLsizei width
, GLsizei height
)
747 /* update size of Mesa/software ancillary buffers */
748 _mesa_ResizeBuffersMESA();
749 viaCalcViewport(ctx
);
752 static void viaDepthRange(GLcontext
*ctx
,
753 GLclampd nearval
, GLclampd farval
)
755 viaCalcViewport(ctx
);
760 flip_bytes( GLubyte
*p
, GLuint n
)
762 register GLuint i
, a
, b
;
765 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
766 a
= ((b
& 0x01) << 7) |
779 static void viaPolygonStipple( GLcontext
*ctx
, const GLubyte
*mask
)
781 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
782 GLubyte
*s
= (GLubyte
*)vmesa
->stipple
;
785 /* Fallback for the CLE266 case. Stipple works on the CLE266, but
786 * the stipple x/y offset registers don't seem to be respected,
787 * meaning that when drawXoff != 0, the stipple is rotated left or
788 * right by a few pixels, giving incorrect results.
790 if (vmesa
->viaScreen
->deviceID
== VIA_CLE266
) {
791 FALLBACK( vmesa
, VIA_FALLBACK_STIPPLE
, ctx
->Polygon
.StippleFlag
);
798 void viaInitState(GLcontext
*ctx
)
800 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
802 vmesa
->regCmdA
= HC_ACMD_HCmdA
;
803 vmesa
->regCmdB
= HC_ACMD_HCmdB
;
804 vmesa
->regEnable
= HC_HenCW_MASK
;
806 /* Mesa should do this for us:
809 ctx
->Driver
.BlendEquationSeparate( ctx
,
810 ctx
->Color
.BlendEquationRGB
,
811 ctx
->Color
.BlendEquationA
);
813 ctx
->Driver
.BlendFuncSeparate( ctx
,
814 ctx
->Color
.BlendSrcRGB
,
815 ctx
->Color
.BlendDstRGB
,
816 ctx
->Color
.BlendSrcA
,
817 ctx
->Color
.BlendDstA
);
819 ctx
->Driver
.Scissor( ctx
, ctx
->Scissor
.X
, ctx
->Scissor
.Y
,
820 ctx
->Scissor
.Width
, ctx
->Scissor
.Height
);
822 ctx
->Driver
.DrawBuffer( ctx
, ctx
->Color
.DrawBuffer
[0] );
826 * Convert S and T texture coordinate wrap modes to hardware bits.
829 get_wrap_mode( GLenum sWrap
, GLenum tWrap
)
836 v
|= HC_HTXnMPMD_Srepeat
;
839 case GL_CLAMP_TO_EDGE
:
840 v
|= HC_HTXnMPMD_Sclamp
;
842 case GL_MIRRORED_REPEAT
:
843 v
|= HC_HTXnMPMD_Smirror
;
849 v
|= HC_HTXnMPMD_Trepeat
;
852 case GL_CLAMP_TO_EDGE
:
853 v
|= HC_HTXnMPMD_Tclamp
;
855 case GL_MIRRORED_REPEAT
:
856 v
|= HC_HTXnMPMD_Tmirror
;
864 static void viaChooseTextureState(GLcontext
*ctx
)
866 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
867 struct gl_texture_unit
*texUnit0
= &ctx
->Texture
.Unit
[0];
868 struct gl_texture_unit
*texUnit1
= &ctx
->Texture
.Unit
[1];
869 /*=* John Sheng [2003.7.18] texture combine *=*/
871 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
872 if (texUnit0
->_ReallyEnabled
|| texUnit1
->_ReallyEnabled
) {
874 fprintf(stderr
, "Texture._ReallyEnabled - in\n");
875 fprintf(stderr
, "texUnit0->_ReallyEnabled = %x\n",texUnit0
->_ReallyEnabled
);
879 struct gl_texture_object
*texObj0
= texUnit0
->_Current
;
880 struct gl_texture_object
*texObj1
= texUnit1
->_Current
;
882 fprintf(stderr
, "env mode: 0x%04x / 0x%04x\n", texUnit0
->EnvMode
, texUnit1
->EnvMode
);
884 if ( (texObj0
!= NULL
) && (texObj0
->Image
[0][0] != NULL
) )
885 fprintf(stderr
, "format 0: 0x%04x\n", texObj0
->Image
[0][0]->Format
);
887 if ( (texObj1
!= NULL
) && (texObj1
->Image
[0][0] != NULL
) )
888 fprintf(stderr
, "format 1: 0x%04x\n", texObj1
->Image
[0][0]->Format
);
892 if (texUnit0
->_ReallyEnabled
) {
893 struct gl_texture_object
*texObj
= texUnit0
->_Current
;
895 if (VIA_DEBUG
) fprintf(stderr
, "texUnit0->_ReallyEnabled\n");
897 vmesa
->regEnable
|= HC_HenTXMP_MASK
| HC_HenTXCH_MASK
| HC_HenTXPP_MASK
;
899 switch (texObj
->MinFilter
) {
901 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Nearest
|
905 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Linear
|
908 case GL_NEAREST_MIPMAP_NEAREST
:
909 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Nearest
|
911 vmesa
->regHTXnTB_0
|= HC_HTXnFLDs_Nearest
;
913 case GL_LINEAR_MIPMAP_NEAREST
:
914 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Linear
|
916 vmesa
->regHTXnTB_0
|= HC_HTXnFLDs_Nearest
;
918 case GL_NEAREST_MIPMAP_LINEAR
:
919 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Nearest
|
921 vmesa
->regHTXnTB_0
|= HC_HTXnFLDs_Linear
;
923 case GL_LINEAR_MIPMAP_LINEAR
:
924 vmesa
->regHTXnTB_0
= HC_HTXnFLSs_Linear
|
926 vmesa
->regHTXnTB_0
|= HC_HTXnFLDs_Linear
;
932 switch (texObj
->MagFilter
) {
934 vmesa
->regHTXnTB_0
|= HC_HTXnFLSe_Linear
|
938 vmesa
->regHTXnTB_0
|= HC_HTXnFLSe_Nearest
|
945 vmesa
->regHTXnMPMD_0
&= ~(HC_HTXnMPMD_SMASK
| HC_HTXnMPMD_TMASK
);
946 vmesa
->regHTXnMPMD_0
|= get_wrap_mode( texObj
->WrapS
,
949 if (VIA_DEBUG
) fprintf(stderr
, "texUnit0->EnvMode %x\n",texUnit0
->EnvMode
);
951 viaTexCombineState( vmesa
, texUnit0
->_CurrentCombine
, 0 );
954 if (texUnit1
->_ReallyEnabled
) {
955 struct gl_texture_object
*texObj
= texUnit1
->_Current
;
957 vmesa
->regEnable
|= HC_HenTXMP_MASK
| HC_HenTXCH_MASK
| HC_HenTXPP_MASK
;
959 switch (texObj
->MinFilter
) {
961 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Nearest
|
965 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Linear
|
968 case GL_NEAREST_MIPMAP_NEAREST
:
969 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Nearest
|
971 vmesa
->regHTXnTB_1
|= HC_HTXnFLDs_Nearest
;
973 case GL_LINEAR_MIPMAP_NEAREST
:
974 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Linear
|
976 vmesa
->regHTXnTB_1
|= HC_HTXnFLDs_Nearest
;
978 case GL_NEAREST_MIPMAP_LINEAR
:
979 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Nearest
|
981 vmesa
->regHTXnTB_1
|= HC_HTXnFLDs_Linear
;
983 case GL_LINEAR_MIPMAP_LINEAR
:
984 vmesa
->regHTXnTB_1
= HC_HTXnFLSs_Linear
|
986 vmesa
->regHTXnTB_1
|= HC_HTXnFLDs_Linear
;
992 switch(texObj
->MagFilter
) {
994 vmesa
->regHTXnTB_1
|= HC_HTXnFLSe_Linear
|
998 vmesa
->regHTXnTB_1
|= HC_HTXnFLSe_Nearest
|
1005 vmesa
->regHTXnMPMD_1
&= ~(HC_HTXnMPMD_SMASK
| HC_HTXnMPMD_TMASK
);
1006 vmesa
->regHTXnMPMD_1
|= get_wrap_mode( texObj
->WrapS
,
1009 viaTexCombineState( vmesa
, texUnit1
->_CurrentCombine
, 1 );
1013 fprintf( stderr
, "Csat_0 / Cop_0 = 0x%08x / 0x%08x\n",
1014 vmesa
->regHTXnTBLCsat_0
, vmesa
->regHTXnTBLCop_0
);
1015 fprintf( stderr
, "Asat_0 = 0x%08x\n",
1016 vmesa
->regHTXnTBLAsat_0
);
1017 fprintf( stderr
, "RCb_0 / RAa_0 = 0x%08x / 0x%08x\n",
1018 vmesa
->regHTXnTBLRCb_0
, vmesa
->regHTXnTBLRAa_0
);
1019 fprintf( stderr
, "RCa_0 / RCc_0 = 0x%08x / 0x%08x\n",
1020 vmesa
->regHTXnTBLRCa_0
, vmesa
->regHTXnTBLRCc_0
);
1021 fprintf( stderr
, "RCbias_0 = 0x%08x\n",
1022 vmesa
->regHTXnTBLRCbias_0
);
1026 vmesa
->regEnable
&= (~(HC_HenTXMP_MASK
| HC_HenTXCH_MASK
| HC_HenTXPP_MASK
));
1028 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
1032 static void viaChooseColorState(GLcontext
*ctx
)
1034 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1035 GLenum s
= ctx
->Color
.BlendSrcRGB
;
1036 GLenum d
= ctx
->Color
.BlendDstRGB
;
1038 /* The HW's blending equation is:
1039 * (Ca * FCa + Cbias + Cb * FCb) << Cshift
1041 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
1043 if (ctx
->Color
.BlendEnabled
) {
1044 vmesa
->regEnable
|= HC_HenABL_MASK
;
1045 /* Ca -- always from source color.
1047 vmesa
->regHABLCsat
= HC_HABLCsat_MASK
| HC_HABLCa_OPC
|
1049 /* Aa -- always from source alpha.
1051 vmesa
->regHABLAsat
= HC_HABLAsat_MASK
| HC_HABLAa_OPA
|
1053 /* FCa -- depend on following condition.
1054 * FAa -- depend on following condition.
1060 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_HABLRCa
;
1061 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_HABLFRA
;
1062 vmesa
->regHABLRFCa
= 0x0;
1063 vmesa
->regHABLRAa
= 0x0;
1068 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_HABLRCa
;
1069 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_HABLFRA
;
1070 vmesa
->regHABLRFCa
= 0x0;
1071 vmesa
->regHABLRAa
= 0x0;
1076 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_Csrc
;
1077 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_Asrc
;
1079 case GL_ONE_MINUS_SRC_COLOR
:
1080 /* (1, 1, 1, 1) - (Rs, Gs, Bs, As)
1082 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_Csrc
;
1083 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_Asrc
;
1088 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_Cdst
;
1089 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_Adst
;
1091 case GL_ONE_MINUS_DST_COLOR
:
1092 /* (1, 1, 1, 1) - (Rd, Gd, Bd, Ad)
1094 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_Cdst
;
1095 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_Adst
;
1100 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_Asrc
;
1101 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_Asrc
;
1103 case GL_ONE_MINUS_SRC_ALPHA
:
1104 /* (1, 1, 1, 1) - (As, As, As, As)
1106 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_Asrc
;
1107 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_Asrc
;
1111 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
1114 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_HABLRCa
;
1115 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_HABLFRA
;
1116 vmesa
->regHABLRFCa
= 0x0;
1117 vmesa
->regHABLRAa
= 0x0;
1122 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_Adst
;
1123 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_Adst
;
1127 case GL_ONE_MINUS_DST_ALPHA
:
1129 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
1130 /* (1, 1, 1, 1) - (1, 1, 1, 1) = (0, 0, 0, 0)
1132 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_HABLRCa
;
1133 vmesa
->regHABLAsat
|= HC_HABLFAa_OPA
| HC_HABLFAa_HABLFRA
;
1134 vmesa
->regHABLRFCa
= 0x0;
1135 vmesa
->regHABLRAa
= 0x0;
1138 /* (1, 1, 1, 1) - (Ad, Ad, Ad, Ad)
1140 vmesa
->regHABLCsat
|= HC_HABLFCa_InvOPC
| HC_HABLFCa_Adst
;
1141 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_Adst
;
1145 case GL_SRC_ALPHA_SATURATE
:
1147 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
1148 /* (f, f, f, 1), f = min(As, 1 - Ad) = min(As, 1 - 1) = 0
1149 * So (f, f, f, 1) = (0, 0, 0, 1)
1151 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_HABLRCa
;
1152 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_HABLFRA
;
1153 vmesa
->regHABLRFCa
= 0x0;
1154 vmesa
->regHABLRAa
= 0x0;
1157 /* (f, f, f, 1), f = min(As, 1 - Ad)
1159 vmesa
->regHABLCsat
|= HC_HABLFCa_OPC
| HC_HABLFCa_mimAsrcInvAdst
;
1160 vmesa
->regHABLAsat
|= HC_HABLFAa_InvOPA
| HC_HABLFAa_HABLFRA
;
1161 vmesa
->regHABLRFCa
= 0x0;
1162 vmesa
->regHABLRAa
= 0x0;
1173 vmesa
->regHABLCsat
|= HC_HABLCbias_HABLRCbias
;
1174 vmesa
->regHABLAsat
|= HC_HABLAbias_HABLRAbias
;
1176 /* Cb -- always from destination color.
1178 vmesa
->regHABLCop
= HC_HABLCb_OPC
| HC_HABLCb_Cdst
;
1179 /* Ab -- always from destination alpha.
1181 vmesa
->regHABLAop
= HC_HABLAb_OPA
| HC_HABLAb_Adst
;
1182 /* FCb -- depend on following condition.
1188 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_HABLRCb
;
1189 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_HABLFRA
;
1190 vmesa
->regHABLRFCb
= 0x0;
1191 vmesa
->regHABLRAb
= 0x0;
1196 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_HABLRCb
;
1197 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_HABLFRA
;
1198 vmesa
->regHABLRFCb
= 0x0;
1199 vmesa
->regHABLRAb
= 0x0;
1204 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_Csrc
;
1205 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_Asrc
;
1207 case GL_ONE_MINUS_SRC_COLOR
:
1208 /* (1, 1, 1, 1) - (Rs, Gs, Bs, As)
1210 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_Csrc
;
1211 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_Asrc
;
1216 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_Cdst
;
1217 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_Adst
;
1219 case GL_ONE_MINUS_DST_COLOR
:
1220 /* (1, 1, 1, 1) - (Rd, Gd, Bd, Ad)
1222 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_Cdst
;
1223 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_Adst
;
1228 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_Asrc
;
1229 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_Asrc
;
1231 case GL_ONE_MINUS_SRC_ALPHA
:
1232 /* (1, 1, 1, 1) - (As, As, As, As)
1234 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_Asrc
;
1235 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_Asrc
;
1239 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
1242 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_HABLRCb
;
1243 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_HABLFRA
;
1244 vmesa
->regHABLRFCb
= 0x0;
1245 vmesa
->regHABLRAb
= 0x0;
1250 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_Adst
;
1251 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_Adst
;
1255 case GL_ONE_MINUS_DST_ALPHA
:
1257 if (vmesa
->viaScreen
->bitsPerPixel
== 16) {
1258 /* (1, 1, 1, 1) - (1, 1, 1, 1) = (0, 0, 0, 0)
1260 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_HABLRCb
;
1261 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_HABLFRA
;
1262 vmesa
->regHABLRFCb
= 0x0;
1263 vmesa
->regHABLRAb
= 0x0;
1266 /* (1, 1, 1, 1) - (Ad, Ad, Ad, Ad)
1268 vmesa
->regHABLCop
|= HC_HABLFCb_InvOPC
| HC_HABLFCb_Adst
;
1269 vmesa
->regHABLAop
|= HC_HABLFAb_InvOPA
| HC_HABLFAb_Adst
;
1274 vmesa
->regHABLCop
|= HC_HABLFCb_OPC
| HC_HABLFCb_HABLRCb
;
1275 vmesa
->regHABLAop
|= HC_HABLFAb_OPA
| HC_HABLFAb_HABLFRA
;
1276 vmesa
->regHABLRFCb
= 0x0;
1277 vmesa
->regHABLRAb
= 0x0;
1281 if (vmesa
->viaScreen
->bitsPerPixel
<= 16)
1282 vmesa
->regEnable
&= ~HC_HenDT_MASK
;
1286 vmesa
->regEnable
&= (~HC_HenABL_MASK
);
1289 if (ctx
->Color
.AlphaEnabled
) {
1290 vmesa
->regEnable
|= HC_HenAT_MASK
;
1291 vmesa
->regHATMD
= FLOAT_TO_UBYTE(ctx
->Color
.AlphaRef
) |
1292 ((ctx
->Color
.AlphaFunc
- GL_NEVER
) << 8);
1295 vmesa
->regEnable
&= (~HC_HenAT_MASK
);
1298 if (ctx
->Color
.DitherFlag
&& (vmesa
->viaScreen
->bitsPerPixel
< 32)) {
1299 if (ctx
->Color
.BlendEnabled
) {
1300 vmesa
->regEnable
&= ~HC_HenDT_MASK
;
1303 vmesa
->regEnable
|= HC_HenDT_MASK
;
1308 vmesa
->regEnable
&= ~HC_HenDT_MASK
;
1310 if (ctx
->Color
.ColorLogicOpEnabled
)
1311 vmesa
->regHROP
= ROP
[ctx
->Color
.LogicOp
& 0xF];
1313 vmesa
->regHROP
= HC_HROP_P
;
1315 vmesa
->regHFBBMSKL
= PACK_COLOR_888(ctx
->Color
.ColorMask
[0],
1316 ctx
->Color
.ColorMask
[1],
1317 ctx
->Color
.ColorMask
[2]);
1318 vmesa
->regHROP
|= ctx
->Color
.ColorMask
[3];
1320 if (ctx
->Color
.ColorMask
[3])
1321 vmesa
->regEnable
|= HC_HenAW_MASK
;
1323 vmesa
->regEnable
&= ~HC_HenAW_MASK
;
1325 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
1328 static void viaChooseFogState(GLcontext
*ctx
)
1330 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1332 if (ctx
->Fog
.Enabled
) {
1335 vmesa
->regEnable
|= HC_HenFOG_MASK
;
1337 /* Use fog equation 0 (OpenGL's default) & local fog.
1339 vmesa
->regHFogLF
= 0x0;
1341 r
= (GLubyte
)(ctx
->Fog
.Color
[0] * 255.0F
);
1342 g
= (GLubyte
)(ctx
->Fog
.Color
[1] * 255.0F
);
1343 b
= (GLubyte
)(ctx
->Fog
.Color
[2] * 255.0F
);
1344 a
= (GLubyte
)(ctx
->Fog
.Color
[3] * 255.0F
);
1345 vmesa
->regHFogCL
= (r
<< 16) | (g
<< 8) | b
;
1346 vmesa
->regHFogCH
= a
;
1349 vmesa
->regEnable
&= ~HC_HenFOG_MASK
;
1353 static void viaChooseDepthState(GLcontext
*ctx
)
1355 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1356 if (ctx
->Depth
.Test
) {
1357 vmesa
->regEnable
|= HC_HenZT_MASK
;
1358 if (ctx
->Depth
.Mask
)
1359 vmesa
->regEnable
|= HC_HenZW_MASK
;
1361 vmesa
->regEnable
&= (~HC_HenZW_MASK
);
1362 vmesa
->regHZWTMD
= (ctx
->Depth
.Func
- GL_NEVER
) << 16;
1366 vmesa
->regEnable
&= ~HC_HenZT_MASK
;
1368 /*=* [DBG] racer : can't display cars in car selection menu *=*/
1369 /*if (ctx->Depth.Mask)
1370 vmesa->regEnable |= HC_HenZW_MASK;
1372 vmesa->regEnable &= (~HC_HenZW_MASK);*/
1373 vmesa
->regEnable
&= (~HC_HenZW_MASK
);
1377 static void viaChooseLightState(GLcontext
*ctx
)
1379 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1381 if (ctx
->Light
.ShadeModel
== GL_SMOOTH
) {
1382 vmesa
->regCmdA
|= HC_HShading_Gouraud
;
1385 vmesa
->regCmdA
&= ~HC_HShading_Gouraud
;
1389 static void viaChooseLineState(GLcontext
*ctx
)
1391 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1393 if (ctx
->Line
.SmoothFlag
) {
1394 vmesa
->regEnable
|= HC_HenAA_MASK
;
1397 if (!ctx
->Polygon
.SmoothFlag
) {
1398 vmesa
->regEnable
&= ~HC_HenAA_MASK
;
1402 if (0 && ctx
->Line
.StippleFlag
) {
1403 vmesa
->regEnable
|= HC_HenLP_MASK
;
1404 vmesa
->regHLP
= ctx
->Line
.StipplePattern
;
1405 vmesa
->regHLPRF
= ctx
->Line
.StippleFactor
;
1408 vmesa
->regEnable
&= ~HC_HenLP_MASK
;
1412 static void viaChoosePolygonState(GLcontext
*ctx
)
1414 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1416 /* KW: FIXME: this should be in viaRasterPrimitive (somehow)
1418 if (ctx
->Polygon
.SmoothFlag
) {
1419 vmesa
->regEnable
|= HC_HenAA_MASK
;
1422 if (!ctx
->Line
.SmoothFlag
) {
1423 vmesa
->regEnable
&= ~HC_HenAA_MASK
;
1427 if (vmesa
->viaScreen
->deviceID
!= VIA_CLE266
) {
1428 if (ctx
->Polygon
.StippleFlag
) {
1429 vmesa
->regEnable
|= HC_HenSP_MASK
;
1432 vmesa
->regEnable
&= ~HC_HenSP_MASK
;
1436 if (ctx
->Polygon
.CullFlag
) {
1437 vmesa
->regEnable
|= HC_HenFBCull_MASK
;
1440 vmesa
->regEnable
&= ~HC_HenFBCull_MASK
;
1444 static void viaChooseStencilState(GLcontext
*ctx
)
1446 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1447 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
1449 if (ctx
->Stencil
.Enabled
) {
1452 vmesa
->regEnable
|= HC_HenST_MASK
;
1453 temp
= (ctx
->Stencil
.Ref
[0] & 0xFF) << HC_HSTREF_SHIFT
;
1454 temp
|= 0xFF << HC_HSTOPMSK_SHIFT
;
1455 temp
|= (ctx
->Stencil
.ValueMask
[0] & 0xFF);
1456 vmesa
->regHSTREF
= temp
;
1458 temp
= (ctx
->Stencil
.Function
[0] - GL_NEVER
) << 16;
1460 switch (ctx
->Stencil
.FailFunc
[0]) {
1462 temp
|= HC_HSTOPSF_KEEP
;
1465 temp
|= HC_HSTOPSF_ZERO
;
1468 temp
|= HC_HSTOPSF_REPLACE
;
1471 temp
|= HC_HSTOPSF_INVERT
;
1474 temp
|= HC_HSTOPSF_INCR
;
1477 temp
|= HC_HSTOPSF_DECR
;
1481 switch (ctx
->Stencil
.ZFailFunc
[0]) {
1483 temp
|= HC_HSTOPSPZF_KEEP
;
1486 temp
|= HC_HSTOPSPZF_ZERO
;
1489 temp
|= HC_HSTOPSPZF_REPLACE
;
1492 temp
|= HC_HSTOPSPZF_INVERT
;
1495 temp
|= HC_HSTOPSPZF_INCR
;
1498 temp
|= HC_HSTOPSPZF_DECR
;
1502 switch (ctx
->Stencil
.ZPassFunc
[0]) {
1504 temp
|= HC_HSTOPSPZP_KEEP
;
1507 temp
|= HC_HSTOPSPZP_ZERO
;
1510 temp
|= HC_HSTOPSPZP_REPLACE
;
1513 temp
|= HC_HSTOPSPZP_INVERT
;
1516 temp
|= HC_HSTOPSPZP_INCR
;
1519 temp
|= HC_HSTOPSPZP_DECR
;
1522 vmesa
->regHSTMD
= temp
;
1525 vmesa
->regEnable
&= ~HC_HenST_MASK
;
1527 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
1532 static void viaChooseTriangle(GLcontext
*ctx
)
1534 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1536 fprintf(stderr
, "%s - in\n", __FUNCTION__
);
1537 fprintf(stderr
, "GL_CULL_FACE = %x\n", GL_CULL_FACE
);
1538 fprintf(stderr
, "ctx->Polygon.CullFlag = %x\n", ctx
->Polygon
.CullFlag
);
1539 fprintf(stderr
, "GL_FRONT = %x\n", GL_FRONT
);
1540 fprintf(stderr
, "ctx->Polygon.CullFaceMode = %x\n", ctx
->Polygon
.CullFaceMode
);
1541 fprintf(stderr
, "GL_CCW = %x\n", GL_CCW
);
1542 fprintf(stderr
, "ctx->Polygon.FrontFace = %x\n", ctx
->Polygon
.FrontFace
);
1544 if (ctx
->Polygon
.CullFlag
== GL_TRUE
) {
1545 switch (ctx
->Polygon
.CullFaceMode
) {
1547 if (ctx
->Polygon
.FrontFace
== GL_CCW
)
1548 vmesa
->regCmdB
|= HC_HBFace_MASK
;
1550 vmesa
->regCmdB
&= ~HC_HBFace_MASK
;
1553 if (ctx
->Polygon
.FrontFace
== GL_CW
)
1554 vmesa
->regCmdB
|= HC_HBFace_MASK
;
1556 vmesa
->regCmdB
&= ~HC_HBFace_MASK
;
1558 case GL_FRONT_AND_BACK
:
1562 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
1565 void viaValidateState( GLcontext
*ctx
)
1567 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1569 if (vmesa
->newState
& _NEW_TEXTURE
) {
1570 viaChooseTextureState(ctx
);
1571 viaUpdateTextureState(ctx
); /* May modify vmesa->Fallback */
1574 if (vmesa
->newState
& _NEW_COLOR
)
1575 viaChooseColorState(ctx
);
1577 if (vmesa
->newState
& _NEW_DEPTH
)
1578 viaChooseDepthState(ctx
);
1580 if (vmesa
->newState
& _NEW_FOG
)
1581 viaChooseFogState(ctx
);
1583 if (vmesa
->newState
& _NEW_LIGHT
)
1584 viaChooseLightState(ctx
);
1586 if (vmesa
->newState
& _NEW_LINE
)
1587 viaChooseLineState(ctx
);
1589 if (vmesa
->newState
& (_NEW_POLYGON
| _NEW_POLYGONSTIPPLE
)) {
1590 viaChoosePolygonState(ctx
);
1591 viaChooseTriangle(ctx
);
1594 if ((vmesa
->newState
& _NEW_STENCIL
) && vmesa
->have_hw_stencil
)
1595 viaChooseStencilState(ctx
);
1597 if (ctx
->_TriangleCaps
& DD_SEPARATE_SPECULAR
)
1598 vmesa
->regEnable
|= HC_HenCS_MASK
;
1600 vmesa
->regEnable
&= ~HC_HenCS_MASK
;
1602 vmesa
->newEmitState
|= vmesa
->newState
;
1603 vmesa
->newState
= 0;
1606 static void viaInvalidateState(GLcontext
*ctx
, GLuint newState
)
1608 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
1610 VIA_FINISH_PRIM( vmesa
);
1611 vmesa
->newState
|= newState
;
1613 _swrast_InvalidateState(ctx
, newState
);
1614 _swsetup_InvalidateState(ctx
, newState
);
1615 _ac_InvalidateState(ctx
, newState
);
1616 _tnl_InvalidateState(ctx
, newState
);
1619 void viaInitStateFuncs(GLcontext
*ctx
)
1621 /* Callbacks for internal Mesa events.
1623 ctx
->Driver
.UpdateState
= viaInvalidateState
;
1627 ctx
->Driver
.BlendEquationSeparate
= viaBlendEquationSeparate
;
1628 ctx
->Driver
.BlendFuncSeparate
= viaBlendFuncSeparate
;
1629 ctx
->Driver
.ClearColor
= viaClearColor
;
1630 ctx
->Driver
.ColorMask
= viaColorMask
;
1631 ctx
->Driver
.DrawBuffer
= viaDrawBuffer
;
1632 ctx
->Driver
.RenderMode
= viaRenderMode
;
1633 ctx
->Driver
.Scissor
= viaScissor
;
1634 ctx
->Driver
.DepthRange
= viaDepthRange
;
1635 ctx
->Driver
.Viewport
= viaViewport
;
1636 ctx
->Driver
.Enable
= viaEnable
;
1637 ctx
->Driver
.PolygonStipple
= viaPolygonStipple
;
1639 /* Pixel path fallbacks.
1641 ctx
->Driver
.Accum
= _swrast_Accum
;
1642 ctx
->Driver
.Bitmap
= _swrast_Bitmap
;
1643 ctx
->Driver
.CopyPixels
= _swrast_CopyPixels
;
1644 ctx
->Driver
.DrawPixels
= _swrast_DrawPixels
;
1645 ctx
->Driver
.ReadPixels
= _swrast_ReadPixels
;
1646 ctx
->Driver
.ResizeBuffers
= viaReAllocateBuffers
;
1648 /* Swrast hooks for imaging extensions:
1650 ctx
->Driver
.CopyColorTable
= _swrast_CopyColorTable
;
1651 ctx
->Driver
.CopyColorSubTable
= _swrast_CopyColorSubTable
;
1652 ctx
->Driver
.CopyConvolutionFilter1D
= _swrast_CopyConvolutionFilter1D
;
1653 ctx
->Driver
.CopyConvolutionFilter2D
= _swrast_CopyConvolutionFilter2D
;