aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/extras/Mesa/src/mesa/drivers/dri/sis/sis_tris.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/extras/Mesa/src/mesa/drivers/dri/sis/sis_tris.c')
-rw-r--r--nx-X11/extras/Mesa/src/mesa/drivers/dri/sis/sis_tris.c1071
1 files changed, 0 insertions, 1071 deletions
diff --git a/nx-X11/extras/Mesa/src/mesa/drivers/dri/sis/sis_tris.c b/nx-X11/extras/Mesa/src/mesa/drivers/dri/sis/sis_tris.c
deleted file mode 100644
index fb0fd1ac0..000000000
--- a/nx-X11/extras/Mesa/src/mesa/drivers/dri/sis/sis_tris.c
+++ /dev/null
@@ -1,1071 +0,0 @@
-/* $XFree86*/ /* -*- c-basic-offset: 3 -*- */
-/**************************************************************************
-
-Copyright 2000 Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan.
-Copyright 2003 Eric Anholt
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-on the rights to use, copy, modify, merge, publish, distribute, sub
-license, and/or sell copies of the Software, and to permit persons to whom
-the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the next
-paragraph) shall be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
-ERIC ANHOLT OR SILICON INTEGRATED SYSTEMS CORP BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-**************************************************************************/
-
-/*
- * Authors:
- * Sung-Ching Lin <sclin@sis.com.tw>
- * Eric Anholt <anholt@FreeBSD.org>
- */
-
-#include "glheader.h"
-#include "mtypes.h"
-#include "colormac.h"
-#include "macros.h"
-
-#include "swrast/swrast.h"
-#include "swrast_setup/swrast_setup.h"
-#include "tnl/t_context.h"
-#include "tnl/t_pipeline.h"
-
-#include "sis_context.h"
-#include "sis_tris.h"
-#include "sis_state.h"
-#include "sis_lock.h"
-#include "sis_span.h"
-#include "sis_alloc.h"
-#include "sis_tex.h"
-
-static const GLuint hw_prim[GL_POLYGON+1] = {
- OP_3D_POINT_DRAW, /* GL_POINTS */
- OP_3D_LINE_DRAW, /* GL_LINES */
- OP_3D_LINE_DRAW, /* GL_LINE_LOOP */
- OP_3D_LINE_DRAW, /* GL_LINE_STRIP */
- OP_3D_TRIANGLE_DRAW, /* GL_TRIANGLES */
- OP_3D_TRIANGLE_DRAW, /* GL_TRIANGLE_STRIP */
- OP_3D_TRIANGLE_DRAW, /* GL_TRIANGLE_FAN */
- OP_3D_TRIANGLE_DRAW, /* GL_QUADS */
- OP_3D_TRIANGLE_DRAW, /* GL_QUAD_STRIP */
- OP_3D_TRIANGLE_DRAW /* GL_POLYGON */
-};
-
-static const GLuint hw_prim_mmio_fire[OP_3D_TRIANGLE_DRAW+1] = {
- OP_3D_FIRE_TSARGBa,
- OP_3D_FIRE_TSARGBb,
- OP_3D_FIRE_TSARGBc
-};
-
-static const GLuint hw_prim_mmio_shade[OP_3D_TRIANGLE_DRAW+1] = {
- SHADE_FLAT_VertexA,
- SHADE_FLAT_VertexB,
- SHADE_FLAT_VertexC
-};
-
-static const GLuint hw_prim_agp_type[OP_3D_TRIANGLE_DRAW+1] = {
- MASK_PsPointList,
- MASK_PsLineList,
- MASK_PsTriangleList
-};
-
-static const GLuint hw_prim_agp_shade[OP_3D_TRIANGLE_DRAW+1] = {
- MASK_PsShadingFlatA,
- MASK_PsShadingFlatB,
- MASK_PsShadingFlatC
-};
-
-static void sisRasterPrimitive( GLcontext *ctx, GLuint hwprim );
-static void sisRenderPrimitive( GLcontext *ctx, GLenum prim );
-
-/***********************************************************************
- * Emit primitives as inline vertices *
- ***********************************************************************/
-
-#define HAVE_QUADS 0
-#define HAVE_LINES 1
-#define HAVE_POINTS 1
-#define CTX_ARG sisContextPtr smesa
-#define GET_VERTEX_DWORDS() smesa->vertex_size
-#define ALLOC_VERTS( n, size ) sisAllocDmaLow( smesa, n * size * sizeof(int) )
-#undef LOCAL_VARS
-#define LOCAL_VARS \
- sisContextPtr smesa = SIS_CONTEXT(ctx); \
- const char *vertptr = smesa->verts;
-#define VERT(x) (sisVertex *)(vertptr + (x * vertsize * sizeof(int)))
-#define VERTEX sisVertex
-#undef TAG
-#define TAG(x) sis_##x
-#include "tnl_dd/t_dd_triemit.h"
-#undef TAG
-#undef LOCAL_VARS
-
-/***********************************************************************
- * Dispatch vertices to hardware through MMIO *
- ***********************************************************************/
-
-/* The ARGB write of the last vertex of the primitive fires the 3d engine, so
- * save it until the end.
- */
-#define SIS_MMIO_WRITE_VERTEX(_v, i, lastvert) \
-do { \
- GLuint __color, __i = 0; \
- MMIO(REG_3D_TSXa+(i)*0x30, _v->ui[__i++]); \
- MMIO(REG_3D_TSYa+(i)*0x30, _v->ui[__i++]); \
- MMIO(REG_3D_TSZa+(i)*0x30, _v->ui[__i++]); \
- if (SIS_STATES & VERT_W) \
- MMIO(REG_3D_TSWGa+(i)*0x30, _v->ui[__i++]); \
- __color = _v->ui[__i++]; \
- if (SIS_STATES & VERT_SPEC) \
- MMIO(REG_3D_TSFSa+(i)*0x30, _v->ui[__i++]); \
- if (SIS_STATES & VERT_UV0) { \
- MMIO(REG_3D_TSUAa+(i)*0x30, _v->ui[__i++]); \
- MMIO(REG_3D_TSVAa+(i)*0x30, _v->ui[__i++]); \
- } \
- if (SIS_STATES & VERT_UV1) { \
- MMIO(REG_3D_TSUBa+(i)*0x30, _v->ui[__i++]); \
- MMIO(REG_3D_TSVBa+(i)*0x30, _v->ui[__i++]); \
- } \
- if (lastvert || (SIS_STATES & VERT_SMOOTH)) \
- MMIO(REG_3D_TSARGBa+(i)*0x30, __color); \
-} while (0)
-
-#define MMIO_VERT_REG_COUNT 10
-
-#define VERT_SMOOTH 0x01
-#define VERT_W 0x02
-#define VERT_SPEC 0x04
-#define VERT_UV0 0x08
-#define VERT_UV1 0x10
-
-typedef void (*mmio_draw_func)(sisContextPtr smesa, char *verts);
-static mmio_draw_func sis_tri_func_mmio[32];
-static mmio_draw_func sis_line_func_mmio[32];
-static mmio_draw_func sis_point_func_mmio[32];
-
-#define SIS_STATES (0)
-#define TAG(x) x##_none
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH)
-#define TAG(x) x##_g
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_W)
-#define TAG(x) x##_w
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_W)
-#define TAG(x) x##_gw
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SPEC)
-#define TAG(x) x##_s
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_SPEC)
-#define TAG(x) x##_gs
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_W | VERT_SPEC)
-#define TAG(x) x##_ws
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_W | VERT_SPEC)
-#define TAG(x) x##_gws
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_UV0)
-#define TAG(x) x##_t0
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_UV0)
-#define TAG(x) x##_gt0
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_W | VERT_UV0)
-#define TAG(x) x##_wt0
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_W | VERT_UV0)
-#define TAG(x) x##_gwt0
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SPEC | VERT_UV0)
-#define TAG(x) x##_st0
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_SPEC | VERT_UV0)
-#define TAG(x) x##_gst0
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_W | VERT_SPEC | VERT_UV0)
-#define TAG(x) x##_wst0
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_W | VERT_SPEC | VERT_UV0)
-#define TAG(x) x##_gwst0
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_UV1)
-#define TAG(x) x##_t1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_UV1)
-#define TAG(x) x##_gt1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_W | VERT_UV1)
-#define TAG(x) x##_wt1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_W | VERT_UV1)
-#define TAG(x) x##_gwt1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SPEC | VERT_UV1)
-#define TAG(x) x##_st1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_SPEC | VERT_UV1)
-#define TAG(x) x##_gst1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_W | VERT_SPEC | VERT_UV1)
-#define TAG(x) x##_wst1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_W | VERT_SPEC | VERT_UV1)
-#define TAG(x) x##_gwst1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_UV0 | VERT_UV1)
-#define TAG(x) x##_t0t1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_UV0 | VERT_UV1)
-#define TAG(x) x##_gt0t1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_W | VERT_UV0 | VERT_UV1)
-#define TAG(x) x##_wt0t1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_W | VERT_UV0 | VERT_UV1)
-#define TAG(x) x##_gwt0t1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SPEC | VERT_UV0 | VERT_UV1)
-#define TAG(x) x##_st0t1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_SPEC | VERT_UV0 | VERT_UV1)
-#define TAG(x) x##_gst0t1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_W | VERT_SPEC | VERT_UV0 | VERT_UV1)
-#define TAG(x) x##_wst0t1
-#include "sis_tritmp.h"
-
-#define SIS_STATES (VERT_SMOOTH | VERT_W | VERT_SPEC | VERT_UV0 | VERT_UV1)
-#define TAG(x) x##_gwst0t1
-#include "sis_tritmp.h"
-
-/***********************************************************************
- * Macros for t_dd_tritmp.h to draw basic primitives *
- ***********************************************************************/
-
-#define TRI( a, b, c ) \
-do { \
- if (DO_FALLBACK) \
- smesa->draw_tri( smesa, a, b, c ); \
- else \
- sis_triangle( smesa, a, b, c ); \
-} while (0)
-
-#define QUAD( a, b, c, d ) \
-do { \
- if (DO_FALLBACK) { \
- smesa->draw_tri( smesa, a, b, d ); \
- smesa->draw_tri( smesa, b, c, d ); \
- } else \
- sis_quad( smesa, a, b, c, d ); \
-} while (0)
-
-#define LINE( v0, v1 ) \
-do { \
- if (DO_FALLBACK) \
- smesa->draw_line( smesa, v0, v1 ); \
- else \
- sis_line( smesa, v0, v1 ); \
-} while (0)
-
-#define POINT( v0 ) \
-do { \
- if (DO_FALLBACK) \
- smesa->draw_point( smesa, v0 ); \
- else \
- sis_point( smesa, v0 ); \
-} while (0)
-
-/***********************************************************************
- * Build render functions from dd templates *
- ***********************************************************************/
-
-#define SIS_OFFSET_BIT 0x01
-#define SIS_TWOSIDE_BIT 0x02
-#define SIS_UNFILLED_BIT 0x04
-#define SIS_FALLBACK_BIT 0x08
-#define SIS_MAX_TRIFUNC 0x10
-
-
-static struct {
- tnl_points_func points;
- tnl_line_func line;
- tnl_triangle_func triangle;
- tnl_quad_func quad;
-} rast_tab[SIS_MAX_TRIFUNC];
-
-
-#define DO_FALLBACK (IND & SIS_FALLBACK_BIT)
-#define DO_OFFSET (IND & SIS_OFFSET_BIT)
-#define DO_UNFILLED (IND & SIS_UNFILLED_BIT)
-#define DO_TWOSIDE (IND & SIS_TWOSIDE_BIT)
-#define DO_FLAT 0
-#define DO_TRI 1
-#define DO_QUAD 1
-#define DO_LINE 1
-#define DO_POINTS 1
-#define DO_FULL_QUAD 1
-
-#define HAVE_RGBA 1
-#define HAVE_SPEC 1
-#define HAVE_BACK_COLORS 0
-#define HAVE_HW_FLATSHADE 1
-#define VERTEX sisVertex
-#define TAB rast_tab
-
-#define DEPTH_SCALE smesa->depth_scale
-#define UNFILLED_TRI unfilled_tri
-#define UNFILLED_QUAD unfilled_quad
-#define VERT_X(_v) _v->v.x
-#define VERT_Y(_v) _v->v.y
-#define VERT_Z(_v) _v->v.z
-#define AREA_IS_CCW( a ) (a > 0)
-#define GET_VERTEX(e) (smesa->verts + (e * smesa->vertex_size * sizeof(int)))
-
-#define VERT_SET_RGBA( v, c ) \
-do { \
- sis_color_t *color = (sis_color_t *)&((v)->ui[coloroffset]); \
- UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]); \
- UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]); \
- UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]); \
- UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]); \
-} while (0)
-
-#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset]
-
-#define VERT_SET_SPEC( v0, c ) \
-do { \
- if (havespec) { \
- UNCLAMPED_FLOAT_TO_UBYTE(v0->v.specular.red, (c)[0]); \
- UNCLAMPED_FLOAT_TO_UBYTE(v0->v.specular.green, (c)[1]); \
- UNCLAMPED_FLOAT_TO_UBYTE(v0->v.specular.blue, (c)[2]); \
- } \
-} while (0)
-#define VERT_COPY_SPEC( v0, v1 ) \
-do { \
- if (havespec) { \
- v0->v.specular.red = v1->v.specular.red; \
- v0->v.specular.green = v1->v.specular.green; \
- v0->v.specular.blue = v1->v.specular.blue; \
- } \
-} while (0)
-
-#define VERT_SAVE_RGBA( idx ) color[idx] = v[idx]->ui[coloroffset]
-#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx]
-#define VERT_SAVE_SPEC( idx ) if (havespec) spec[idx] = v[idx]->ui[5]
-#define VERT_RESTORE_SPEC( idx ) if (havespec) v[idx]->ui[5] = spec[idx]
-
-#define LOCAL_VARS(n) \
- sisContextPtr smesa = SIS_CONTEXT(ctx); \
- GLuint color[n], spec[n]; \
- GLuint coloroffset = (smesa->vertex_size == 4 ? 3 : 4); \
- GLboolean havespec = (smesa->vertex_size == 4 ? 0 : 1); \
- (void) color; (void) spec; (void) coloroffset; (void) havespec;
-
-/***********************************************************************
- * Helpers for rendering unfilled primitives *
- ***********************************************************************/
-
-#define RASTERIZE(x) if (smesa->hw_primitive != hw_prim[x]) \
- sisRasterPrimitive( ctx, hw_prim[x] )
-#define RENDER_PRIMITIVE smesa->render_primitive
-#define IND SIS_FALLBACK_BIT
-#define TAG(x) x
-#include "tnl_dd/t_dd_unfilled.h"
-#undef IND
-
-
-/***********************************************************************
- * Generate GL render functions *
- ***********************************************************************/
-
-
-#define IND (0)
-#define TAG(x) x
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_OFFSET_BIT)
-#define TAG(x) x##_offset
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_TWOSIDE_BIT)
-#define TAG(x) x##_twoside
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_TWOSIDE_BIT|SIS_OFFSET_BIT)
-#define TAG(x) x##_twoside_offset
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_UNFILLED_BIT)
-#define TAG(x) x##_unfilled
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_OFFSET_BIT|SIS_UNFILLED_BIT)
-#define TAG(x) x##_offset_unfilled
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_TWOSIDE_BIT|SIS_UNFILLED_BIT)
-#define TAG(x) x##_twoside_unfilled
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_TWOSIDE_BIT|SIS_OFFSET_BIT|SIS_UNFILLED_BIT)
-#define TAG(x) x##_twoside_offset_unfilled
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_FALLBACK_BIT)
-#define TAG(x) x##_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_OFFSET_BIT|SIS_FALLBACK_BIT)
-#define TAG(x) x##_offset_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_TWOSIDE_BIT|SIS_FALLBACK_BIT)
-#define TAG(x) x##_twoside_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_TWOSIDE_BIT|SIS_OFFSET_BIT|SIS_FALLBACK_BIT)
-#define TAG(x) x##_twoside_offset_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_UNFILLED_BIT|SIS_FALLBACK_BIT)
-#define TAG(x) x##_unfilled_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_OFFSET_BIT|SIS_UNFILLED_BIT|SIS_FALLBACK_BIT)
-#define TAG(x) x##_offset_unfilled_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_TWOSIDE_BIT|SIS_UNFILLED_BIT|SIS_FALLBACK_BIT)
-#define TAG(x) x##_twoside_unfilled_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-#define IND (SIS_TWOSIDE_BIT|SIS_OFFSET_BIT|SIS_UNFILLED_BIT| \
- SIS_FALLBACK_BIT)
-#define TAG(x) x##_twoside_offset_unfilled_fallback
-#include "tnl_dd/t_dd_tritmp.h"
-
-
-static void init_rast_tab( void )
-{
- init();
- init_offset();
- init_twoside();
- init_twoside_offset();
- init_unfilled();
- init_offset_unfilled();
- init_twoside_unfilled();
- init_twoside_offset_unfilled();
- init_fallback();
- init_offset_fallback();
- init_twoside_fallback();
- init_twoside_offset_fallback();
- init_unfilled_fallback();
- init_offset_unfilled_fallback();
- init_twoside_unfilled_fallback();
- init_twoside_offset_unfilled_fallback();
-}
-
-
-
-/***********************************************************************
- * Rasterization fallback helpers *
- ***********************************************************************/
-
-
-/* This code is hit only when a mix of accelerated and unaccelerated
- * primitives are being drawn, and only for the unaccelerated
- * primitives.
- */
-
-static void
-sis_fallback_tri( sisContextPtr smesa,
- sisVertex *v0,
- sisVertex *v1,
- sisVertex *v2 )
-{
- GLcontext *ctx = smesa->glCtx;
- SWvertex v[3];
- _swsetup_Translate( ctx, v0, &v[0] );
- _swsetup_Translate( ctx, v1, &v[1] );
- _swsetup_Translate( ctx, v2, &v[2] );
- sisSpanRenderStart( ctx );
- _swrast_Triangle( ctx, &v[0], &v[1], &v[2] );
- sisSpanRenderFinish( ctx );
- _swrast_flush( ctx );
-}
-
-
-static void
-sis_fallback_line( sisContextPtr smesa,
- sisVertex *v0,
- sisVertex *v1 )
-{
- GLcontext *ctx = smesa->glCtx;
- SWvertex v[2];
- _swsetup_Translate( ctx, v0, &v[0] );
- _swsetup_Translate( ctx, v1, &v[1] );
- sisSpanRenderStart( ctx );
- _swrast_Line( ctx, &v[0], &v[1] );
- sisSpanRenderFinish( ctx );
- _swrast_flush( ctx );
-}
-
-
-static void
-sis_fallback_point( sisContextPtr smesa,
- sisVertex *v0 )
-{
- GLcontext *ctx = smesa->glCtx;
- SWvertex v[1];
- _swsetup_Translate( ctx, v0, &v[0] );
- sisSpanRenderStart( ctx );
- _swrast_Point( ctx, &v[0] );
- sisSpanRenderFinish( ctx );
- _swrast_flush( ctx );
-}
-
-
-
-/**********************************************************************/
-/* Render unclipped begin/end objects */
-/**********************************************************************/
-
-#define IND 0
-#define V(x) (sisVertex *)(vertptr + (x * vertsize * sizeof(int)))
-#define RENDER_POINTS( start, count ) \
- for ( ; start < count ; start++) \
- POINT( V(ELT(start)) )
-#define RENDER_LINE( v0, v1 ) LINE( V(v0), V(v1) )
-#define RENDER_TRI( v0, v1, v2 ) TRI( V(v0), V(v1), V(v2) )
-#define RENDER_QUAD( v0, v1, v2, v3 ) QUAD( V(v0), V(v1), V(v2), V(v3) )
-#define INIT(x) sisRenderPrimitive( ctx, x )
-#undef LOCAL_VARS
-#define LOCAL_VARS \
- sisContextPtr smesa = SIS_CONTEXT(ctx); \
- const GLuint vertsize = smesa->vertex_size; \
- const char *vertptr = (char *)smesa->verts; \
- const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \
- (void) elt;
-#define RESET_STIPPLE
-#define RESET_OCCLUSION
-#define PRESERVE_VB_DEFS
-#define ELT(x) (x)
-#define TAG(x) sis_##x##_verts
-#include "tnl/t_vb_rendertmp.h"
-#undef ELT
-#undef TAG
-#define TAG(x) sis_##x##_elts
-#define ELT(x) elt[x]
-#include "tnl/t_vb_rendertmp.h"
-
-
-/**********************************************************************/
-/* Choose render functions */
-/**********************************************************************/
-
-#define POINT_FALLBACK (DD_POINT_SMOOTH)
-#define LINE_FALLBACK (DD_LINE_STIPPLE|DD_LINE_SMOOTH)
-#define TRI_FALLBACK (DD_TRI_STIPPLE|DD_TRI_SMOOTH)
-#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK)
-#define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET|DD_TRI_UNFILLED)
-#define _SIS_NEW_RENDER_STATE (ANY_RASTER_FLAGS | ANY_FALLBACK_FLAGS)
-
-static void sisChooseRenderState(GLcontext *ctx)
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- sisContextPtr smesa = SIS_CONTEXT( ctx );
- GLuint flags = ctx->_TriangleCaps;
- GLuint index = 0;
-
- if (flags & (ANY_RASTER_FLAGS|ANY_FALLBACK_FLAGS)) {
-
- if (flags & ANY_RASTER_FLAGS) {
- if (flags & DD_TRI_LIGHT_TWOSIDE) index |= SIS_TWOSIDE_BIT;
- if (flags & DD_TRI_OFFSET) index |= SIS_OFFSET_BIT;
- if (flags & DD_TRI_UNFILLED) index |= SIS_UNFILLED_BIT;
- }
-
- smesa->draw_point = sis_point;
- smesa->draw_line = sis_line;
- smesa->draw_tri = sis_triangle;
- /* Hook in fallbacks for specific primitives.
- */
- if (flags & ANY_FALLBACK_FLAGS) {
- if (flags & POINT_FALLBACK)
- smesa->draw_point = sis_fallback_point;
- if (flags & LINE_FALLBACK)
- smesa->draw_line = sis_fallback_line;
- if (flags & TRI_FALLBACK)
- smesa->draw_tri = sis_fallback_tri;
- index |= SIS_FALLBACK_BIT;
- }
- }
-
- if (index != smesa->RenderIndex) {
- smesa->RenderIndex = index;
-
- tnl->Driver.Render.Points = rast_tab[index].points;
- tnl->Driver.Render.Line = rast_tab[index].line;
- tnl->Driver.Render.ClippedLine = rast_tab[index].line;
- tnl->Driver.Render.Triangle = rast_tab[index].triangle;
- tnl->Driver.Render.Quad = rast_tab[index].quad;
-
- if (index == 0) {
- tnl->Driver.Render.PrimTabVerts = sis_render_tab_verts;
- tnl->Driver.Render.PrimTabElts = sis_render_tab_elts;
- tnl->Driver.Render.ClippedPolygon = sis_fast_clipped_poly;
- } else {
- tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
- tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
- tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;
- }
- }
-}
-
-/**********************************************************************/
-/* Multipass rendering for front buffering */
-/**********************************************************************/
-static GLboolean multipass_cliprect( GLcontext *ctx, GLuint pass )
-{
- sisContextPtr smesa = SIS_CONTEXT( ctx );
-
- if (pass >= smesa->driDrawable->numClipRects) {
- return GL_FALSE;
- } else {
- GLint x1, y1, x2, y2;
-
- x1 = smesa->driDrawable->pClipRects[pass].x1 - smesa->driDrawable->x;
- y1 = smesa->driDrawable->pClipRects[pass].y1 - smesa->driDrawable->y;
- x2 = smesa->driDrawable->pClipRects[pass].x2 - smesa->driDrawable->x;
- y2 = smesa->driDrawable->pClipRects[pass].y2 - smesa->driDrawable->y;
-
- if (ctx->Scissor.Enabled) {
- GLint scisy1 = Y_FLIP(ctx->Scissor.Y + ctx->Scissor.Height - 1);
- GLint scisy2 = Y_FLIP(ctx->Scissor.Y);
-
- if (ctx->Scissor.X > x1)
- x1 = ctx->Scissor.X;
- if (scisy1 > y1)
- y1 = scisy1;
- if (ctx->Scissor.X + ctx->Scissor.Width - 1 < x2)
- x2 = ctx->Scissor.X + ctx->Scissor.Width - 1;
- if (scisy2 < y2)
- y2 = scisy2;
- }
-
- MMIO(REG_3D_ClipTopBottom, y1 << 13 | y2);
- MMIO(REG_3D_ClipLeftRight, x1 << 13 | x2);
- /* Mark that we clobbered these registers */
- smesa->GlobalFlag |= GFLAG_CLIPPING;
- return GL_TRUE;
- }
-}
-
-
-
-/**********************************************************************/
-/* Validate state at pipeline start */
-/**********************************************************************/
-
-static void sisRunPipeline( GLcontext *ctx )
-{
- sisContextPtr smesa = SIS_CONTEXT( ctx );
-
- if (!smesa->Fallback && smesa->NewGLState) {
- if (smesa->NewGLState & _NEW_TEXTURE) {
- SIS_FIREVERTICES(smesa);
- sisUpdateTextureState(ctx);
- }
-
- if (smesa->NewGLState & _SIS_NEW_RENDER_STATE)
- sisChooseRenderState( ctx );
-
- smesa->NewGLState = 0;
- }
-
- _tnl_run_pipeline( ctx );
-
- /* XXX: If we put flushing in sis_state.c and friends, we can avoid this.
- * Is it worth it?
- */
- SIS_FIREVERTICES(smesa);
-}
-
-/**********************************************************************/
-/* High level hooks for t_vb_render.c */
-/**********************************************************************/
-
-/* This is called when Mesa switches between rendering triangle
- * primitives (such as GL_POLYGON, GL_QUADS, GL_TRIANGLE_STRIP, etc),
- * and lines, points and bitmaps.
- */
-
-static void sisRasterPrimitive( GLcontext *ctx, GLuint hwprim )
-{
- sisContextPtr smesa = SIS_CONTEXT(ctx);
- if (smesa->hw_primitive != hwprim) {
- SIS_FIREVERTICES(smesa);
- smesa->hw_primitive = hwprim;
- smesa->AGPParseSet &= ~(MASK_PsDataType | MASK_PsShadingMode);
- smesa->dwPrimitiveSet &= ~(MASK_DrawPrimitiveCommand |
- MASK_SetFirePosition | MASK_ShadingMode);
- smesa->AGPParseSet |= hw_prim_agp_type[hwprim];
- smesa->dwPrimitiveSet |= hwprim | hw_prim_mmio_fire[hwprim];
- if (ctx->Light.ShadeModel == GL_FLAT) {
- smesa->AGPParseSet |= hw_prim_agp_shade[hwprim];
- smesa->dwPrimitiveSet |= hw_prim_mmio_shade[hwprim];
- } else {
- smesa->AGPParseSet |= MASK_PsShadingSmooth;
- smesa->dwPrimitiveSet |= SHADE_GOURAUD;
- }
- }
-}
-
-static void sisRenderPrimitive( GLcontext *ctx, GLenum prim )
-{
- sisContextPtr smesa = SIS_CONTEXT(ctx);
-
- smesa->render_primitive = prim;
-
- if (prim >= GL_TRIANGLES && (ctx->_TriangleCaps & DD_TRI_UNFILLED))
- return;
- sisRasterPrimitive( ctx, hw_prim[prim] );
-}
-
-#define EMIT_ATTR( ATTR, STYLE) \
-do { \
- smesa->vertex_attrs[smesa->vertex_attr_count].attrib = (ATTR); \
- smesa->vertex_attrs[smesa->vertex_attr_count].format = (STYLE); \
- smesa->vertex_attr_count++; \
-} while (0)
-
-#define EMIT_PAD( N ) \
-do { \
- smesa->vertex_attrs[smesa->vertex_attr_count].attrib = 0; \
- smesa->vertex_attrs[smesa->vertex_attr_count].format = EMIT_PAD; \
- smesa->vertex_attrs[smesa->vertex_attr_count].offset = (N); \
- smesa->vertex_attr_count++; \
-} while (0)
-
-#define SIS_TCL_STATE_BITS \
- (_TNL_BITS_TEX_ANY | _TNL_BIT_COLOR1 | _TNL_BIT_FOG)
-
-static void sisRenderStart( GLcontext *ctx )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- sisContextPtr smesa = SIS_CONTEXT(ctx);
- struct vertex_buffer *VB = &tnl->vb;
- GLuint index = tnl->render_inputs;
- GLuint AGPParseSet = smesa->AGPParseSet;
- GLboolean tex_fallback = GL_FALSE;
-
- if (ctx->DrawBuffer->_ColorDrawBufferMask[0] == BUFFER_BIT_FRONT_LEFT &&
- smesa->driDrawable->numClipRects != 0)
- {
- multipass_cliprect(ctx, 0);
- if (smesa->driDrawable->numClipRects > 1)
- tnl->Driver.Render.Multipass = multipass_cliprect;
- else
- tnl->Driver.Render.Multipass = NULL;
- } else {
- tnl->Driver.Render.Multipass = NULL;
- }
-
- /* Important:
- */
- VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
- smesa->vertex_attr_count = 0;
-
- /* EMIT_ATTR's must be in order as they tell t_vertex.c how to build up a
- * hardware vertex.
- */
-
- AGPParseSet &= ~(MASK_VertexDWSize | MASK_VertexDataFormat);
- AGPParseSet |= SiS_PS_HAS_XYZ | SiS_PS_HAS_DIFFUSE;
- if (index & _TNL_BITS_TEX_ANY) {
- EMIT_ATTR(_TNL_ATTRIB_POS, EMIT_4F_VIEWPORT);
- AGPParseSet |= SiS_PS_HAS_W;
- } else {
- EMIT_ATTR(_TNL_ATTRIB_POS, EMIT_3F_VIEWPORT);
- }
-
- EMIT_ATTR(_TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA);
-
- if (index & (_TNL_BIT_COLOR1|_TNL_BIT_FOG)) {
- AGPParseSet |= SiS_PS_HAS_SPECULAR;
-
- if (index & _TNL_BIT_COLOR1) {
- EMIT_ATTR(_TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR);
- } else {
- EMIT_PAD(3);
- }
-
- if (index & _TNL_BIT_FOG)
- EMIT_ATTR(_TNL_ATTRIB_FOG, EMIT_1UB_1F);
- else
- EMIT_PAD(1);
- }
-
- /* projective textures are not supported by the hardware */
- if (index & _TNL_BIT_TEX(0)) {
- if (VB->TexCoordPtr[0]->size > 2)
- tex_fallback = GL_TRUE;
- EMIT_ATTR(_TNL_ATTRIB_TEX0, EMIT_2F);
- AGPParseSet |= SiS_PS_HAS_UV0;
- }
- if (index & _TNL_BIT_TEX(1)) {
- if (VB->TexCoordPtr[1]->size > 2)
- tex_fallback = GL_TRUE;
- EMIT_ATTR(_TNL_ATTRIB_TEX1, EMIT_2F);
- AGPParseSet |= SiS_PS_HAS_UV1;
- }
- FALLBACK(smesa, SIS_FALLBACK_TEXTURE, tex_fallback);
-
- if (smesa->last_tcl_state != index) {
- smesa->AGPParseSet = AGPParseSet;
-
- smesa->vertex_size = _tnl_install_attrs( ctx, smesa->vertex_attrs,
- smesa->vertex_attr_count, smesa->hw_viewport, 0 );
-
- smesa->vertex_size >>= 2;
- smesa->AGPParseSet |= smesa->vertex_size << 28;
- }
-}
-
-static void sisRenderFinish( GLcontext *ctx )
-{
-}
-
-/**********************************************************************/
-/* AGP/PCI vertex submission */
-/**********************************************************************/
-
-void
-sisFlushPrimsLocked(sisContextPtr smesa)
-{
- if (smesa->vb_cur == smesa->vb_last)
- return;
-
- sisUpdateHWState(smesa->glCtx);
-
- if (smesa->using_agp) {
- mWait3DCmdQueue(8);
- mEndPrimitive();
- MMIO(REG_3D_AGPCmBase, (smesa->vb_last - smesa->vb) +
- smesa->vb_agp_offset);
- MMIO(REG_3D_AGPTtDwNum, ((smesa->vb_cur - smesa->vb_last) / 4) |
- 0x50000000);
- MMIO(REG_3D_ParsingSet, smesa->AGPParseSet);
- MMIO(REG_3D_AGPCmFire, (GLint)(-1));
- mEndPrimitive();
- } else {
- int mmio_index = 0, incr = 0;
- void (*sis_emit_func)(sisContextPtr smesa, char *verts) = NULL;
-
- if (smesa->AGPParseSet & MASK_PsShadingSmooth)
- mmio_index |= VERT_SMOOTH;
- if (smesa->AGPParseSet & SiS_PS_HAS_SPECULAR)
- mmio_index |= VERT_SPEC;
- if (smesa->AGPParseSet & SiS_PS_HAS_W)
- mmio_index |= VERT_W;
- if (smesa->AGPParseSet & SiS_PS_HAS_UV0)
- mmio_index |= VERT_UV0;
- if (smesa->AGPParseSet & SiS_PS_HAS_UV1)
- mmio_index |= VERT_UV1;
-
- switch (smesa->AGPParseSet & MASK_PsDataType) {
- case MASK_PsPointList:
- incr = smesa->vertex_size * 4;
- sis_emit_func = sis_point_func_mmio[mmio_index];
- break;
- case MASK_PsLineList:
- incr = smesa->vertex_size * 4 * 2;
- sis_emit_func = sis_line_func_mmio[mmio_index];
- break;
- case MASK_PsTriangleList:
- incr = smesa->vertex_size * 4 * 3;
- sis_emit_func = sis_tri_func_mmio[mmio_index];
- break;
- }
-
- mWait3DCmdQueue(1);
- MMIO(REG_3D_PrimitiveSet, smesa->dwPrimitiveSet);
- while (smesa->vb_last < smesa->vb_cur) {
- sis_emit_func(smesa, smesa->vb_last);
- smesa->vb_last += incr;
- }
- mWait3DCmdQueue(1);
- mEndPrimitive();
-
- /* With PCI, we can just start writing to the start of the VB again. */
- smesa->vb_cur = smesa->vb;
- }
- smesa->vb_last = smesa->vb_cur;
-}
-
-void sisFlushPrims(sisContextPtr smesa)
-{
- LOCK_HARDWARE();
- sisFlushPrimsLocked(smesa);
- UNLOCK_HARDWARE();
-}
-
-/**********************************************************************/
-/* Transition to/from hardware rasterization. */
-/**********************************************************************/
-
-void sisFallback( GLcontext *ctx, GLuint bit, GLboolean mode )
-{
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- sisContextPtr smesa = SIS_CONTEXT(ctx);
- GLuint oldfallback = smesa->Fallback;
-
- if (mode) {
- smesa->Fallback |= bit;
- if (oldfallback == 0) {
- SIS_FIREVERTICES(smesa);
- _swsetup_Wakeup( ctx );
- smesa->RenderIndex = ~0;
- }
- }
- else {
- smesa->Fallback &= ~bit;
- if (oldfallback == bit) {
- _swrast_flush( ctx );
- tnl->Driver.Render.Start = sisRenderStart;
- tnl->Driver.Render.PrimitiveNotify = sisRenderPrimitive;
- tnl->Driver.Render.Finish = sisRenderFinish;
-
- tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
- tnl->Driver.Render.CopyPV = _tnl_copy_pv;
- tnl->Driver.Render.Interp = _tnl_interp;
-
- _tnl_invalidate_vertex_state( ctx, ~0 );
- _tnl_invalidate_vertices( ctx, ~0 );
- _tnl_install_attrs( ctx,
- smesa->vertex_attrs,
- smesa->vertex_attr_count,
- smesa->hw_viewport, 0 );
-
- smesa->NewGLState |= _SIS_NEW_RENDER_STATE;
- }
- }
-}
-
-
-/**********************************************************************/
-/* Initialization. */
-/**********************************************************************/
-
-void sisInitTriFuncs( GLcontext *ctx )
-{
- sisContextPtr smesa = SIS_CONTEXT(ctx);
- TNLcontext *tnl = TNL_CONTEXT(ctx);
- static int firsttime = 1;
-
- if (firsttime) {
- init_rast_tab();
- firsttime = 0;
-
- sis_vert_init_none();
- sis_vert_init_g();
- sis_vert_init_w();
- sis_vert_init_gw();
- sis_vert_init_s();
- sis_vert_init_gs();
- sis_vert_init_ws();
- sis_vert_init_gws();
- sis_vert_init_t0();
- sis_vert_init_gt0();
- sis_vert_init_wt0();
- sis_vert_init_gwt0();
- sis_vert_init_st0();
- sis_vert_init_gst0();
- sis_vert_init_wst0();
- sis_vert_init_gwst0();
- sis_vert_init_t1();
- sis_vert_init_gt1();
- sis_vert_init_wt1();
- sis_vert_init_gwt1();
- sis_vert_init_st1();
- sis_vert_init_gst1();
- sis_vert_init_wst1();
- sis_vert_init_gwst1();
- sis_vert_init_t0t1();
- sis_vert_init_gt0t1();
- sis_vert_init_wt0t1();
- sis_vert_init_gwt0t1();
- sis_vert_init_st0t1();
- sis_vert_init_gst0t1();
- sis_vert_init_wst0t1();
- sis_vert_init_gwst0t1();
- }
-
- if (driQueryOptionb(&smesa->optionCache, "fallback_force"))
- sisFallback(ctx, SIS_FALLBACK_FORCE, 1);
- else
- sisFallback(ctx, SIS_FALLBACK_FORCE, 0);
-
- smesa->RenderIndex = ~0;
- smesa->NewGLState |= _SIS_NEW_RENDER_STATE;
-
- tnl->Driver.RunPipeline = sisRunPipeline;
- tnl->Driver.Render.Start = sisRenderStart;
- tnl->Driver.Render.Finish = sisRenderFinish;
- tnl->Driver.Render.PrimitiveNotify = sisRenderPrimitive;
- tnl->Driver.Render.ResetLineStipple = _swrast_ResetLineStipple;
-
- tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
- tnl->Driver.Render.CopyPV = _tnl_copy_pv;
- tnl->Driver.Render.Interp = _tnl_interp;
-
- _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12,
- (6 + 2*ctx->Const.MaxTextureUnits) * sizeof(GLfloat) );
-
- smesa->verts = (char *)tnl->clipspace.vertex_buf;
-}