summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/common/t_dd_vb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/common/t_dd_vb.c')
-rw-r--r--src/mesa/drivers/common/t_dd_vb.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/mesa/drivers/common/t_dd_vb.c b/src/mesa/drivers/common/t_dd_vb.c
new file mode 100644
index 0000000000..9c23900c55
--- /dev/null
+++ b/src/mesa/drivers/common/t_dd_vb.c
@@ -0,0 +1,99 @@
+/* Build an SWvertex from an tdfxVertex. This is workable because in
+ * states where the GrVertex is insufficent (eg seperate-specular),
+ * the driver initiates a total fallback, and builds SWvertices
+ * directly -- it recognizes that it will never have use for the
+ * tdfxVertex.
+ *
+ * This code is hit only when a mix of accelerated and unaccelerated
+ * primitives are being drawn, and only for the unaccelerated
+ * primitives.
+ */
+static void
+tdfx_translate_vertex(GLcontext *ctx, const tdfxVertex *src, SWvertex *dst)
+{
+ tdfxContextPtr imesa = TDFX_CONTEXT( ctx );
+
+ if (imesa->vertsize == 4) {
+ dst->win[0] = src->tv.x + .5;
+ dst->win[1] = - src->tv.y + imesa->driDrawable->h - .5;
+ dst->win[2] = src->tv.z * (GLfloat)0x10000;
+ dst->win[3] = 1.0;
+
+ dst->color[0] = src->tv.color.red;
+ dst->color[1] = src->tv.color.green;
+ dst->color[2] = src->tv.color.blue;
+ dst->color[3] = src->tv.color.alpha;
+ }
+ else {
+ dst->win[0] = src->v.x + .5;
+ dst->win[1] = - src->v.y + imesa->driDrawable->h - .5;
+ dst->win[2] = src->v.z * (GLfloat)0x10000;
+ dst->win[3] = src->v.oow;
+
+ dst->color[0] = src->v.color.red;
+ dst->color[1] = src->v.color.green;
+ dst->color[2] = src->v.color.blue;
+ dst->color[3] = src->v.color.alpha;
+
+ if (fxMesa->xxx) {
+ dst->texcoord[0][0] = src->v.tu0;
+ dst->texcoord[0][1] = src->v.tv0;
+ dst->texcoord[0][3] = 1.0;
+
+ dst->texcoord[1][0] = src->v.tu1;
+ dst->texcoord[1][1] = src->v.tv1;
+ dst->texcoord[1][3] = 1.0;
+ }
+ else {
+ dst->texcoord[0][0] = src->pv.u0;
+ dst->texcoord[0][1] = src->pv.v0;
+ dst->texcoord[0][3] = src->pv.q0;
+
+ dst->texcoord[1][0] = src->pv.u1;
+ dst->texcoord[1][1] = src->pv.v1;
+ dst->texcoord[1][3] = src->pv.q1;
+ }
+ }
+
+ dst->pointSize = ctx->Point._Size;
+}
+
+
+static void
+tdfx_fallback_tri( tdfxContextPtr imesa,
+ tdfxVertex *v0,
+ tdfxVertex *v1,
+ tdfxVertex *v2 )
+{
+ GLcontext *ctx = imesa->glCtx;
+ SWvertex v[3];
+ tdfx_translate_vertex( ctx, v0, &v[0] );
+ tdfx_translate_vertex( ctx, v1, &v[1] );
+ tdfx_translate_vertex( ctx, v2, &v[2] );
+ _swrast_Triangle( ctx, &v[0], &v[1], &v[2] );
+}
+
+
+static void
+tdfx_fallback_line( tdfxContextPtr imesa,
+ tdfxVertex *v0,
+ tdfxVertex *v1 )
+{
+ GLcontext *ctx = imesa->glCtx;
+ SWvertex v[2];
+ tdfx_translate_vertex( ctx, v0, &v[0] );
+ tdfx_translate_vertex( ctx, v1, &v[1] );
+ _swrast_Line( ctx, &v[0], &v[1] );
+}
+
+
+static void
+tdfx_fallback_point( tdfxContextPtr imesa,
+ tdfxVertex *v0 )
+{
+ GLcontext *ctx = imesa->glCtx;
+ SWvertex v[1];
+ tdfx_translate_vertex( ctx, v0, &v[0] );
+ _swrast_Point( ctx, &v[0] );
+}
+