add SciTech's GLDirect driver for Windows.
[mesa.git] / src / mesa / drivers / windows / gldirect / dx9 / gld_primitive_dx9.c
diff --git a/src/mesa/drivers/windows/gldirect/dx9/gld_primitive_dx9.c b/src/mesa/drivers/windows/gldirect/dx9/gld_primitive_dx9.c
new file mode 100644 (file)
index 0000000..6edbe70
--- /dev/null
@@ -0,0 +1,1446 @@
+/****************************************************************************
+*
+*                        Mesa 3-D graphics library
+*                        Direct3D Driver Interface
+*
+*  ========================================================================
+*
+*   Copyright (C) 1991-2004 SciTech Software, Inc. 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
+*   SCITECH SOFTWARE INC 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.
+*
+*  ======================================================================
+*
+* Language:     ANSI C
+* Environment:  Windows 9x/2000/XP/XBox (Win32)
+*
+* Description:  Primitive (points/lines/tris/quads) rendering
+*
+****************************************************************************/
+
+//#include "../GLDirect.h"
+
+//#include "gld_dx8.h"
+
+#include "dglcontext.h"
+#include "ddlog.h"
+#include "gld_dx9.h"
+
+#include "glheader.h"
+#include "context.h"
+#include "colormac.h"
+#include "depth.h"
+#include "extensions.h"
+#include "macros.h"
+#include "matrix.h"
+// #include "mem.h"
+#include "mmath.h"
+#include "mtypes.h"
+#include "texformat.h"
+#include "texstore.h"
+#include "array_cache/acache.h"
+#include "swrast/swrast.h"
+#include "swrast_setup/swrast_setup.h"
+#include "swrast_setup/ss_context.h"
+#include "swrast/s_context.h"
+#include "swrast/s_depth.h"
+#include "swrast/s_lines.h"
+#include "swrast/s_triangle.h"
+#include "swrast/s_trispan.h"
+#include "tnl/tnl.h"
+#include "tnl/t_context.h"
+#include "tnl/t_pipeline.h"
+
+// Disable compiler complaints about unreferenced local variables
+#pragma warning (disable:4101)
+
+//---------------------------------------------------------------------------
+// Helper defines for primitives
+//---------------------------------------------------------------------------
+
+//static const float ooZ               = 1.0f / 65536.0f; // One over Z
+
+#define GLD_COLOUR (D3DCOLOR_RGBA(swv->color[0], swv->color[1], swv->color[2], swv->color[3]))
+#define GLD_SPECULAR (D3DCOLOR_RGBA(swv->specular[0], swv->specular[1], swv->specular[2], swv->specular[3]))
+#define GLD_FLIP_Y(y) (gldCtx->dwHeight - (y))
+
+//---------------------------------------------------------------------------
+// 2D vertex setup
+//---------------------------------------------------------------------------
+
+#define GLD_SETUP_2D_VARS_POINTS                                                       \
+       GLD_context             *gldCtx = GLD_GET_CONTEXT(ctx);                 \
+       GLD_driver_dx9  *gld    = GLD_GET_DX9_DRIVER(gldCtx);   \
+       GLD_2D_VERTEX   *pV             = (GLD_2D_VERTEX*)gld->PB2d.pPoints;    \
+       SScontext               *ss             = SWSETUP_CONTEXT(ctx);                 \
+       SWvertex                *swv;                                                                   \
+       DWORD                   dwSpecularColour;                                               \
+       DWORD                   dwFlatColour
+
+#define GLD_SETUP_2D_VARS_LINES                                                                \
+       GLD_context             *gldCtx = GLD_GET_CONTEXT(ctx);                 \
+       GLD_driver_dx9  *gld    = GLD_GET_DX9_DRIVER(gldCtx);   \
+       GLD_2D_VERTEX   *pV             = (GLD_2D_VERTEX*)gld->PB2d.pLines;     \
+       SScontext               *ss             = SWSETUP_CONTEXT(ctx);                 \
+       SWvertex                *swv;                                                                   \
+       DWORD                   dwSpecularColour;                                               \
+       DWORD                   dwFlatColour
+
+#define GLD_SETUP_2D_VARS_TRIANGLES                                                    \
+       BOOL                    bFog = ctx->Fog.Enabled;                                \
+       GLD_context             *gldCtx = GLD_GET_CONTEXT(ctx);                 \
+       GLD_driver_dx9  *gld    = GLD_GET_DX9_DRIVER(gldCtx);   \
+       GLD_2D_VERTEX   *pV             = (GLD_2D_VERTEX*)gld->PB2d.pTriangles; \
+       SScontext               *ss             = SWSETUP_CONTEXT(ctx);                 \
+       SWvertex                *swv;                                                                   \
+       DWORD                   dwSpecularColour;                                               \
+       DWORD                   dwFlatColour;                                                   \
+       GLuint                                  facing = 0;                                             \
+       struct vertex_buffer    *VB;                                                    \
+       GLchan                                  (*vbcolor)[4];                                  \
+       GLchan                                  (*vbspec)[4]
+
+#define GLD_SETUP_GET_SWVERT(s)                                        \
+       swv = &ss->verts[##s]
+
+#define GLD_SETUP_2D_VERTEX                                            \
+       pV->x                   = swv->win[0];                          \
+       pV->y                   = GLD_FLIP_Y(swv->win[1]);      \
+       pV->rhw                 = swv->win[3]
+
+#define GLD_SETUP_SMOOTH_COLOUR                                        \
+       pV->diffuse             = GLD_COLOUR
+
+#define GLD_SETUP_GET_FLAT_COLOUR                              \
+       dwFlatColour    = GLD_COLOUR
+#define GLD_SETUP_GET_FLAT_FOG_COLOUR                  \
+       dwFlatColour    = _gldComputeFog(ctx, swv)
+
+#define GLD_SETUP_USE_FLAT_COLOUR                              \
+       pV->diffuse             = dwFlatColour
+
+#define GLD_SETUP_GET_FLAT_SPECULAR                            \
+       dwSpecularColour= GLD_SPECULAR
+
+#define GLD_SETUP_USE_FLAT_SPECULAR                            \
+       pV->specular    = dwSpecularColour
+
+#define GLD_SETUP_DEPTH                                                        \
+       pV->sz                  = swv->win[2] / ctx->DepthMaxF
+//     pV->z                   = swv->win[2] * ooZ;
+
+#define GLD_SETUP_SPECULAR                                             \
+       pV->specular    = GLD_SPECULAR
+
+#define GLD_SETUP_FOG                                                  \
+       pV->diffuse             = _gldComputeFog(ctx, swv)
+
+#define GLD_SETUP_TEX0                                                 \
+       pV->t0_u                = swv->texcoord[0][0];          \
+       pV->t0_v                = swv->texcoord[0][1]
+
+#define GLD_SETUP_TEX1                                                 \
+       pV->t1_u                = swv->texcoord[1][0];          \
+       pV->t1_v                = swv->texcoord[1][1]
+
+#define GLD_SETUP_LIGHTING(v)                  \
+       if (facing == 1) {                                      \
+               pV->diffuse     = D3DCOLOR_RGBA(vbcolor[##v][0], vbcolor[##v][1], vbcolor[##v][2], vbcolor[##v][3]);    \
+               if (vbspec) {                                                                                                                                                                   \
+                       pV->specular = D3DCOLOR_RGBA(vbspec[##v][0], vbspec[##v][1], vbspec[##v][2], vbspec[##v][3]);   \
+               }       \
+       } else {        \
+               if (bFog)                                               \
+                       GLD_SETUP_FOG;                          \
+               else                                                    \
+                       GLD_SETUP_SMOOTH_COLOUR;        \
+               GLD_SETUP_SPECULAR;                             \
+       }
+
+#define GLD_SETUP_GET_FLAT_LIGHTING(v) \
+       if (facing == 1) {                                      \
+               dwFlatColour = D3DCOLOR_RGBA(vbcolor[##v][0], vbcolor[##v][1], vbcolor[##v][2], vbcolor[##v][3]);       \
+               if (vbspec) {                                                                                                                                                                   \
+                       dwSpecularColour = D3DCOLOR_RGBA(vbspec[##v][0], vbspec[##v][1], vbspec[##v][2], vbspec[##v][3]);       \
+               }       \
+       }
+
+#define GLD_SETUP_TWOSIDED_LIGHTING            \
+       /* Two-sided lighting */                                \
+       if (ctx->_TriangleCaps & DD_TRI_LIGHT_TWOSIDE) {        \
+               SWvertex        *verts = SWSETUP_CONTEXT(ctx)->verts;   \
+               SWvertex        *v[3];                                                                  \
+               GLfloat         ex,ey,fx,fy,cc;                                                 \
+               /* Get vars for later */                                                        \
+               VB              = &TNL_CONTEXT(ctx)->vb;                                        \
+               vbcolor = (GLchan (*)[4])VB->ColorPtr[1]->Ptr;          \
+               if (VB->SecondaryColorPtr[1]) {                                         \
+                       vbspec = (GLchan (*)[4])VB->SecondaryColorPtr[1]->Ptr;  \
+               } else {                                                                                                        \
+                       vbspec = NULL;                                                                                  \
+               }                                                                                                                       \
+               v[0] = &verts[v0];                                                                                      \
+               v[1] = &verts[v1];                                                                                      \
+               v[2] = &verts[v2];                                                                                      \
+               ex = v[0]->win[0] - v[2]->win[0];       \
+               ey = v[0]->win[1] - v[2]->win[1];       \
+               fx = v[1]->win[0] - v[2]->win[0];       \
+               fy = v[1]->win[1] - v[2]->win[1];       \
+               cc  = ex*fy - ey*fx;                            \
+               facing = (cc < 0.0) ^ ctx->Polygon._FrontBit;   \
+       }
+
+//---------------------------------------------------------------------------
+// 3D vertex setup
+//---------------------------------------------------------------------------
+
+#define GLD_SETUP_3D_VARS_POINTS                                                                                       \
+       GLD_context             *gldCtx = GLD_GET_CONTEXT(ctx);                 \
+       GLD_driver_dx9  *gld    = GLD_GET_DX9_DRIVER(gldCtx);   \
+       GLD_3D_VERTEX                   *pV             = (GLD_3D_VERTEX*)gld->PB3d.pPoints;    \
+       TNLcontext                              *tnl    = TNL_CONTEXT(ctx);                             \
+       struct vertex_buffer    *VB             = &tnl->vb;                                             \
+       GLfloat                                 (*p4f)[4];                                                              \
+       GLfloat                                 (*tc)[4];                                                               \
+       DWORD                                   dwColor;
+
+#define GLD_SETUP_3D_VARS_LINES                                                                                        \
+       GLD_context             *gldCtx = GLD_GET_CONTEXT(ctx);                 \
+       GLD_driver_dx9  *gld    = GLD_GET_DX9_DRIVER(gldCtx);   \
+       GLD_3D_VERTEX                   *pV             = (GLD_3D_VERTEX*)gld->PB3d.pLines;     \
+       TNLcontext                              *tnl    = TNL_CONTEXT(ctx);                             \
+       struct vertex_buffer    *VB             = &tnl->vb;                                             \
+       GLfloat                                 (*p4f)[4];                                                              \
+       GLfloat                                 (*tc)[4];                                                               \
+       DWORD                                   dwColor;
+
+#define GLD_SETUP_3D_VARS_TRIANGLES                                                                                    \
+       GLD_context             *gldCtx = GLD_GET_CONTEXT(ctx);                 \
+       GLD_driver_dx9  *gld    = GLD_GET_DX9_DRIVER(gldCtx);   \
+       GLD_3D_VERTEX                   *pV             = (GLD_3D_VERTEX*)gld->PB3d.pTriangles; \
+       TNLcontext                              *tnl    = TNL_CONTEXT(ctx);                             \
+       struct vertex_buffer    *VB             = &tnl->vb;                                             \
+       GLfloat                                 (*p4f)[4];                                                              \
+       GLfloat                                 (*tc)[4];                                                               \
+       DWORD                                   dwColor;
+
+#define GLD_SETUP_3D_VERTEX(v)                                 \
+       p4f                             = VB->ObjPtr->data;                     \
+       pV->Position.x  = p4f[##v][0];                          \
+       pV->Position.y  = p4f[##v][1];                          \
+       pV->Position.z  = p4f[##v][2];
+
+#define GLD_SETUP_SMOOTH_COLOUR_3D(v)                                                                                                                  \
+       p4f                     = (GLfloat (*)[4])VB->ColorPtr[0]->Ptr;                                                                         \
+       pV->Diffuse     = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]);
+
+
+#define GLD_SETUP_GET_FLAT_COLOUR_3D(v)                                                                                                        \
+       p4f             = (GLfloat (*)[4])VB->ColorPtr[0]->Ptr;                                                                         \
+       dwColor = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]);
+
+#define GLD_SETUP_USE_FLAT_COLOUR_3D                   \
+       pV->Diffuse = dwColor;
+
+#define GLD_SETUP_TEX0_3D(v)                                           \
+       if (VB->TexCoordPtr[0]) {                                               \
+               tc                              = VB->TexCoordPtr[0]->data;     \
+               pV->TexUnit0.x  = tc[##v][0];                           \
+               pV->TexUnit0.y  = tc[##v][1];                           \
+       }
+
+#define GLD_SETUP_TEX1_3D(v)                                           \
+       if (VB->TexCoordPtr[1]) {                                               \
+               tc                              = VB->TexCoordPtr[1]->data;     \
+               pV->TexUnit1.x  = tc[##v][0];                           \
+               pV->TexUnit1.y  = tc[##v][1];                           \
+       }
+
+//---------------------------------------------------------------------------
+// Helper functions
+//---------------------------------------------------------------------------
+
+__inline DWORD _gldComputeFog(
+       GLcontext *ctx,
+       SWvertex *swv)
+{
+       // Full fog calculation.
+       // Based on Mesa code.
+
+       GLchan                  rFog, gFog, bFog;
+       GLchan                  fR, fG, fB;
+       const GLfloat   f = swv->fog;
+       const GLfloat   g = 1.0 - f;
+       
+       UNCLAMPED_FLOAT_TO_CHAN(rFog, ctx->Fog.Color[RCOMP]);
+       UNCLAMPED_FLOAT_TO_CHAN(gFog, ctx->Fog.Color[GCOMP]);
+       UNCLAMPED_FLOAT_TO_CHAN(bFog, ctx->Fog.Color[BCOMP]);
+       fR = f * swv->color[0] + g * rFog;
+       fG = f * swv->color[1] + g * gFog;
+       fB = f * swv->color[2] + g * bFog;
+       return D3DCOLOR_RGBA(fR, fG, fB, swv->color[3]);
+}
+
+//---------------------------------------------------------------------------
+
+void gld_ResetLineStipple_DX9(
+       GLcontext *ctx)
+{
+       // TODO: Fake stipple with a 32x32 texture.
+}
+
+//---------------------------------------------------------------------------
+// 2D (post-transformed) primitives
+//---------------------------------------------------------------------------
+
+void gld_Points2D_DX9(
+       GLcontext *ctx,
+       GLuint first,
+       GLuint last)
+{
+       GLD_SETUP_2D_VARS_POINTS;
+
+       unsigned                                i;
+       struct vertex_buffer    *VB = &TNL_CONTEXT(ctx)->vb;
+
+       // _Size is already clamped to MaxPointSize and MinPointSize
+       IDirect3DDevice9_SetRenderState(gld->pDev, D3DRS_POINTSIZE, *((DWORD*)&ctx->Point._Size));
+
+       if (VB->Elts) {
+               for (i=first; i<last; i++, pV++) {
+                       if (VB->ClipMask[VB->Elts[i]] == 0) {
+//                             _swrast_Point( ctx, &verts[VB->Elts[i]] );
+                               GLD_SETUP_GET_SWVERT(VB->Elts[i]);
+                               GLD_SETUP_2D_VERTEX;
+                               GLD_SETUP_SMOOTH_COLOUR;
+                               GLD_SETUP_DEPTH;
+                               GLD_SETUP_SPECULAR;
+                               GLD_SETUP_TEX0;
+                               GLD_SETUP_TEX1;
+                       }
+               }
+       } else {
+               GLD_SETUP_GET_SWVERT(first);
+               for (i=first; i<last; i++, swv++, pV++) {
+                       if (VB->ClipMask[i] == 0) {
+//                             _swrast_Point( ctx, &verts[i] );
+                               GLD_SETUP_2D_VERTEX;
+                               GLD_SETUP_SMOOTH_COLOUR;
+                               GLD_SETUP_DEPTH;
+                               GLD_SETUP_SPECULAR;
+                               GLD_SETUP_TEX0;
+                               GLD_SETUP_TEX1;
+                       }
+               }
+       }
+
+       gld->PB2d.pPoints = (BYTE*)pV;
+       gld->PB2d.nPoints += (last-first);
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Line2DFlat_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1)
+{
+       GLD_SETUP_2D_VARS_LINES;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_GET_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_GET_FLAT_SPECULAR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       gld->PB2d.pLines = (BYTE*)pV;
+       gld->PB2d.nLines++;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Line2DSmooth_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1)
+{
+       GLD_SETUP_2D_VARS_LINES;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_SPECULAR;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_SPECULAR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       gld->PB2d.pLines = (BYTE*)pV;
+       gld->PB2d.nLines++;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Triangle2DFlat_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2)
+{
+       GLD_SETUP_2D_VARS_TRIANGLES;
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_GET_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       pV++;;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       pV++;
+
+       gld->PB2d.pTriangles = (BYTE*)pV;
+       gld->PB2d.nTriangles++;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Triangle2DSmooth_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2)
+{
+
+       GLD_SETUP_2D_VARS_TRIANGLES;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       gld->PB2d.pTriangles = (BYTE*)pV;
+       gld->PB2d.nTriangles++;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Triangle2DFlatExtras_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2)
+{
+       GLD_SETUP_2D_VARS_TRIANGLES;
+
+       GLD_SETUP_TWOSIDED_LIGHTING(v2);
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       if (bFog)
+               GLD_SETUP_GET_FLAT_FOG_COLOUR;
+       else
+               GLD_SETUP_GET_FLAT_COLOUR;
+       GLD_SETUP_GET_FLAT_SPECULAR;
+       GLD_SETUP_GET_FLAT_LIGHTING(v2);
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       gld->PB2d.pTriangles = (BYTE*)pV;
+       gld->PB2d.nTriangles++;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Triangle2DSmoothExtras_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2)
+{
+       GLD_SETUP_2D_VARS_TRIANGLES;
+
+       GLD_SETUP_TWOSIDED_LIGHTING(v0);
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_LIGHTING(v0);
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_LIGHTING(v1);
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_LIGHTING(v2);
+       pV++;
+
+       gld->PB2d.pTriangles = (BYTE*)pV;
+       gld->PB2d.nTriangles++;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Quad2DFlat_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2,
+       GLuint v3)
+{
+       GLD_SETUP_2D_VARS_TRIANGLES;
+
+       GLD_SETUP_GET_SWVERT(v3);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_GET_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v3);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       pV++;
+
+       gld->PB2d.pTriangles = (BYTE*)pV;
+       gld->PB2d.nTriangles += 2;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Quad2DSmooth_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2,
+       GLuint v3)
+{
+       GLD_SETUP_2D_VARS_TRIANGLES;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v3);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_SMOOTH_COLOUR;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       pV++;
+
+       gld->PB2d.pTriangles = (BYTE*)pV;
+       gld->PB2d.nTriangles += 2;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Quad2DFlatExtras_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2,
+       GLuint v3)
+{
+       GLD_SETUP_2D_VARS_TRIANGLES;
+
+       GLD_SETUP_TWOSIDED_LIGHTING(v3);
+
+       GLD_SETUP_GET_SWVERT(v3);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       if (bFog)
+               GLD_SETUP_GET_FLAT_FOG_COLOUR;
+       else
+               GLD_SETUP_GET_FLAT_COLOUR;
+       GLD_SETUP_GET_FLAT_SPECULAR;
+       GLD_SETUP_GET_FLAT_LIGHTING(v3);
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v3);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_USE_FLAT_COLOUR;
+       GLD_SETUP_USE_FLAT_SPECULAR;
+       pV++;
+
+       gld->PB2d.pTriangles = (BYTE*)pV;
+       gld->PB2d.nTriangles += 2;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Quad2DSmoothExtras_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2,
+       GLuint v3)
+{
+       GLD_SETUP_2D_VARS_TRIANGLES;
+
+       GLD_SETUP_TWOSIDED_LIGHTING(v0);
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_LIGHTING(v0);
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v1);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_LIGHTING(v1);
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_LIGHTING(v2);
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v2);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_LIGHTING(v2);
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v3);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_LIGHTING(v3);
+       pV++;
+
+       GLD_SETUP_GET_SWVERT(v0);
+       GLD_SETUP_2D_VERTEX;
+       GLD_SETUP_DEPTH;
+       GLD_SETUP_TEX0;
+       GLD_SETUP_TEX1;
+       GLD_SETUP_LIGHTING(v0);
+       pV++;
+
+       gld->PB2d.pTriangles = (BYTE*)pV;
+       gld->PB2d.nTriangles += 2;
+}
+
+//---------------------------------------------------------------------------
+// 3D (pre-transformed) primitives
+//---------------------------------------------------------------------------
+
+void gld_Points3D_DX9(
+       GLcontext *ctx,
+       GLuint first,
+       GLuint last)
+{
+       GLD_SETUP_3D_VARS_POINTS
+
+       unsigned                                i;
+//     struct vertex_buffer    *VB = &TNL_CONTEXT(ctx)->vb;
+
+       // _Size is already clamped to MaxPointSize and MinPointSize
+       IDirect3DDevice9_SetRenderState(gld->pDev, D3DRS_POINTSIZE, *((DWORD*)&ctx->Point._Size));
+
+       if (VB->Elts) {
+               for (i=first; i<last; i++, pV++) {
+                       if (VB->ClipMask[VB->Elts[i]] == 0) {
+//                             _swrast_Point( ctx, &verts[VB->Elts[i]] );
+//                             GLD_SETUP_GET_SWVERT(VB->Elts[i]);
+                               GLD_SETUP_3D_VERTEX(VB->Elts[i])
+                               GLD_SETUP_SMOOTH_COLOUR_3D(i)
+                               GLD_SETUP_TEX0_3D(i)
+                               GLD_SETUP_TEX1_3D(i)
+                       }
+               }
+       } else {
+//             GLD_SETUP_GET_SWVERT(first);
+               for (i=first; i<last; i++, pV++) {
+                       if (VB->ClipMask[i] == 0) {
+//                             _swrast_Point( ctx, &verts[i] );
+                               GLD_SETUP_3D_VERTEX(i)
+                               GLD_SETUP_SMOOTH_COLOUR_3D(i)
+                               GLD_SETUP_TEX0_3D(i)
+                               GLD_SETUP_TEX1_3D(i)
+                       }
+               }
+       }
+/*
+       for (i=first; i<last; i++, pV++) {
+               GLD_SETUP_3D_VERTEX(i)
+               GLD_SETUP_SMOOTH_COLOUR_3D(i)
+               GLD_SETUP_TEX0_3D(i)
+               GLD_SETUP_TEX1_3D(i)
+       }
+*/
+       gld->PB3d.pPoints = (BYTE*)pV;
+       gld->PB3d.nPoints += (last-first);
+}
+
+//---------------------------------------------------------------------------
+// Line functions
+//---------------------------------------------------------------------------
+
+void gld_Line3DFlat_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1)
+{
+       GLD_SETUP_3D_VARS_LINES
+
+       GLD_SETUP_3D_VERTEX(v1)
+       GLD_SETUP_GET_FLAT_COLOUR_3D(v1)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       GLD_SETUP_TEX0_3D(v1)
+       GLD_SETUP_TEX1_3D(v1)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v0)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       GLD_SETUP_TEX0_3D(v0)
+       GLD_SETUP_TEX1_3D(v0)
+       pV++;
+
+       gld->PB3d.pLines = (BYTE*)pV;
+       gld->PB3d.nLines++;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Line3DSmooth_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1)
+{
+       GLD_SETUP_3D_VARS_LINES
+
+       GLD_SETUP_3D_VERTEX(v1)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v1)
+       GLD_SETUP_TEX0_3D(v1)
+       GLD_SETUP_TEX1_3D(v1)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v0)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v0)
+       GLD_SETUP_TEX0_3D(v0)
+       GLD_SETUP_TEX1_3D(v0)
+       pV++;
+
+       gld->PB3d.pLines = (BYTE*)pV;
+       gld->PB3d.nLines++;
+}
+
+//---------------------------------------------------------------------------
+// Triangle functions
+//---------------------------------------------------------------------------
+
+void gld_Triangle3DFlat_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2)
+{
+       GLD_SETUP_3D_VARS_TRIANGLES
+
+       GLD_SETUP_3D_VERTEX(v2)
+       GLD_SETUP_TEX0_3D(v2)
+       GLD_SETUP_TEX1_3D(v2)
+       GLD_SETUP_GET_FLAT_COLOUR_3D(v2)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v0)
+       GLD_SETUP_TEX0_3D(v0)
+       GLD_SETUP_TEX1_3D(v0)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v1)
+       GLD_SETUP_TEX0_3D(v1)
+       GLD_SETUP_TEX1_3D(v1)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       pV++;
+
+       gld->PB3d.pTriangles = (BYTE*)pV;
+       gld->PB3d.nTriangles++;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Triangle3DSmooth_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2)
+{
+       GLD_SETUP_3D_VARS_TRIANGLES
+
+       GLD_SETUP_3D_VERTEX(v0)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v0)
+       GLD_SETUP_TEX0_3D(v0)
+       GLD_SETUP_TEX1_3D(v0)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v1)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v1)
+       GLD_SETUP_TEX0_3D(v1)
+       GLD_SETUP_TEX1_3D(v1)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v2)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v2)
+       GLD_SETUP_TEX0_3D(v2)
+       GLD_SETUP_TEX1_3D(v2)
+       pV++;
+
+       gld->PB3d.pTriangles = (BYTE*)pV;
+       gld->PB3d.nTriangles++;
+}
+
+//---------------------------------------------------------------------------
+// Quad functions
+//---------------------------------------------------------------------------
+
+void gld_Quad3DFlat_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2,
+       GLuint v3)
+{
+       GLD_SETUP_3D_VARS_TRIANGLES
+
+       GLD_SETUP_3D_VERTEX(v3)
+       GLD_SETUP_GET_FLAT_COLOUR_3D(v3)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       GLD_SETUP_TEX0_3D(v3)
+       GLD_SETUP_TEX1_3D(v3)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v0)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       GLD_SETUP_TEX0_3D(v0)
+       GLD_SETUP_TEX1_3D(v0)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v1)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       GLD_SETUP_TEX0_3D(v1)
+       GLD_SETUP_TEX1_3D(v1)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v1)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       GLD_SETUP_TEX0_3D(v1)
+       GLD_SETUP_TEX1_3D(v1)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v2)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       GLD_SETUP_TEX0_3D(v2)
+       GLD_SETUP_TEX1_3D(v2)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v3)
+       GLD_SETUP_USE_FLAT_COLOUR_3D
+       GLD_SETUP_TEX0_3D(v3)
+       GLD_SETUP_TEX1_3D(v3)
+       pV++;
+
+       gld->PB3d.pTriangles = (BYTE*)pV;
+       gld->PB3d.nTriangles += 2;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Quad3DSmooth_DX9(
+       GLcontext *ctx,
+       GLuint v0,
+       GLuint v1,
+       GLuint v2,
+       GLuint v3)
+{
+       GLD_SETUP_3D_VARS_TRIANGLES
+
+       GLD_SETUP_3D_VERTEX(v0)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v0)
+       GLD_SETUP_TEX0_3D(v0)
+       GLD_SETUP_TEX1_3D(v0)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v1)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v1)
+       GLD_SETUP_TEX0_3D(v1)
+       GLD_SETUP_TEX1_3D(v1)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v2)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v2)
+       GLD_SETUP_TEX0_3D(v2)
+       GLD_SETUP_TEX1_3D(v2)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v2)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v2)
+       GLD_SETUP_TEX0_3D(v2)
+       GLD_SETUP_TEX1_3D(v2)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v3)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v3)
+       GLD_SETUP_TEX0_3D(v3)
+       GLD_SETUP_TEX1_3D(v3)
+       pV++;
+
+       GLD_SETUP_3D_VERTEX(v0)
+       GLD_SETUP_SMOOTH_COLOUR_3D(v0)
+       GLD_SETUP_TEX0_3D(v0)
+       GLD_SETUP_TEX1_3D(v0)
+       pV++;
+
+       gld->PB3d.pTriangles = (BYTE*)pV;
+       gld->PB3d.nTriangles += 2;
+}
+
+//---------------------------------------------------------------------------
+// Vertex setup for two-sided-lighting vertex shader
+//---------------------------------------------------------------------------
+
+/*
+
+void gld_Points2DTwoside_DX9(GLcontext *ctx, GLuint first, GLuint last)
+{
+       // NOTE: Two-sided lighting does not apply to Points
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Line2DFlatTwoside_DX9(GLcontext *ctx, GLuint v0, GLuint v1)
+{
+       // NOTE: Two-sided lighting does not apply to Lines
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Line2DSmoothTwoside_DX9(GLcontext *ctx, GLuint v0, GLuint v1)
+{
+       // NOTE: Two-sided lighting does not apply to Lines
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Triangle2DFlatTwoside_DX9(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2)
+{
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Triangle2DSmoothTwoside_DX9(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2)
+{
+       GLD_context                     *gldCtx = GLD_GET_CONTEXT(ctx);
+       GLD_driver_dx9          *gld    = GLD_GET_DX9_DRIVER(gldCtx);
+       GLD_TWOSIDED_VERTEX     *pV             = (GLD_TWOSIDED_VERTEX*)gld->PBtwosidelight.pTriangles;
+       SScontext                       *ss             = SWSETUP_CONTEXT(ctx);
+       SWvertex                        *swv;
+       DWORD                           dwSpecularColour;
+       DWORD                           dwFlatColour;
+       GLuint                                  facing = 0;
+       struct vertex_buffer    *VB;
+       GLchan                                  (*vbcolor)[4];
+       GLchan                                  (*vbspec)[4];
+
+       // Reciprocal of DepthMax
+       const float ooDepthMax = 1.0f / ctx->DepthMaxF; 
+
+       // 1st vert
+       swv = &ss->verts[v0];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 2nd vert
+       swv = &ss->verts[v1];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 3rd vert
+       swv = &ss->verts[v2];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       gld->PBtwosidelight.pTriangles = (BYTE*)pV;
+       gld->PBtwosidelight.nTriangles++;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Quad2DFlatTwoside_DX9(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+       GLD_context                     *gldCtx = GLD_GET_CONTEXT(ctx);
+       GLD_driver_dx9          *gld    = GLD_GET_DX9_DRIVER(gldCtx);
+       GLD_TWOSIDED_VERTEX     *pV             = (GLD_TWOSIDED_VERTEX*)gld->PBtwosidelight.pTriangles;
+       SScontext                       *ss             = SWSETUP_CONTEXT(ctx);
+       SWvertex                        *swv;
+       DWORD                           dwSpecularColour;
+       DWORD                           dwFlatColour;
+       GLuint                                  facing = 0;
+       struct vertex_buffer    *VB;
+       GLchan                                  (*vbcolor)[4];
+       GLchan                                  (*vbspec)[4];
+
+       // Reciprocal of DepthMax
+       const float ooDepthMax = 1.0f / ctx->DepthMaxF; 
+
+       // 1st vert
+       swv = &ss->verts[v0];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 2nd vert
+       swv = &ss->verts[v1];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 3rd vert
+       swv = &ss->verts[v2];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 4th vert
+       swv = &ss->verts[v2];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 5th vert
+       swv = &ss->verts[v3];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 6th vert
+       swv = &ss->verts[v0];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       gld->PBtwosidelight.pTriangles = (BYTE*)pV;
+       gld->PBtwosidelight.nTriangles += 2;
+}
+
+//---------------------------------------------------------------------------
+
+void gld_Quad2DSmoothTwoside_DX9(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+       GLD_context                     *gldCtx = GLD_GET_CONTEXT(ctx);
+       GLD_driver_dx9          *gld    = GLD_GET_DX9_DRIVER(gldCtx);
+       GLD_TWOSIDED_VERTEX     *pV             = (GLD_TWOSIDED_VERTEX*)gld->PBtwosidelight.pTriangles;
+       SScontext                       *ss             = SWSETUP_CONTEXT(ctx);
+       SWvertex                        *swv;
+       DWORD                           dwSpecularColour;
+       DWORD                           dwFlatColour;
+       GLuint                                  facing = 0;
+       struct vertex_buffer    *VB;
+       GLchan                                  (*vbcolor)[4];
+       GLchan                                  (*vbspec)[4];
+
+       // Reciprocal of DepthMax
+       const float ooDepthMax = 1.0f / ctx->DepthMaxF; 
+
+       // 1st vert
+       swv = &ss->verts[v0];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 2nd vert
+       swv = &ss->verts[v1];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 3rd vert
+       swv = &ss->verts[v2];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 4th vert
+       swv = &ss->verts[v2];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 5th vert
+       swv = &ss->verts[v3];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       // 6th vert
+       swv = &ss->verts[v0];
+       pV->Position.x = swv->win[0];
+       pV->Position.y = GLD_FLIP_Y(swv->win[1]);
+       pV->Position.z = swv->win[2] * ooDepthMax;
+       pV->Position.w = swv->win[3];
+       pV->TexUnit0.x = swv->texcoord[0][0];
+       pV->TexUnit0.y = swv->texcoord[0][1];
+       pV->TexUnit1.x = swv->texcoord[1][0];
+       pV->TexUnit1.y = swv->texcoord[1][1];
+       pV->FrontDiffuse = GLD_COLOUR;
+       pV->FrontSpecular = GLD_SPECULAR;
+       pV++;
+
+       gld->PBtwosidelight.pTriangles = (BYTE*)pV;
+       gld->PBtwosidelight.nTriangles += 2;
+}
+
+//---------------------------------------------------------------------------
+
+*/