summaryrefslogtreecommitdiff
path: root/src/mesa
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2000-11-05 18:20:18 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2000-11-05 18:20:18 +0000
commit7c20642b1091df1aab7d9076a3fe2fb11c6f011c (patch)
tree4519747c5c3cc6201ca1d460ae967c3a4aafed12 /src/mesa
parentc6f348cbc908556da4f68a65cdf218ebd4e678be (diff)
A new module to provide RasterSetup and advanced triangle/line/point
functionality layered on top of the software rasterizer. An example entrypoint: void _swsetup_Triangle( GLcontext, GLuint, GLuint, GLuint, GLuint ) will coerce the software rasterizer to draw flat, twoside-lit, unfilled and offset triangles (including decomposition to points or lines).
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/swrast_setup/NOTES80
-rw-r--r--src/mesa/swrast_setup/ss_context.c230
-rw-r--r--src/mesa/swrast_setup/ss_context.h68
-rw-r--r--src/mesa/swrast_setup/ss_triangle.c161
-rw-r--r--src/mesa/swrast_setup/ss_triangle.h38
-rw-r--r--src/mesa/swrast_setup/ss_tritmp.h286
-rw-r--r--src/mesa/swrast_setup/ss_vb.c173
-rw-r--r--src/mesa/swrast_setup/ss_vb.h37
-rw-r--r--src/mesa/swrast_setup/ss_vbtmp.h117
-rw-r--r--src/mesa/swrast_setup/swrast_setup.h70
10 files changed, 1260 insertions, 0 deletions
diff --git a/src/mesa/swrast_setup/NOTES b/src/mesa/swrast_setup/NOTES
new file mode 100644
index 0000000000..4445b332d9
--- /dev/null
+++ b/src/mesa/swrast_setup/NOTES
@@ -0,0 +1,80 @@
+INTRODUCTION
+
+A helper module which provides glue to bind the software rasterizer to
+the software t&l module. The main task of this module is to build
+swrast vertices from the t&l vertex_buffer structs, and to use them to
+perform triangle setup functions not implemented in the software
+rasterizer.
+
+The module provides a RasterSetup function to plug into the t&l driver
+interface. This hook had previously been used for hardware
+rasterizers, with the software rasterizer taking its data directly
+from the vertex buffer.
+
+There are strong advantages to decoupling the software rasterizer from
+the t&l module, primarily allowing hardware drivers better control
+over fallbacks, the removal of implicit knowledge about the software
+rasterizer in the t&l module, allowing the two modules to evolve
+independently and allowing either to be substituted with equivalent
+functionality from another codebase.
+
+This module provides helpers for triangle/quad setup for offset,
+unfilled and twoside-lit triangles. The software rasterizer doesn't
+handle these primitives directly.
+
+Hardware rasterization drivers probably have little use for this
+module. Rather, they might provide a layer that translates their
+native (hardware) vertices to swrast vertices before calling into the
+swrast module for fallbacks.
+
+STATE
+
+This module associates an array of SWvertex structs with each VB.
+Thus there are:
+
+ GLboolean _swsetup_RegisterVB( struct vertex_buffer *VB );
+ void _swsetup_UnregisterVB( struct vertex_buffer *VB );
+
+Which must be called to create and destroy internal vertex storage for
+this module.
+
+To create and destroy the module itself:
+
+ GLboolean _swsetup_CreateContext( GLcontext *ctx );
+ void _swsetup_DestroyContext( GLcontext *ctx );
+
+Like the software rasterizer, this module tracks state changes
+internally and maintains a set of entry points which will always
+reflect the current state. For this to work, the driver must call:
+
+ void _swsetup_InvalidateState( GLcontext *ctx, GLuint new_state );
+
+SERVICES
+
+The module provides the following entrypoints:
+
+ void _swrast_RasterSetup( struct vertex_buffer *VB,
+ GLuint start, GLuint end );
+
+Build SWvertices for <VB> between indices start and end.
+
+ void _swsetup_Quad( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint v3, GLuint pv );
+
+ void _swsetup_Triangle( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint pv );
+
+ void _swsetup_Line( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv );
+
+
+ void _swsetup_Points( GLcontext *ctx, GLuint first, GLuint last );
+
+Draw quad, triangle, line, points. Note that these are in the format
+expected by core mesa. The Quad and Triangle functions handle
+unfilled, offset, twoside-lit and flat-shaded primitives correctly.
+
+These functions can thus be plugged into the ctx->Driver struct and
+left permanently in place, providing the InvalidateState() routine is
+correctly called on state changes.
+
+ \ No newline at end of file
diff --git a/src/mesa/swrast_setup/ss_context.c b/src/mesa/swrast_setup/ss_context.c
new file mode 100644
index 0000000000..4809e6f328
--- /dev/null
+++ b/src/mesa/swrast_setup/ss_context.c
@@ -0,0 +1,230 @@
+/* $Id: ss_context.c,v 1.1 2000/11/05 18:20:18 keithw Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * Copyright (C) 1999 Brian Paul 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
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL 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:
+ * Keith Whitwell <keithw@valinux.com>
+ */
+
+
+#include "glheader.h"
+#include "mem.h"
+
+
+#include "ss_context.h"
+#include "ss_triangle.h"
+#include "ss_vb.h"
+
+#include "swrast_setup.h"
+
+
+/* Stub for swsetup->Triangle to select a true triangle function
+ * after a state change.
+ */
+static void
+_swsetup_validate_quad( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint v3, GLuint pv )
+{
+ _swsetup_choose_trifuncs( ctx );
+ SWSETUP_CONTEXT(ctx)->Quad( ctx, v0, v1, v2, v3, pv );
+}
+
+static void
+_swsetup_validate_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint pv )
+{
+ _swsetup_choose_trifuncs( ctx );
+ SWSETUP_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2, pv );
+}
+
+static void
+_swsetup_validate_line( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv )
+{
+ _swsetup_choose_trifuncs( ctx );
+ SWSETUP_CONTEXT(ctx)->Line( ctx, v0, v1, pv );
+}
+
+
+static void
+_swsetup_validate_points( GLcontext *ctx, GLuint first, GLuint last )
+{
+ _swsetup_choose_trifuncs( ctx );
+ SWSETUP_CONTEXT(ctx)->Points( ctx, first, last );
+}
+
+
+
+static void
+_swsetup_validate_rastersetup( struct vertex_buffer *VB,
+ GLuint start, GLuint end )
+{
+ GLcontext *ctx = VB->ctx;
+ _swsetup_choose_rastersetup_func( ctx );
+ SWSETUP_CONTEXT(ctx)->RasterSetup( VB, start, end );
+}
+
+
+#define _SWSETUP_NEW_RASTERSETUP (_NEW_RENDERMODE| \
+ _NEW_TEXTURE| \
+ _NEW_COLOR| \
+ _NEW_FOG| \
+ _NEW_POINT)
+
+#define _SWSETUP_NEW_RENDERINDEX (_NEW_POLYGON|_NEW_LIGHT)
+
+
+#if 0
+/* TODO: sleep/wakeup mechanism
+ */
+static void
+_swsetup_sleep( GLcontext *ctx, GLuint new_state )
+{
+}
+#endif
+
+static void
+_swsetup_invalidate_state( GLcontext *ctx, GLuint new_state )
+{
+ SScontext *swsetup = SWSETUP_CONTEXT(ctx);
+
+ swsetup->NewState |= new_state;
+
+
+ if (new_state & _SWSETUP_NEW_RENDERINDEX) {
+ swsetup->Triangle = _swsetup_validate_triangle;
+ swsetup->Line = _swsetup_validate_line;
+ swsetup->Points = _swsetup_validate_points;
+ swsetup->Quad = _swsetup_validate_quad;
+ }
+
+ if (new_state & _SWSETUP_NEW_RASTERSETUP) {
+ swsetup->RasterSetup = _swsetup_validate_rastersetup;
+ }
+}
+
+
+
+/* Dispatch from these fixed entrypoints to the state-dependent
+ * functions:
+ */
+void
+_swsetup_Quad( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint v3, GLuint pv )
+{
+ SWSETUP_CONTEXT(ctx)->Quad( ctx, v0, v1, v2, v3, pv );
+}
+
+void
+_swsetup_Triangle( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint pv )
+{
+ SWSETUP_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2, pv );
+}
+
+void
+_swsetup_Line( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv )
+{
+ SWSETUP_CONTEXT(ctx)->Line( ctx, v0, v1, pv );
+}
+
+
+void
+_swsetup_Points( GLcontext *ctx, GLuint first, GLuint last )
+{
+ SWSETUP_CONTEXT(ctx)->Points( ctx, first, last );
+}
+
+void
+_swsetup_RasterSetup( struct vertex_buffer *VB, GLuint start, GLuint end )
+{
+ SWSETUP_CONTEXT(VB->ctx)->RasterSetup( VB, start, end );
+}
+
+void
+_swsetup_InvalidateState( GLcontext *ctx, GLuint new_state )
+{
+ SWSETUP_CONTEXT(ctx)->InvalidateState( ctx, new_state );
+}
+
+
+GLboolean
+_swsetup_CreateContext( GLcontext *ctx )
+{
+ SScontext *swsetup = (SScontext *)CALLOC(sizeof(SScontext));
+
+ if (!swsetup)
+ return GL_FALSE;
+
+ ctx->swsetup_context = swsetup;
+
+ swsetup->NewState = ~0;
+ swsetup->InvalidateState = _swsetup_invalidate_state;
+ swsetup->Quad = _swsetup_validate_quad;
+ swsetup->Triangle = _swsetup_validate_triangle;
+ swsetup->Line = _swsetup_validate_line;
+ swsetup->Points = _swsetup_validate_points;
+ swsetup->RasterSetup = _swsetup_validate_rastersetup;
+
+ _swsetup_vb_init( ctx );
+ _swsetup_trifuncs_init( ctx );
+
+ return GL_TRUE;
+}
+
+void
+_swsetup_DestroyContext( GLcontext *ctx )
+{
+ if (SWSETUP_CONTEXT(ctx)) {
+ FREE(SWSETUP_CONTEXT(ctx));
+ ctx->swsetup_context = 0;
+ }
+}
+
+GLboolean
+_swsetup_RegisterVB( struct vertex_buffer *VB )
+{
+ SSvertexbuffer *ssvb = (SSvertexbuffer *)CALLOC(sizeof(SSvertexbuffer) );
+
+ ssvb->verts = ALIGN_MALLOC( sizeof(SWvertex) * VB->Size, 32);
+ if (!ssvb->verts) {
+ FREE(ssvb);
+ return GL_FALSE;
+ }
+
+ VB->swsetup_vb = ssvb;
+ return GL_TRUE;
+}
+
+
+void
+_swsetup_UnregisterVB( struct vertex_buffer *VB )
+{
+ SSvertexbuffer *ssvb = SWSETUP_VB(VB);
+
+ if (ssvb) {
+ if (ssvb->verts) ALIGN_FREE(ssvb->verts);
+ FREE(ssvb);
+ VB->swsetup_vb = 0;
+ }
+}
diff --git a/src/mesa/swrast_setup/ss_context.h b/src/mesa/swrast_setup/ss_context.h
new file mode 100644
index 0000000000..61da923105
--- /dev/null
+++ b/src/mesa/swrast_setup/ss_context.h
@@ -0,0 +1,68 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * Copyright (C) 1999 Brian Paul 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
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL 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:
+ * Keith Whitwell <keithw@valinux.com>
+ */
+
+#ifndef SS_CONTEXT_H
+#define SS_CONTEXT_H
+
+#include "types.h"
+#include "swrast/swrast.h"
+#include "swrast_setup.h"
+
+typedef struct {
+ GLuint NewState;
+ GLuint StateChanges;
+
+ /* Function hooks, trigger lazy state updates.
+ */
+ void (*InvalidateState)( GLcontext *ctx, GLuint new_state );
+
+ void (*RasterSetup)( struct vertex_buffer *VB, GLuint start, GLuint end );
+
+ void (*Quad)( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint v3, GLuint pv );
+
+ void (*Triangle)( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint pv );
+
+ void (*Line)( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv );
+
+ void (*Points)( GLcontext *ctx, GLuint first, GLuint last );
+
+} SScontext;
+
+typedef struct {
+
+ SWvertex *verts;
+
+} SSvertexbuffer;
+
+
+#define SWSETUP_CONTEXT(ctx) ((SScontext *)ctx->swsetup_context)
+#define SWSETUP_VB(VB) ((SSvertexbuffer *)VB->swsetup_vb)
+
+
+#endif
diff --git a/src/mesa/swrast_setup/ss_triangle.c b/src/mesa/swrast_setup/ss_triangle.c
new file mode 100644
index 0000000000..992bc4f396
--- /dev/null
+++ b/src/mesa/swrast_setup/ss_triangle.c
@@ -0,0 +1,161 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * Copyright (C) 1999 Brian Paul 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
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL 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:
+ * Keith Whitwell <keithw@valinux.com>
+ */
+
+#include "glheader.h"
+#include "macros.h"
+#include "types.h"
+
+#include "ss_triangle.h"
+#include "ss_context.h"
+
+#define SS_FLAT_BIT 0x1
+#define SS_OFFSET_BIT 0x2
+#define SS_TWOSIDE_BIT 0x4
+#define SS_UNFILLED_BIT 0x10
+#define SS_MAX_TRIFUNC 0x20
+
+static triangle_func tri_tab[SS_MAX_TRIFUNC];
+static line_func line_tab[SS_MAX_TRIFUNC];
+static points_func points_tab[SS_MAX_TRIFUNC];
+static quad_func quad_tab[SS_MAX_TRIFUNC];
+
+
+#define SS_COLOR(a,b) COPY_4UBV(a,b)
+#define SS_SPEC(a,b) COPY_4UBV(a,b)
+#define SS_IND(a,b) (a = b)
+
+#define IND (0)
+#define TAG(x) x
+#include "ss_tritmp.h"
+
+#define IND (SS_FLAT_BIT)
+#define TAG(x) x##_flat
+#include "ss_tritmp.h"
+
+#define IND (SS_OFFSET_BIT)
+#define TAG(x) x##_offset
+#include "ss_tritmp.h"
+
+#define IND (SS_FLAT_BIT|SS_OFFSET_BIT)
+#define TAG(x) x##_flat_offset
+#include "ss_tritmp.h"
+
+#define IND (SS_TWOSIDE_BIT)
+#define TAG(x) x##_twoside
+#include "ss_tritmp.h"
+
+#define IND (SS_FLAT_BIT|SS_TWOSIDE_BIT)
+#define TAG(x) x##_flat_twoside
+#include "ss_tritmp.h"
+
+#define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT)
+#define TAG(x) x##_offset_twoside
+#include "ss_tritmp.h"
+
+#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_TWOSIDE_BIT)
+#define TAG(x) x##_flat_offset_twoside
+#include "ss_tritmp.h"
+
+#define IND (SS_UNFILLED_BIT)
+#define TAG(x) x##_unfilled
+#include "ss_tritmp.h"
+
+#define IND (SS_FLAT_BIT|SS_UNFILLED_BIT)
+#define TAG(x) x##_flat_unfilled
+#include "ss_tritmp.h"
+
+#define IND (SS_OFFSET_BIT|SS_UNFILLED_BIT)
+#define TAG(x) x##_offset_unfilled
+#include "ss_tritmp.h"
+
+#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_UNFILLED_BIT)
+#define TAG(x) x##_flat_offset_unfilled
+#include "ss_tritmp.h"
+
+#define IND (SS_TWOSIDE_BIT|SS_UNFILLED_BIT)
+#define TAG(x) x##_twoside_unfilled
+#include "ss_tritmp.h"
+
+#define IND (SS_FLAT_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT)
+#define TAG(x) x##_flat_twoside_unfilled
+#include "ss_tritmp.h"
+
+#define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT)
+#define TAG(x) x##_offset_twoside_unfilled
+#include "ss_tritmp.h"
+
+#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT)
+#define TAG(x) x##_flat_offset_twoside_unfilled
+#include "ss_tritmp.h"
+
+
+void _swsetup_trifuncs_init( GLcontext *ctx )
+{
+ (void) ctx;
+
+ init();
+ init_flat();
+ init_offset();
+ init_flat_offset();
+ init_twoside();
+ init_flat_twoside();
+ init_offset_twoside();
+ init_flat_offset_twoside();
+ init_unfilled();
+ init_flat_unfilled();
+ init_offset_unfilled();
+ init_flat_offset_unfilled();
+ init_twoside_unfilled();
+ init_flat_twoside_unfilled();
+ init_offset_twoside_unfilled();
+ init_flat_offset_twoside_unfilled();
+}
+
+
+void _swsetup_choose_trifuncs( GLcontext *ctx )
+{
+ SScontext *swsetup = SWSETUP_CONTEXT(ctx);
+ GLuint ind = 0;
+
+ if (ctx->Light.ShadeModel == GL_FLAT)
+ ind |= SS_FLAT_BIT;
+
+ if (ctx->Polygon._OffsetAny)
+ ind |= SS_OFFSET_BIT;
+
+ if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
+ ind |= SS_TWOSIDE_BIT;
+
+ if (ctx->Polygon._Unfilled)
+ ind |= SS_UNFILLED_BIT;
+
+ swsetup->Triangle = tri_tab[ind];
+ swsetup->Line = line_tab[ind];
+ swsetup->Points = points_tab[ind];
+ swsetup->Quad = quad_tab[ind];
+}
+
diff --git a/src/mesa/swrast_setup/ss_triangle.h b/src/mesa/swrast_setup/ss_triangle.h
new file mode 100644
index 0000000000..1c6a419dd8
--- /dev/null
+++ b/src/mesa/swrast_setup/ss_triangle.h
@@ -0,0 +1,38 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * Copyright (C) 1999 Brian Paul 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
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL 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:
+ * Keith Whitwell <keithw@valinux.com>
+ */
+
+#ifndef SS_TRIANGLE_H
+#define SS_TRIANGLE_H
+
+#include "types.h"
+#include "ss_context.h"
+
+
+void _swsetup_trifuncs_init( GLcontext *ctx );
+void _swsetup_choose_trifuncs( GLcontext *ctx );
+
+#endif
diff --git a/src/mesa/swrast_setup/ss_tritmp.h b/src/mesa/swrast_setup/ss_tritmp.h
new file mode 100644
index 0000000000..570827a1b5
--- /dev/null
+++ b/src/mesa/swrast_setup/ss_tritmp.h
@@ -0,0 +1,286 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * Copyright (C) 1999 Brian Paul 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
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL 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:
+ * Keith Whitwell <keithw@valinux.com>
+ */
+
+
+static void TAG(triangle)(GLcontext *ctx,
+ GLuint e0, GLuint e1, GLuint e2,
+ GLuint pv)
+{
+ struct vertex_buffer *VB = ctx->VB;
+ SWvertex *verts = SWSETUP_VB(VB)->verts;
+ SWvertex *v[3];
+ GLfloat offset;
+ GLfloat z[3];
+ GLubyte c[3][4], s[3][4];
+ GLuint i[3];
+ GLenum mode = GL_FILL;
+
+ v[0] = &verts[e0];
+ v[1] = &verts[e1];
+ v[2] = &verts[e2];
+
+ if (IND & (SS_TWOSIDE_BIT | SS_FLAT_BIT)) {
+ SS_COLOR(c[0], v[0]->color);
+ SS_COLOR(c[1], v[1]->color);
+ SS_COLOR(c[2], v[2]->color);
+
+ SS_SPEC(s[0], v[0]->specular);
+ SS_SPEC(s[1], v[1]->specular);
+ SS_SPEC(s[2], v[2]->specular);
+
+ SS_IND(i[0], v[0]->index);
+ SS_IND(i[1], v[1]->index);
+ SS_IND(i[2], v[2]->index);
+ }
+
+ if (IND & (SS_TWOSIDE_BIT | SS_OFFSET_BIT | SS_UNFILLED_BIT))
+ {
+ GLfloat ex = v[0]->win[0] - v[2]->win[0];
+ GLfloat ey = v[0]->win[1] - v[2]->win[1];
+ GLfloat fx = v[1]->win[0] - v[2]->win[0];
+ GLfloat fy = v[1]->win[1] - v[2]->win[1];
+ GLfloat cc = ex*fy - ey*fx;
+
+ if (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT))
+ {
+ GLuint facing = (cc < 0.0) ^ ctx->Polygon.FrontBit;
+
+ if (IND & SS_UNFILLED_BIT)
+ mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode;
+
+ if (IND & SS_TWOSIDE_BIT) {
+ GLubyte (*vbcolor)[4] = VB->Color[facing]->data;
+ GLubyte (*vbspec)[4] = VB->SecondaryColor[facing]->data;
+ GLuint *vbindex = VB->Index[facing]->data;
+
+ if (IND & SS_FLAT_BIT) {
+ SS_COLOR(v[0]->color, vbcolor[pv]);
+ SS_COLOR(v[1]->color, vbcolor[pv]);
+ SS_COLOR(v[2]->color, vbcolor[pv]);
+
+ SS_SPEC(v[0]->specular, vbspec[pv]);
+ SS_SPEC(v[1]->specular, vbspec[pv]);
+ SS_SPEC(v[2]->specular, vbspec[pv]);
+
+ SS_IND(v[0]->index, vbindex[pv]);
+ SS_IND(v[1]->index, vbindex[pv]);
+ SS_IND(v[2]->index, vbindex[pv]);
+ } else {
+ SS_COLOR(v[0]->color, vbcolor[e0]);
+ SS_COLOR(v[1]->color, vbcolor[e1]);
+ SS_COLOR(v[2]->color, vbcolor[e2]);
+
+ SS_SPEC(v[0]->specular, vbspec[e0]);
+ SS_SPEC(v[1]->specular, vbspec[e1]);
+ SS_SPEC(v[2]->specular, vbspec[e2]);
+
+ SS_IND(v[0]->index, vbindex[e0]);
+ SS_IND(v[1]->index, vbindex[e1]);
+ SS_IND(v[2]->index, vbindex[e2]);
+ }
+ }
+ }
+
+ if (IND & SS_OFFSET_BIT)
+ {
+ offset = ctx->Polygon.OffsetUnits;
+ z[0] = v[0]->win[2];
+ z[1] = v[1]->win[2];
+ z[2] = v[2]->win[2];
+ if (cc * cc > 1e-16) {
+ GLfloat ez = z[0] - z[2];
+ GLfloat fz = z[1] - z[2];
+ GLfloat a = ey*fz - ez*fy;
+ GLfloat b = ez*fx - ex*fz;
+ GLfloat ic = 1.0 / cc;
+ GLfloat ac = a * ic;
+ GLfloat bc = b * ic;
+ if (ac < 0.0f) ac = -ac;
+ if (bc < 0.0f) bc = -bc;
+ offset += MAX2(ac, bc) * ctx->Polygon.OffsetFactor;
+ }
+ }
+ }
+ else if(IND & SS_FLAT_BIT)
+ {
+ GLubyte *color = VB->Color[0]->data[pv];
+ GLubyte *spec = VB->SecondaryColor[0]->data[pv];
+ GLuint index = VB->Index[0]->data[pv];
+
+ SS_COLOR(v[0]->color, color);
+ SS_COLOR(v[1]->color, color);
+ SS_COLOR(v[2]->color, color);
+
+ SS_SPEC(v[0]->specular, spec);
+ SS_SPEC(v[1]->specular, spec);
+ SS_SPEC(v[2]->specular, spec);
+
+ SS_IND(v[0]->index, index);
+ SS_IND(v[1]->index, index);
+ SS_IND(v[2]->index, index);
+ }
+
+ if (mode == GL_POINT) {
+ GLubyte *ef = VB->EdgeFlagPtr->data;
+ if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetPoint) {
+ v[0]->win[2] += offset;
+ v[1]->win[2] += offset;
+ v[2]->win[2] += offset;
+ }
+ if (ef[e0]&0x1) { ef[e0] &= ~0x1; _swrast_Point( ctx, v[0] ); }
+ if (ef[e1]&0x1) { ef[e1] &= ~0x1; _swrast_Point( ctx, v[1] ); }
+ if (ef[e2]&0x2) { ef[e2] &= ~0x2; _swrast_Point( ctx, v[2] ); }
+ } else if (mode == GL_LINE) {
+ GLubyte *ef = VB->EdgeFlagPtr->data;
+ if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetLine) {
+ v[0]->win[2] += offset;
+ v[1]->win[2] += offset;
+ v[2]->win[2] += offset;
+ }
+ if (ef[e0]&0x1) { ef[e0] &= ~0x1; _swrast_Line( ctx, v[0], v[1] ); }
+ if (ef[e1]&0x1) { ef[e1] &= ~0x1; _swrast_Line( ctx, v[1], v[2] ); }
+ if (ef[e2]&0x2) { ef[e2] &= ~0x2; _swrast_Line( ctx, v[2], v[0] ); }
+ } else {
+ if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetFill) {
+ v[0]->win[2] += offset;
+ v[1]->win[2] += offset;
+ v[2]->win[2] += offset;
+ }
+ _swrast_Triangle( ctx, v[0], v[1], v[2] );
+ }
+
+ if (IND & SS_OFFSET_BIT) {
+ v[0]->win[2] = z[0];
+ v[1]->win[2] = z[1];
+ v[2]->win[2] = z[2];
+ }
+
+ if (IND & (SS_FLAT_BIT | SS_TWOSIDE_BIT)) {
+ SS_COLOR(v[0]->color, c[0]);
+ SS_COLOR(v[1]->color, c[1]);
+ SS_COLOR(v[2]->color, c[2]);
+
+ SS_SPEC(v[0]->specular, s[0]);
+ SS_SPEC(v[1]->specular, s[1]);
+ SS_SPEC(v[2]->specular, s[2]);
+
+ SS_IND(v[0]->index, i[0]);
+ SS_IND(v[1]->index, i[1]);
+ SS_IND(v[2]->index, i[2]);
+ }
+}
+
+
+
+/* Need to do something with edgeflags:
+ */
+static void TAG(quad)( GLcontext *ctx, GLuint v0,
+ GLuint v1, GLuint v2, GLuint v3,
+ GLuint pv )
+{
+ TAG(triangle)( ctx, v0, v1, v3, pv );
+ TAG(triangle)( ctx, v1, v2, v3, pv );
+}
+
+
+static void TAG(line)( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv )
+{
+ struct vertex_buffer *VB = ctx->VB;
+ SWvertex *verts = SWSETUP_VB(VB)->verts;
+ GLubyte c[2][4], s[2][4];
+ GLuint i[2];
+ SWvertex *vert0 = &verts[v0];
+ SWvertex *vert1 = &verts[v1];
+
+
+ if (IND & SS_FLAT_BIT) {
+ GLubyte *color = VB->Color[0]->data[pv];
+ GLubyte *spec = VB->SecondaryColor[0]->data[pv];
+ GLuint index = VB->Index[0]->data[pv];
+
+ SS_COLOR(c[0], vert0->color);
+ SS_COLOR(c[1], vert1->color);
+
+ SS_SPEC(s[0], vert0->specular);
+ SS_SPEC(s[1], vert1->specular);
+
+ SS_IND(i[0], vert0->index);
+ SS_IND(i[1], vert1->index);
+
+ SS_COLOR(vert0->color, color);
+ SS_COLOR(vert1->color, color);
+
+ SS_SPEC(vert0->specular, spec);
+ SS_SPEC(vert1->specular, spec);
+
+ SS_IND(vert0->index, index);
+ SS_IND(vert1->index, index);
+ }
+
+ _swrast_Line( ctx, vert0, vert1 );
+
+ if (IND & SS_FLAT_BIT) {
+ SS_COLOR(vert0->color, c[0]);
+ SS_COLOR(vert1->color, c[1]);
+
+ SS_SPEC(vert0->specular, s[0]);
+ SS_SPEC(vert1->specular, s[1]);
+
+ SS_IND(vert0->index, i[0]);
+ SS_IND(vert1->index, i[1]);
+ }
+}
+
+
+static void TAG(points)( GLcontext *ctx, GLuint first, GLuint last )
+{
+ struct vertex_buffer *VB = ctx->VB;
+ SWvertex *verts = SWSETUP_VB(VB)->verts;
+ int i;
+
+ for(i=first;i<=last;i++)
+ if(VB->ClipMask[i]==0)
+ _swrast_Point( ctx, &verts[i] );
+}
+
+
+
+
+static void TAG(init)( void )
+{
+ tri_tab[IND] = TAG(triangle);
+ quad_tab[IND] = TAG(quad);
+ line_tab[IND] = TAG(line);
+ points_tab[IND] = TAG(points);
+}
+
+
+#undef IND
+#undef TAG
+
+
+
diff --git a/src/mesa/swrast_setup/ss_vb.c b/src/mesa/swrast_setup/ss_vb.c
new file mode 100644
index 0000000000..7f8fbdfdc5
--- /dev/null
+++ b/src/mesa/swrast_setup/ss_vb.c
@@ -0,0 +1,173 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * Copyright (C) 1999 Brian Paul 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
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL 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:
+ * Keith Whitwell <keithw@valinux.com>
+ */
+
+#include "glheader.h"
+#include "macros.h"
+#include "stages.h"
+
+#include "swrast/swrast.h"
+
+#include "ss_context.h"
+#include "ss_vb.h"
+
+
+
+/* Provides a RasterSetup function which prebuilds vertices for the
+ * software rasterizer. This is required for the triangle functions
+ * in this module, but not the rest of the swrast module.
+ */
+
+typedef void (*SetupFunc)( struct vertex_buffer *VB,
+ GLuint start, GLuint end );
+
+#define COLOR 0x1
+#define INDEX 0x2
+#define TEX0 0x4
+#define MULTITEX 0x8
+#define SPEC 0x10
+#define FOG 0x20
+#define EYE 0x40
+#define MAX_SETUPFUNC 0x80
+
+static SetupFunc setup_func[MAX_SETUPFUNC];
+
+
+#define IND (COLOR)
+#define TAG(x) x##_color
+#include "ss_vbtmp.h"
+
+#define IND (INDEX)
+#define TAG(x) x##_index
+#include "ss_vbtmp.h"
+
+#define IND (TEX0|COLOR)
+#define TAG(x) x##_tex0_color
+#include "ss_vbtmp.h"
+
+#define IND (TEX0|COLOR|SPEC)
+#define TAG(x) x##_tex0_color_spec
+#include "ss_vbtmp.h"
+
+#define IND (TEX0|COLOR|SPEC|FOG)
+#define TAG(x) x##_tex0_color_spec_fog
+#include "ss_vbtmp.h"
+
+#define IND (MULTITEX|COLOR)
+#define TAG(x) x##_multitex_color
+#include "ss_vbtmp.h"
+
+#define IND (MULTITEX|COLOR|SPEC|FOG)
+#define TAG(x) x##_multitex_color_spec_fog
+#include "ss_vbtmp.h"
+
+#define IND (TEX0|COLOR|EYE)
+#define TAG(x) x##_tex0_color_eye
+#include "ss_vbtmp.h"
+
+#define IND (MULTITEX|COLOR|SPEC|INDEX|EYE|FOG)
+#define TAG(x) x##_multitex_color_spec_index_eye_fog
+#include "ss_vbtmp.h"
+
+
+
+void
+_swsetup_vb_init( GLcontext *ctx )
+{
+ int i;
+ (void) ctx;
+
+ for (i = 0 ; i < Elements(setup_func) ; i++)
+ setup_func[i] = rs_multitex_color_spec_index_eye_fog;
+
+ /* Some specialized cases:
+ */
+ setup_func[0] = rs_color;
+ setup_func[COLOR] = rs_color;
+
+ setup_func[INDEX] = rs_index;
+
+ setup_func[TEX0] = rs_tex0_color;
+ setup_func[TEX0|COLOR] = rs_tex0_color;
+
+ setup_func[SPEC] = rs_tex0_color_spec;
+ setup_func[COLOR|SPEC] = rs_tex0_color_spec;
+ setup_func[TEX0|SPEC] = rs_tex0_color_spec;
+ setup_func[TEX0|COLOR|SPEC] = rs_tex0_color_spec;
+
+ setup_func[MULTITEX] = rs_multitex_color;
+ setup_func[MULTITEX|COLOR] = rs_multitex_color;
+
+ setup_func[FOG] = rs_tex0_color_spec_fog;
+ setup_func[COLOR|FOG] = rs_tex0_color_spec_fog;
+ setup_func[SPEC|FOG] = rs_tex0_color_spec_fog;
+ setup_func[COLOR|SPEC|FOG] = rs_tex0_color_spec_fog;
+ setup_func[TEX0|FOG] = rs_tex0_color_spec_fog;
+ setup_func[TEX0|COLOR|FOG] = rs_tex0_color_spec_fog;
+ setup_func[TEX0|SPEC|FOG] = rs_tex0_color_spec_fog;
+ setup_func[TEX0|COLOR|SPEC|FOG] = rs_tex0_color_spec_fog;
+
+ setup_func[MULTITEX|SPEC] = rs_multitex_color_spec_fog;
+ setup_func[MULTITEX|COLOR|SPEC] = rs_multitex_color_spec_fog;
+ setup_func[MULTITEX|FOG] = rs_multitex_color_spec_fog;
+ setup_func[MULTITEX|SPEC|FOG] = rs_multitex_color_spec_fog;
+ setup_func[MULTITEX|COLOR|SPEC|FOG] = rs_multitex_color_spec_fog;
+
+ setup_func[TEX0|EYE] = rs_tex0_color_eye;
+ setup_func[TEX0|COLOR|EYE] = rs_tex0_color_eye;
+}
+
+
+void
+_swsetup_choose_rastersetup_func(GLcontext *ctx)
+{
+ SScontext *swsetup = SWSETUP_CONTEXT(ctx);
+ int funcindex;
+
+ if (ctx->Visual.RGBAflag) {
+ funcindex = COLOR;
+
+ if (ctx->Texture._ReallyEnabled & ~0xf)
+ funcindex |= MULTITEX;
+ else if (ctx->Texture._ReallyEnabled & 0xf)
+ funcindex |= TEX0;
+
+ if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR ||
+ ctx->Fog.ColorSumEnabled)
+ funcindex |= SPEC;
+
+ if (ctx->Point._Attenuated)
+ funcindex |= EYE;
+ }
+ else
+ funcindex = INDEX;
+
+ if (ctx->RenderMode != GL_RENDER)
+ funcindex = (INDEX|COLOR|MULTITEX);
+
+ swsetup->RasterSetup = setup_func[funcindex];
+}
+
diff --git a/src/mesa/swrast_setup/ss_vb.h b/src/mesa/swrast_setup/ss_vb.h
new file mode 100644
index 0000000000..75ba3e327e
--- /dev/null
+++ b/src/mesa/swrast_setup/ss_vb.h
@@ -0,0 +1,37 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * Copyright (C) 1999 Brian Paul 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
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL 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:
+ * Keith Whitwell <keithw@valinux.com>
+ */
+
+#ifndef SS_VB_H
+#define SS_VB_H
+
+#include "types.h"
+#include "swrast_setup.h"
+
+void _swsetup_vb_init( GLcontext *ctx );
+void _swsetup_choose_rastersetup_func( GLcontext *ctx );
+
+#endif
diff --git a/src/mesa/swrast_setup/ss_vbtmp.h b/src/mesa/swrast_setup/ss_vbtmp.h
new file mode 100644
index 0000000000..53fe5bcae6
--- /dev/null
+++ b/src/mesa/swrast_setup/ss_vbtmp.h
@@ -0,0 +1,117 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * Copyright (C) 1999 Brian Paul 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
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL 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:
+ * Keith Whitwell <keithw@valinux.com>
+ */
+
+
+static void TAG(rs)(struct vertex_buffer *VB, GLuint start, GLuint end)
+{
+ GLcontext *ctx = VB->ctx;
+ SWvertex *v;
+ GLfloat (*eye)[4];
+ GLfloat (*win)[4];
+ GLfloat (*tc[MAX_TEXTURE_UNITS])[4];
+ GLubyte (*color)[4];
+ GLubyte (*spec)[4];
+ GLuint *index;
+ GLfloat *fog;
+ GLuint sz[MAX_TEXTURE_UNITS];
+ GLuint szeye;
+ int i;
+
+ /* TODO: Do window map here.
+ */
+/* GLfloat *m = VB->ctx->Viewport.WindowMap.m; */
+/* const GLfloat sx = m[0]; */
+/* const GLfloat sy = m[5]; */
+/* const GLfloat sz = m[10] * ctx->Visual->DepthMaxF; */
+/* const GLfloat tx = m[12]; */
+/* const GLfloat ty = m[13]; */
+/* const GLfloat tz = m[14] * ctx->Visual->DepthMaxF; */
+
+
+ /* TODO: Get import_client_data to pad vectors out to 4 cleanly.
+ */
+ gl_import_client_data( VB, ctx->_RenderFlags,
+ (VB->ClipOrMask
+ ? /* VEC_CLEAN| */VEC_WRITABLE|VEC_GOOD_STRIDE
+ : /* VEC_CLEAN| */VEC_GOOD_STRIDE));
+
+ if (IND & TEX0) {
+ tc[0] = VB->TexCoordPtr[0]->data;
+ sz[0] = VB->TexCoordPtr[0]->size;
+ }
+
+ if (IND & MULTITEX) {
+ for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) {
+ tc[i] = VB->TexCoordPtr[i]->data;
+ sz[i] = VB->TexCoordPtr[i]->size;
+ }
+ }
+
+ fog = VB->FogCoordPtr->data;
+ eye = VB->EyePtr->data;
+ szeye = VB->EyePtr->size;
+ win = VB->Win.data;
+ color = VB->Color[0]->data;
+ spec = VB->SecondaryColor[0]->data;
+ index = VB->Index[0]->data;
+
+ v = &(SWSETUP_VB(VB)->verts[start]);
+
+ for (i=start; i < end; i++, v++) {
+ if (VB->ClipMask[i] == 0) {
+ COPY_4FV( v->win, win[i] );
+
+ if (IND & EYE)
+ COPY_4FV( v->eye, eye[i] );
+
+ if (IND & TEX0)
+ COPY_CLEAN_4V( v->texcoord[0], sz[0], tc[0][i] );
+
+ if (IND & MULTITEX) {
+ GLuint u;
+ for (u = 0 ; u < MAX_TEXTURE_UNITS ; u++)
+ if (ctx->Texture.Unit[u]._ReallyEnabled)
+ COPY_CLEAN_4V( v->texcoord[u], sz[u], tc[u][i] );
+ }
+
+ if (IND & COLOR)
+ COPY_4UBV(v->color, color[i]);
+
+ if (IND & SPEC)
+ COPY_4UBV(v->specular, spec[i]);
+
+ if (IND & FOG)
+ v->fog = fog[i];
+
+ if (IND & INDEX)
+ v->index = index[i];
+ }
+ }
+}
+
+#undef TAG
+#undef IND
diff --git a/src/mesa/swrast_setup/swrast_setup.h b/src/mesa/swrast_setup/swrast_setup.h
new file mode 100644
index 0000000000..d9b253af9d
--- /dev/null
+++ b/src/mesa/swrast_setup/swrast_setup.h
@@ -0,0 +1,70 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * Copyright (C) 1999 Brian Paul 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
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL 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:
+ * Keith Whitwell <keithw@valinux.com>
+ */
+
+/* Public interface to the swrast_setup module.
+ */
+
+#ifndef SWRAST_SETUP_H
+#define SWRAST_SETUP_H
+
+GLboolean
+_swsetup_CreateContext( GLcontext *ctx );
+
+void
+_swsetup_DestroyContext( GLcontext *ctx );
+
+GLboolean
+_swsetup_RegisterVB( struct vertex_buffer *VB );
+
+void
+_swsetup_UnregisterVB( struct vertex_buffer *VB );
+
+void
+_swsetup_InvalidateState( GLcontext *ctx, GLuint new_state );
+
+void
+_swsetup_RasterSetup( struct vertex_buffer *VB,
+ GLuint start, GLuint end );
+
+void
+_swsetup_Quad( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint v3, GLuint pv );
+
+void
+_swsetup_Triangle( GLcontext *ctx, GLuint v0, GLuint v1,
+ GLuint v2, GLuint pv );
+
+
+void
+_swsetup_Line( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv );
+
+
+void
+_swsetup_Points( GLcontext *ctx, GLuint first, GLuint last );
+
+
+#endif