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.
35 #include "swrast/swrast.h"
36 #include "swrast_setup/swrast_setup.h"
37 #include "tnl/t_context.h"
38 #include "tnl/t_pipeline.h"
40 #include "via_context.h"
42 #include "via_state.h"
44 #include "via_ioctl.h"
46 /***********************************************************************
47 * Emit primitives as inline vertices *
48 ***********************************************************************/
51 #define COPY_DWORDS(vb, vertsize, v) \
55 __asm__ __volatile__("rep ; movsl" \
56 : "=%c" (j), "=D" (vb), "=S" (__tmp) \
62 #define COPY_DWORDS(vb, vertsize, v) \
65 for (j = 0; j < vertsize; j++) \
66 vb[j] = ((GLuint *)v)[j]; \
71 static void __inline__
via_draw_triangle(viaContextPtr vmesa
,
76 GLuint vertsize
= vmesa
->vertexSize
;
77 GLuint
*vb
= viaAllocDma(vmesa
, 3 * 4 * vertsize
);
78 /* fprintf(stderr, "%s: %p %p %p\n", __FUNCTION__, v0, v1, v2); */
79 COPY_DWORDS(vb
, vertsize
, v0
);
80 COPY_DWORDS(vb
, vertsize
, v1
);
81 COPY_DWORDS(vb
, vertsize
, v2
);
85 static void __inline__
via_draw_quad(viaContextPtr vmesa
,
91 GLuint vertsize
= vmesa
->vertexSize
;
92 GLuint
*vb
= viaAllocDma(vmesa
, 6 * 4 * vertsize
);
94 /* fprintf(stderr, "%s: %p %p %p %p\n", __FUNCTION__, v0, v1, v2, v3); */
95 COPY_DWORDS(vb
, vertsize
, v0
);
96 COPY_DWORDS(vb
, vertsize
, v1
);
97 COPY_DWORDS(vb
, vertsize
, v3
);
98 COPY_DWORDS(vb
, vertsize
, v1
);
99 COPY_DWORDS(vb
, vertsize
, v2
);
100 COPY_DWORDS(vb
, vertsize
, v3
);
103 static __inline__
void via_draw_line(viaContextPtr vmesa
,
107 GLuint vertsize
= vmesa
->vertexSize
;
108 GLuint
*vb
= viaAllocDma(vmesa
, 2 * 4 * vertsize
);
109 COPY_DWORDS(vb
, vertsize
, v0
);
110 COPY_DWORDS(vb
, vertsize
, v1
);
114 static __inline__
void via_draw_point(viaContextPtr vmesa
,
117 GLuint vertsize
= vmesa
->vertexSize
;
118 GLuint
*vb
= viaAllocDma(vmesa
, 4 * vertsize
);
119 COPY_DWORDS(vb
, vertsize
, v0
);
125 /***********************************************************************
126 * Macros for via_dd_tritmp.h to draw basic primitives *
127 ***********************************************************************/
129 #define TRI(a, b, c) \
131 if (VIA_DEBUG) fprintf(stderr, "hw TRI\n"); \
133 vmesa->drawTri(vmesa, a, b, c); \
135 via_draw_triangle(vmesa, a, b, c); \
138 #define QUAD(a, b, c, d) \
140 if (VIA_DEBUG) fprintf(stderr, "hw QUAD\n");\
142 vmesa->drawTri(vmesa, a, b, d); \
143 vmesa->drawTri(vmesa, b, c, d); \
146 via_draw_quad(vmesa, a, b, c, d); \
149 #define LINE(v0, v1) \
151 if(VIA_DEBUG) fprintf(stderr, "hw LINE\n");\
153 vmesa->drawLine(vmesa, v0, v1); \
155 via_draw_line(vmesa, v0, v1); \
160 if (VIA_DEBUG) fprintf(stderr, "hw POINT\n");\
162 vmesa->drawPoint(vmesa, v0); \
164 via_draw_point(vmesa, v0); \
168 /***********************************************************************
169 * Build render functions from dd templates *
170 ***********************************************************************/
172 #define VIA_OFFSET_BIT 0x01
173 #define VIA_TWOSIDE_BIT 0x02
174 #define VIA_UNFILLED_BIT 0x04
175 #define VIA_FALLBACK_BIT 0x08
176 #define VIA_MAX_TRIFUNC 0x10
180 tnl_points_func points
;
182 tnl_triangle_func triangle
;
184 } rast_tab
[VIA_MAX_TRIFUNC
];
187 #define DO_FALLBACK (IND & VIA_FALLBACK_BIT)
188 #define DO_OFFSET (IND & VIA_OFFSET_BIT)
189 #define DO_UNFILLED (IND & VIA_UNFILLED_BIT)
190 #define DO_TWOSIDE (IND & VIA_TWOSIDE_BIT)
196 #define DO_FULL_QUAD 1
200 #define HAVE_BACK_COLORS 0
201 #define HAVE_HW_FLATSHADE 1
202 #define VERTEX viaVertex
205 /* Only used to pull back colors into vertices (ie, we know color is
208 #define VIA_COLOR(dst, src) \
216 #define VIA_SPEC(dst, src) \
224 #define DEPTH_SCALE (1.0 / 0xffff)
225 #define UNFILLED_TRI unfilled_tri
226 #define UNFILLED_QUAD unfilled_quad
227 #define VERT_X(_v) _v->v.x
228 #define VERT_Y(_v) _v->v.y
229 #define VERT_Z(_v) _v->v.z
230 #define AREA_IS_CCW(a) (a > 0)
231 #define GET_VERTEX(e) (vmesa->verts + (e * vmesa->vertexSize * sizeof(int)))
233 #define VERT_SET_RGBA(v, c) VIA_COLOR(v->ub4[coloroffset], c)
234 #define VERT_COPY_RGBA(v0, v1) v0->ui[coloroffset] = v1->ui[coloroffset]
235 #define VERT_SAVE_RGBA(idx) color[idx] = v[idx]->ui[coloroffset]
236 #define VERT_RESTORE_RGBA(idx) v[idx]->ui[coloroffset] = color[idx]
237 #define VERT_SET_SPEC(v, c) if (havespec) VIA_SPEC(v->ub4[5], c)
238 #define VERT_COPY_SPEC(v0, v1) if (havespec) COPY_3V(v0->ub4[5], v1->ub4[5])
239 #define VERT_SAVE_SPEC(idx) if (havespec) spec[idx] = v[idx]->ui[5]
240 #define VERT_RESTORE_SPEC(idx) if (havespec) v[idx]->ui[5] = spec[idx]
243 #define LOCAL_VARS(n) \
244 viaContextPtr vmesa = VIA_CONTEXT(ctx); \
245 GLuint color[n], spec[n]; \
246 GLuint coloroffset = (vmesa->vertexSize == 4 ? 3 : 4); \
247 GLboolean havespec = (vmesa->vertexSize > 4); \
248 (void)color; (void)spec; (void)coloroffset; (void)havespec;
251 /***********************************************************************
252 * Helpers for rendering unfilled primitives *
253 ***********************************************************************/
255 static const GLenum hwPrim
[GL_POLYGON
+ 1] = {
269 #define RASTERIZE(x) viaRasterPrimitive( ctx, x, hwPrim[x] )
270 #define RENDER_PRIMITIVE vmesa->renderPrimitive
272 #define IND VIA_FALLBACK_BIT
273 #include "tnl_dd/t_dd_unfilled.h"
277 /***********************************************************************
278 * Generate GL render functions *
279 ***********************************************************************/
284 #include "tnl_dd/t_dd_tritmp.h"
286 #define IND (VIA_OFFSET_BIT)
287 #define TAG(x) x##_offset
288 #include "tnl_dd/t_dd_tritmp.h"
290 #define IND (VIA_TWOSIDE_BIT)
291 #define TAG(x) x##_twoside
292 #include "tnl_dd/t_dd_tritmp.h"
294 #define IND (VIA_TWOSIDE_BIT|VIA_OFFSET_BIT)
295 #define TAG(x) x##_twoside_offset
296 #include "tnl_dd/t_dd_tritmp.h"
298 #define IND (VIA_UNFILLED_BIT)
299 #define TAG(x) x##_unfilled
300 #include "tnl_dd/t_dd_tritmp.h"
302 #define IND (VIA_OFFSET_BIT|VIA_UNFILLED_BIT)
303 #define TAG(x) x##_offset_unfilled
304 #include "tnl_dd/t_dd_tritmp.h"
306 #define IND (VIA_TWOSIDE_BIT|VIA_UNFILLED_BIT)
307 #define TAG(x) x##_twoside_unfilled
308 #include "tnl_dd/t_dd_tritmp.h"
310 #define IND (VIA_TWOSIDE_BIT|VIA_OFFSET_BIT|VIA_UNFILLED_BIT)
311 #define TAG(x) x##_twoside_offset_unfilled
312 #include "tnl_dd/t_dd_tritmp.h"
314 #define IND (VIA_FALLBACK_BIT)
315 #define TAG(x) x##_fallback
316 #include "tnl_dd/t_dd_tritmp.h"
318 #define IND (VIA_OFFSET_BIT|VIA_FALLBACK_BIT)
319 #define TAG(x) x##_offset_fallback
320 #include "tnl_dd/t_dd_tritmp.h"
322 #define IND (VIA_TWOSIDE_BIT|VIA_FALLBACK_BIT)
323 #define TAG(x) x##_twoside_fallback
324 #include "tnl_dd/t_dd_tritmp.h"
326 #define IND (VIA_TWOSIDE_BIT|VIA_OFFSET_BIT|VIA_FALLBACK_BIT)
327 #define TAG(x) x##_twoside_offset_fallback
328 #include "tnl_dd/t_dd_tritmp.h"
330 #define IND (VIA_UNFILLED_BIT|VIA_FALLBACK_BIT)
331 #define TAG(x) x##_unfilled_fallback
332 #include "tnl_dd/t_dd_tritmp.h"
334 #define IND (VIA_OFFSET_BIT|VIA_UNFILLED_BIT|VIA_FALLBACK_BIT)
335 #define TAG(x) x##_offset_unfilled_fallback
336 #include "tnl_dd/t_dd_tritmp.h"
338 #define IND (VIA_TWOSIDE_BIT|VIA_UNFILLED_BIT|VIA_FALLBACK_BIT)
339 #define TAG(x) x##_twoside_unfilled_fallback
340 #include "tnl_dd/t_dd_tritmp.h"
342 #define IND (VIA_TWOSIDE_BIT|VIA_OFFSET_BIT|VIA_UNFILLED_BIT| \
344 #define TAG(x) x##_twoside_offset_unfilled_fallback
345 #include "tnl_dd/t_dd_tritmp.h"
348 static void init_rast_tab(void)
353 init_twoside_offset();
355 init_offset_unfilled();
356 init_twoside_unfilled();
357 init_twoside_offset_unfilled();
359 init_offset_fallback();
360 init_twoside_fallback();
361 init_twoside_offset_fallback();
362 init_unfilled_fallback();
363 init_offset_unfilled_fallback();
364 init_twoside_unfilled_fallback();
365 init_twoside_offset_unfilled_fallback();
369 /***********************************************************************
370 * Rasterization fallback helpers *
371 ***********************************************************************/
374 /* This code is hit only when a mix of accelerated and unaccelerated
375 * primitives are being drawn, and only for the unaccelerated
379 via_fallback_tri(viaContextPtr vmesa
,
384 GLcontext
*ctx
= vmesa
->glCtx
;
386 via_translate_vertex(ctx
, v0
, &v
[0]);
387 via_translate_vertex(ctx
, v1
, &v
[1]);
388 via_translate_vertex(ctx
, v2
, &v
[2]);
389 _swrast_Triangle(ctx
, &v
[0], &v
[1], &v
[2]);
394 via_fallback_line(viaContextPtr vmesa
,
398 GLcontext
*ctx
= vmesa
->glCtx
;
400 via_translate_vertex(ctx
, v0
, &v
[0]);
401 via_translate_vertex(ctx
, v1
, &v
[1]);
402 _swrast_Line(ctx
, &v
[0], &v
[1]);
407 via_fallback_point(viaContextPtr vmesa
,
410 GLcontext
*ctx
= vmesa
->glCtx
;
412 via_translate_vertex(ctx
, v0
, &v
[0]);
413 _swrast_Point(ctx
, &v
[0]);
416 /**********************************************************************/
417 /* Render unclipped begin/end objects */
418 /**********************************************************************/
420 #define V(x) (viaVertex *)(vertptr + ((x) * vertsize * sizeof(int)))
421 #define RENDER_POINTS(start, count) \
422 for (; start < count; start++) POINT(V(ELT(start)));
423 #define RENDER_LINE(v0, v1) LINE(V(v0), V(v1))
424 #define RENDER_TRI( v0, v1, v2) TRI( V(v0), V(v1), V(v2))
425 #define RENDER_QUAD(v0, v1, v2, v3) QUAD(V(v0), V(v1), V(v2), V(v3))
426 #define INIT(x) viaRasterPrimitive(ctx, x, hwPrim[x])
429 viaContextPtr vmesa = VIA_CONTEXT(ctx); \
430 GLubyte *vertptr = (GLubyte *)vmesa->verts; \
431 const GLuint vertsize = vmesa->vertexSize; \
432 const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \
434 #define RESET_STIPPLE
435 #define RESET_OCCLUSION
436 #define PRESERVE_VB_DEFS
438 #define TAG(x) via_fast##x##_verts
439 #include "tnl/t_vb_rendertmp.h"
442 #define TAG(x) via_fast##x##_elts
443 #define ELT(x) elt[x]
444 #include "tnl/t_vb_rendertmp.h"
447 #undef NEED_EDGEFLAG_SETUP
450 #undef RESET_OCCLUSION
453 /**********************************************************************/
454 /* Render clipped primitives */
455 /**********************************************************************/
459 static void viaRenderClippedPoly(GLcontext
*ctx
, const GLuint
*elts
,
462 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
463 struct vertex_buffer
*VB
= &TNL_CONTEXT(ctx
)->vb
;
464 GLuint prim
= VIA_CONTEXT(ctx
)->renderPrimitive
;
466 /* Render the new vertices as an unclipped polygon.
469 GLuint
*tmp
= VB
->Elts
;
470 VB
->Elts
= (GLuint
*)elts
;
471 tnl
->Driver
.Render
.PrimTabElts
[GL_POLYGON
](ctx
, 0, n
,
472 PRIM_BEGIN
|PRIM_END
);
476 /* Restore the render primitive
478 if (prim
!= GL_POLYGON
)
479 tnl
->Driver
.Render
.PrimitiveNotify( ctx
, prim
);
482 static void viaRenderClippedLine(GLcontext
*ctx
, GLuint ii
, GLuint jj
)
484 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
485 tnl
->Driver
.Render
.Line(ctx
, ii
, jj
);
488 static void viaFastRenderClippedPoly(GLcontext
*ctx
, const GLuint
*elts
,
491 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
492 GLuint vertsize
= vmesa
->vertexSize
;
493 GLuint
*vb
= viaAllocDma(vmesa
, (n
- 2) * 3 * 4 * vertsize
);
494 GLubyte
*vertptr
= (GLubyte
*)vmesa
->verts
;
495 const GLuint
*start
= (const GLuint
*)V(elts
[0]);
498 for (i
= 2; i
< n
; i
++) {
499 COPY_DWORDS(vb
, vertsize
, V(elts
[i
- 1]));
500 COPY_DWORDS(vb
, vertsize
, V(elts
[i
]));
501 COPY_DWORDS(vb
, vertsize
, start
);
505 /**********************************************************************/
506 /* Choose render functions */
507 /**********************************************************************/
511 #define _VIA_NEW_RENDERSTATE (_DD_NEW_LINE_STIPPLE | \
512 _DD_NEW_TRI_UNFILLED | \
513 _DD_NEW_TRI_LIGHT_TWOSIDE | \
514 _DD_NEW_TRI_OFFSET | \
515 _DD_NEW_TRI_STIPPLE | \
518 #define POINT_FALLBACK (0)
519 /*#define LINE_FALLBACK (DD_LINE_STIPPLE)
521 #define LINE_FALLBACK (0)
522 #define TRI_FALLBACK (0)
523 #define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK)
524 #define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET|DD_TRI_UNFILLED)
526 static void viaChooseRenderState(GLcontext
*ctx
)
528 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
529 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
530 GLuint flags
= ctx
->_TriangleCaps
;
532 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
534 if (VIA_DEBUG
) fprintf(stderr
, "_TriangleCaps = %x\n", flags
);
535 if (flags
& (ANY_FALLBACK_FLAGS
|ANY_RASTER_FLAGS
)) {
536 if (flags
& ANY_RASTER_FLAGS
) {
537 if (flags
& DD_TRI_LIGHT_TWOSIDE
) index
|= VIA_TWOSIDE_BIT
;
538 if (flags
& DD_TRI_OFFSET
) index
|= VIA_OFFSET_BIT
;
539 if (flags
& DD_TRI_UNFILLED
) index
|= VIA_UNFILLED_BIT
;
542 vmesa
->drawPoint
= via_draw_point
;
543 vmesa
->drawLine
= via_draw_line
;
544 vmesa
->drawTri
= via_draw_triangle
;
546 /* Hook in fallbacks for specific primitives.
548 if (flags
& ANY_FALLBACK_FLAGS
) {
549 if (flags
& POINT_FALLBACK
)
550 vmesa
->drawPoint
= via_fallback_point
;
552 if (flags
& LINE_FALLBACK
)
553 vmesa
->drawLine
= via_fallback_line
;
555 if (flags
& TRI_FALLBACK
)
556 vmesa
->drawTri
= via_fallback_tri
;
558 index
|= VIA_FALLBACK_BIT
;
562 fprintf(stderr
, "index = %x\n", index
);
563 fprintf(stderr
, "renderIndex = %x\n", vmesa
->renderIndex
);
565 if (vmesa
->renderIndex
!= index
) {
566 vmesa
->renderIndex
= index
;
568 tnl
->Driver
.Render
.Points
= rast_tab
[index
].points
;
569 tnl
->Driver
.Render
.Line
= rast_tab
[index
].line
;
570 tnl
->Driver
.Render
.Triangle
= rast_tab
[index
].triangle
;
572 tnl
->Driver
.Render
.Quad
= rast_tab
[index
].quad
;
575 tnl
->Driver
.Render
.PrimTabVerts
= via_fastrender_tab_verts
;
576 tnl
->Driver
.Render
.PrimTabElts
= via_fastrender_tab_elts
;
577 tnl
->Driver
.Render
.ClippedLine
= line
; /* from tritmp.h */
578 tnl
->Driver
.Render
.ClippedPolygon
= viaFastRenderClippedPoly
;
581 tnl
->Driver
.Render
.PrimTabVerts
= _tnl_render_tab_verts
;
582 tnl
->Driver
.Render
.PrimTabElts
= _tnl_render_tab_elts
;
583 tnl
->Driver
.Render
.ClippedLine
= viaRenderClippedLine
;
584 tnl
->Driver
.Render
.ClippedPolygon
= viaRenderClippedPoly
;
587 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
594 /**********************************************************************/
595 /* High level hooks for t_vb_render.c */
596 /**********************************************************************/
598 static void viaRunPipeline(GLcontext
*ctx
)
600 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
602 if (vmesa
->newState
) {
603 viaValidateState( ctx
);
605 if (!vmesa
->Fallback
) {
606 viaChooseVertexState(ctx
);
607 viaChooseRenderState(ctx
);
611 _tnl_run_pipeline(ctx
);
614 static void viaRenderStart(GLcontext
*ctx
)
616 /* Check for projective texturing. Make sure all texcoord
617 * pointers point to something. (fix in mesa?)
619 viaCheckTexSizes(ctx
);
622 static void viaRenderFinish(GLcontext
*ctx
)
624 if (VIA_CONTEXT(ctx
)->renderIndex
& VIA_FALLBACK_BIT
)
627 VIA_FINISH_PRIM(VIA_CONTEXT(ctx
));
632 /* System to flush dma and emit state changes based on the rasterized
635 void viaRasterPrimitive(GLcontext
*ctx
,
639 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
644 fprintf(stderr
, "%s: %s/%s\n", __FUNCTION__
, _mesa_lookup_enum_by_nr(glprim
),
645 _mesa_lookup_enum_by_nr(hwprim
));
647 VIA_FINISH_PRIM(vmesa
);
649 vmesa
->renderPrimitive
= glprim
;
651 regCmdB
= vmesa
->regCmdB
;
655 vmesa
->regCmdA_End
= vmesa
->regCmdA
| HC_HPMType_Point
| HC_HVCycle_Full
;
656 if (ctx
->Light
.ShadeModel
== GL_FLAT
)
657 vmesa
->regCmdA_End
|= HC_HShading_FlatA
;
660 vmesa
->regCmdA_End
= vmesa
->regCmdA
| HC_HPMType_Line
| HC_HVCycle_Full
;
661 if (ctx
->Light
.ShadeModel
== GL_FLAT
)
662 vmesa
->regCmdA_End
|= HC_HShading_FlatB
;
666 vmesa
->regCmdA_End
= vmesa
->regCmdA
| HC_HPMType_Line
| HC_HVCycle_AFP
|
667 HC_HVCycle_AB
| HC_HVCycle_NewB
;
668 regCmdB
|= HC_HVCycle_AB
| HC_HVCycle_NewB
| HC_HLPrst_MASK
;
669 if (ctx
->Light
.ShadeModel
== GL_FLAT
)
670 vmesa
->regCmdA_End
|= HC_HShading_FlatB
;
673 vmesa
->regCmdA_End
= vmesa
->regCmdA
| HC_HPMType_Tri
| HC_HVCycle_Full
;
674 if (ctx
->Light
.ShadeModel
== GL_FLAT
)
675 vmesa
->regCmdA_End
|= HC_HShading_FlatC
;
677 case GL_TRIANGLE_STRIP
:
678 vmesa
->regCmdA_End
= vmesa
->regCmdA
| HC_HPMType_Tri
| HC_HVCycle_AFP
|
679 HC_HVCycle_AC
| HC_HVCycle_BB
| HC_HVCycle_NewC
;
680 regCmdB
|= HC_HVCycle_AA
| HC_HVCycle_BC
| HC_HVCycle_NewC
;
681 if (ctx
->Light
.ShadeModel
== GL_FLAT
)
682 vmesa
->regCmdA_End
|= HC_HShading_FlatB
;
684 case GL_TRIANGLE_FAN
:
685 vmesa
->regCmdA_End
= vmesa
->regCmdA
| HC_HPMType_Tri
| HC_HVCycle_AFP
|
686 HC_HVCycle_AA
| HC_HVCycle_BC
| HC_HVCycle_NewC
;
687 regCmdB
|= HC_HVCycle_AA
| HC_HVCycle_BC
| HC_HVCycle_NewC
;
688 if (ctx
->Light
.ShadeModel
== GL_FLAT
)
689 vmesa
->regCmdA_End
|= HC_HShading_FlatC
;
698 vmesa
->regCmdA_End
= vmesa
->regCmdA
| HC_HPMType_Tri
| HC_HVCycle_AFP
|
699 HC_HVCycle_AA
| HC_HVCycle_BC
| HC_HVCycle_NewC
;
700 regCmdB
|= HC_HVCycle_AA
| HC_HVCycle_BC
| HC_HVCycle_NewC
;
701 if (ctx
->Light
.ShadeModel
== GL_FLAT
)
702 vmesa
->regCmdA_End
|= HC_HShading_FlatC
;
709 assert((vmesa
->dmaLow
& 0x4) == 0);
712 OUT_RING( HC_HEADER2
);
713 OUT_RING( (HC_ParaType_NotTex
<< 16) );
714 OUT_RING( 0xCCCCCCCC );
715 OUT_RING( 0xDDDDDDDD );
717 OUT_RING( HC_HEADER2
);
718 OUT_RING( (HC_ParaType_CmdVdata
<< 16) );
720 OUT_RING( vmesa
->regCmdA_End
);
723 vmesa
->dmaLastPrim
= vmesa
->dmaLow
;
724 vmesa
->hwPrimitive
= hwprim
;
727 /* Callback for mesa:
729 static void viaRenderPrimitive( GLcontext
*ctx
, GLuint prim
)
731 viaRasterPrimitive( ctx
, prim
, hwPrim
[prim
] );
735 void viaFinishPrimitive(viaContextPtr vmesa
)
737 if (!vmesa
->dmaLastPrim
) {
740 else if (vmesa
->dmaLow
!= vmesa
->dmaLastPrim
) {
741 GLuint cmdA
= vmesa
->regCmdA_End
| HC_HPLEND_MASK
| HC_HPMValidN_MASK
| HC_HE3Fire_MASK
;
744 /* KW: modified 0x1 to 0x4 below:
746 if ((vmesa
->dmaLow
& 0x1) || !vmesa
->useAgp
) {
747 BEGIN_RING_NOCHECK( 1 );
752 BEGIN_RING_NOCHECK( 2 );
757 vmesa
->dmaLastPrim
= 0;
759 if (1 || vmesa
->dmaLow
> VIA_DMA_HIGHWATER
)
760 viaFlushPrims( vmesa
);
763 assert(vmesa
->dmaLow
>= (32 + DMA_OFFSET
));
765 vmesa
->dmaLastPrim
= 0;
770 /**********************************************************************/
771 /* Transition to/from hardware rasterization. */
772 /**********************************************************************/
775 void viaFallback(viaContextPtr vmesa
, GLuint bit
, GLboolean mode
)
777 GLcontext
*ctx
= vmesa
->glCtx
;
778 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
779 GLuint oldfallback
= vmesa
->Fallback
;
780 if (VIA_DEBUG
) fprintf(stderr
, "%s old %x bit %x mode %d\n", __FUNCTION__
,
781 vmesa
->Fallback
, bit
, mode
);
784 vmesa
->Fallback
|= bit
;
785 if (oldfallback
== 0) {
786 if (VIA_DEBUG
) fprintf(stderr
, "ENTER FALLBACK\n");
787 VIA_FLUSH_DMA(vmesa
);
788 _swsetup_Wakeup(ctx
);
789 vmesa
->renderIndex
= ~0;
793 vmesa
->Fallback
&= ~bit
;
794 if (oldfallback
== bit
) {
795 if (VIA_DEBUG
) fprintf(stderr
, "LEAVE FALLBACK\n");
796 tnl
->Driver
.Render
.Start
= viaRenderStart
;
797 tnl
->Driver
.Render
.PrimitiveNotify
= viaRenderPrimitive
;
798 tnl
->Driver
.Render
.Finish
= viaRenderFinish
;
799 tnl
->Driver
.Render
.BuildVertices
= viaBuildVertices
;
800 vmesa
->newState
|= (_VIA_NEW_RENDERSTATE
|_VIA_NEW_VERTEX
);
807 /**********************************************************************/
808 /* Initialization. */
809 /**********************************************************************/
812 void viaInitTriFuncs(GLcontext
*ctx
)
814 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
815 static int firsttime
= 1;
822 tnl
->Driver
.RunPipeline
= viaRunPipeline
;
823 tnl
->Driver
.Render
.Start
= viaRenderStart
;
824 tnl
->Driver
.Render
.Finish
= viaRenderFinish
;
825 tnl
->Driver
.Render
.PrimitiveNotify
= viaRenderPrimitive
;
826 tnl
->Driver
.Render
.ResetLineStipple
= _swrast_ResetLineStipple
;
827 tnl
->Driver
.Render
.BuildVertices
= viaBuildVertices
;