summaryrefslogtreecommitdiff
path: root/xc/extras/Mesa/src/FX/fxpipeline.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/extras/Mesa/src/FX/fxpipeline.c')
-rw-r--r--xc/extras/Mesa/src/FX/fxpipeline.c302
1 files changed, 302 insertions, 0 deletions
diff --git a/xc/extras/Mesa/src/FX/fxpipeline.c b/xc/extras/Mesa/src/FX/fxpipeline.c
new file mode 100644
index 000000000..cf4c9ebbc
--- /dev/null
+++ b/xc/extras/Mesa/src/FX/fxpipeline.c
@@ -0,0 +1,302 @@
+/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */
+
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.3
+ *
+ * Copyright (C) 1999-2000 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.
+ *
+ *
+ * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the
+ * terms stated above.
+ *
+ * Thank you for your contribution, David!
+ *
+ * Please make note of the above copyright/license statement. If you
+ * contributed code or bug fixes to this code under the previous (GNU
+ * Library) license and object to the new license, your code will be
+ * removed at your request. Please see the Mesa docs/COPYRIGHT file
+ * for more information.
+ *
+ * Additional Mesa/3Dfx driver developers:
+ * Daryll Strauss <daryll@precisioninsight.com>
+ * Keith Whitwell <keith@precisioninsight.com>
+ *
+ * See fxapi.h for more revision/author details.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include "conf.h"
+#endif
+
+
+#if defined(FX)
+
+#include "fxdrv.h"
+#include "vbindirect.h"
+
+
+/* We don't handle texcoord-4 in the safe clip routines - maybe we should.
+ */
+static void fxDDRenderElements( struct vertex_buffer *VB )
+{
+ GLcontext *ctx = VB->ctx;
+ fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx;
+
+ if (fxMesa->render_index != 0 ||
+ ((ctx->Texture.ReallyEnabled & 0xf) && VB->TexCoordPtr[0]->size>2) ||
+ ((ctx->Texture.ReallyEnabled & 0xf0) && VB->TexCoordPtr[1]->size>2) ||
+ (VB->ClipPtr->size != 4)) /* Brokes clipping otherwise */
+ gl_render_elts( VB );
+ else
+ fxDDRenderElementsDirect( VB );
+}
+
+static void fxDDCheckRenderVBIndirect( GLcontext *ctx,
+ struct gl_pipeline_stage *d )
+{
+ d->type = 0;
+
+ if ((ctx->IndirectTriangles & DD_SW_SETUP) == 0 &&
+ ctx->Driver.MultipassFunc == 0)
+ {
+ d->type = PIPE_IMMEDIATE;
+ d->inputs = VERT_SETUP_FULL | VERT_ELT | VERT_PRECALC_DATA;
+ }
+}
+
+static void fxDDRenderVBIndirect( struct vertex_buffer *VB )
+{
+ GLcontext *ctx = VB->ctx;
+ fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx;
+ struct vertex_buffer *cvaVB = ctx->CVA.VB;
+
+ if (fxMesa->render_index != 0 ||
+ ((ctx->Texture.ReallyEnabled & 0xf) && cvaVB->TexCoordPtr[0]->size>2) ||
+ ((ctx->Texture.ReallyEnabled & 0xf0) && cvaVB->TexCoordPtr[1]->size>2) ||
+ (VB->ClipPtr->size != 4)) /* Brokes clipping otherwise */
+ gl_render_vb_indirect( VB );
+ else
+ fxDDRenderVBIndirectDirect( VB );
+}
+
+
+static void fxDDRenderVB( struct vertex_buffer *VB )
+{
+ GLcontext *ctx = VB->ctx;
+ fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx;
+
+ if ((fxMesa->render_index != 0) ||
+ ((ctx->Texture.ReallyEnabled & 0xf) && VB->TexCoordPtr[0]->size>2) ||
+ ((ctx->Texture.ReallyEnabled & 0xf0) && VB->TexCoordPtr[1]->size>2))
+ gl_render_vb( VB );
+ else
+ fxDDDoRenderVB( VB );
+}
+
+
+
+
+/* This sort of driver-based reconfiguration of the pipeline could be
+ * used to support accelerated transformation and lighting on capable
+ * hardware.
+ *
+ */
+GLuint fxDDRegisterPipelineStages( struct gl_pipeline_stage *out,
+ const struct gl_pipeline_stage *in,
+ GLuint nr )
+{
+ GLuint i, o;
+
+ for (i = o = 0 ; i < nr ; i++) {
+ switch (in[i].ops) {
+ case PIPE_OP_RAST_SETUP_1|PIPE_OP_RENDER:
+ out[o] = in[i];
+ out[o].state_change = NEW_CLIENT_STATE;
+ out[o].check = fxDDCheckMergeAndRender;
+ out[o].run = fxDDMergeAndRender;
+ o++;
+ break;
+ case PIPE_OP_RAST_SETUP_0:
+ out[o] = in[i];
+ out[o].cva_state_change = NEW_LIGHTING|NEW_TEXTURING|NEW_RASTER_OPS;
+ out[o].state_change = ~0;
+ out[o].check = fxDDCheckPartialRasterSetup;
+ out[o].run = fxDDPartialRasterSetup;
+ o++;
+ break;
+ case PIPE_OP_RAST_SETUP_0|PIPE_OP_RAST_SETUP_1:
+ out[o] = in[i];
+ out[o].run = fxDDDoRasterSetup;
+ o++;
+ break;
+ case PIPE_OP_RENDER:
+ out[o] = in[i];
+ if (in[i].run == gl_render_elts) {
+ out[o].run = fxDDRenderElements;
+ } else if (in[i].run == gl_render_vb_indirect) {
+ out[o].check = fxDDCheckRenderVBIndirect;
+ out[o].run = fxDDRenderVBIndirect;
+ } else if (in[i].run == gl_render_vb) {
+ out[o].run = fxDDRenderVB;
+ }
+
+ o++;
+ break;
+ default:
+ out[o++] = in[i];
+ break;
+ }
+ }
+
+ return o;
+}
+
+#define ILLEGAL_ENABLES (TEXTURE0_3D| \
+ TEXTURE1_3D| \
+ ENABLE_TEXMAT0 | \
+ ENABLE_TEXMAT1 | \
+ ENABLE_TEXGEN0 | \
+ ENABLE_TEXGEN1 | \
+ ENABLE_USERCLIP | \
+ ENABLE_LIGHT | \
+ ENABLE_FOG)
+
+
+
+/* Because this is slotted in by the OptimizePipeline function, most
+ * of the information here is just for gl_print_pipeline(). Only the
+ * run member is required.
+ */
+static struct gl_pipeline_stage fx_fast_stage = {
+ "FX combined vertex transform, setup and rasterization stage",
+ PIPE_OP_VERT_XFORM|PIPE_OP_RAST_SETUP_0|PIPE_OP_RAST_SETUP_1|PIPE_OP_RENDER,
+ PIPE_PRECALC,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0, /* never called */
+ fxDDFastPath
+};
+
+
+
+
+/* Better than optimizing the pipeline, we can do the whole build very
+ * quickly with the aid of a new flags member.
+ */
+GLboolean fxDDBuildPrecalcPipeline( GLcontext *ctx )
+{
+ struct gl_pipeline *pipe = &ctx->CVA.pre;
+ fxMesaContext fxMesa = FX_CONTEXT(ctx);
+
+
+ if (fxMesa->is_in_hardware &&
+ fxMesa->render_index == 0 &&
+ (ctx->Enabled & ILLEGAL_ENABLES) == 0 &&
+ (ctx->Array.Flags & (VERT_OBJ_234|
+ VERT_TEX0_4|
+ VERT_TEX1_4|
+ VERT_ELT)) == (VERT_OBJ_23|VERT_ELT))
+ {
+ if (MESA_VERBOSE & (VERBOSE_STATE|VERBOSE_DRIVER))
+ if (!fxMesa->using_fast_path)
+ fprintf(stderr, "fxMesa: using fast path\n");
+
+ pipe->stages[0] = &fx_fast_stage;
+ pipe->stages[1] = 0;
+ pipe->new_inputs = ctx->RenderFlags & VERT_DATA;
+ pipe->ops = pipe->stages[0]->ops;
+ fxMesa->using_fast_path = 1;
+ return 1;
+ }
+
+ if (fxMesa->using_fast_path)
+ {
+ if (MESA_VERBOSE & (VERBOSE_STATE|VERBOSE_DRIVER))
+ fprintf(stderr, "fxMesa: fall back to full pipeline %x %x %x %x %x\n",
+ fxMesa->is_in_hardware,
+ fxMesa->render_index,
+ (ctx->Enabled & ILLEGAL_ENABLES),
+ (ctx->Array.Summary & (VERT_OBJ_23)),
+ (ctx->Array.Summary & (VERT_OBJ_4|VERT_TEX0_4|VERT_TEX1_4)));
+
+ fxMesa->using_fast_path = 0;
+ ctx->CVA.VB->ClipOrMask = 0;
+ ctx->CVA.VB->ClipAndMask = CLIP_ALL_BITS;
+ ctx->Array.NewArrayState |= ctx->Array.Summary;
+ return 0;
+ }
+
+ return 0;
+}
+
+
+
+
+
+
+/* Perform global optimizations to the pipeline. The fx driver
+ * implements a single such fast path, which corresponds to the standard
+ * quake3 cva pipeline.
+ *
+ * This is now handled by the 'build' function above.
+ */
+void fxDDOptimizePrecalcPipeline( GLcontext *ctx, struct gl_pipeline *pipe )
+{
+ fxMesaContext fxMesa = FX_CONTEXT(ctx);
+
+ if (fxMesa->is_in_hardware &&
+ fxMesa->render_index == 0 &&
+ (ctx->Enabled & ILLEGAL_ENABLES) == 0 &&
+ (ctx->Array.Summary & VERT_ELT))
+ {
+ pipe->stages[0] = &fx_fast_stage;
+ pipe->stages[1] = 0;
+ }
+}
+
+
+
+/* unused?
+void fxDDOptimizeEltPipeline( GLcontext *ctx, struct gl_pipeline *pipe )
+{
+ (void) ctx;
+ (void) pipe;
+}
+*/
+
+#else
+
+/*
+ * Need this to provide at least one external definition.
+ */
+int gl_fxpipeline_dummy(void)
+{
+ return 0;
+}
+
+#endif