summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/glide/fxdd.c
diff options
context:
space:
mode:
authorKeith Whitwell <[email protected]>2000-11-05 18:16:51 +0000
committerKeith Whitwell <[email protected]>2000-11-05 18:16:51 +0000
commitc6f348cbc908556da4f68a65cdf218ebd4e678be (patch)
tree3eb069026edbdddb507933fc538f392ae9070617 /src/mesa/drivers/glide/fxdd.c
parenta190221f70000a4be97a1a3f81fc125f88d3e7cb (diff)
Lots of changes:
- use the new interface to the software rasterizer. - manage all fallbacks internally, hooking in swrast or swrast_setup if necessary. - removed lots of marginal code no longer appropriate in a maturing driver. - reworked the vertex-setup and triangle routines, including drawing unfilled triangles from within the driver.
Diffstat (limited to 'src/mesa/drivers/glide/fxdd.c')
-rw-r--r--src/mesa/drivers/glide/fxdd.c269
1 files changed, 68 insertions, 201 deletions
diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c
index 4768e1a2339..10f635852a3 100644
--- a/src/mesa/drivers/glide/fxdd.c
+++ b/src/mesa/drivers/glide/fxdd.c
@@ -1,4 +1,3 @@
-/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */
/*
* Mesa 3-D graphics library
@@ -324,21 +323,6 @@ static void fxDDSetReadBuffer(GLcontext *ctx, GLframebuffer *buffer,
}
-#ifdef XF86DRI
-/* test if window coord (px,py) is visible */
-static GLboolean inClipRects(fxMesaContext fxMesa, int px, int py)
-{
- int i;
- for (i=0; i<fxMesa->numClipRects; i++) {
- if ((px>=fxMesa->pClipRects[i].x1) &&
- (px<fxMesa->pClipRects[i].x2) &&
- (py>=fxMesa->pClipRects[i].y1) &&
- (py<fxMesa->pClipRects[i].y2)) return GL_TRUE;
- }
- return GL_FALSE;
-}
-#endif
-
static GLboolean fxDDDrawBitmap(GLcontext *ctx, GLint px, GLint py,
GLsizei width, GLsizei height,
@@ -352,22 +336,25 @@ static GLboolean fxDDDrawBitmap(GLcontext *ctx, GLint px, GLint py,
struct gl_pixelstore_attrib scissoredUnpack;
/* check if there's any raster operations enabled which we can't handle */
- if (ctx->RasterMask & (ALPHATEST_BIT |
- BLEND_BIT |
- DEPTH_BIT |
- FOG_BIT |
- LOGIC_OP_BIT |
- SCISSOR_BIT |
- STENCIL_BIT |
- MASKING_BIT |
- ALPHABUF_BIT |
- MULTI_DRAW_BIT))
+ if (ctx->Color.AlphaEnabled ||
+ ctx->Color.BlendEnabled ||
+ ctx->Depth.Test ||
+ ctx->Fog.Enabled ||
+ ctx->Color.ColorLogicOpEnabled ||
+ ctx->Stencil.Enabled ||
+ ctx->Scissor.Enabled ||
+ ( ctx->DrawBuffer->UseSoftwareAlphaBuffers &&
+ ctx->Color.ColorMask[ACOMP]) ||
+ ctx->Color.MultiDrawBuffer)
return GL_FALSE;
+
if (ctx->Scissor.Enabled) {
/* This is a bit tricky, but by carefully adjusting the px, py,
* width, height, skipPixels and skipRows values we can do
* scissoring without special code in the rendering loop.
+ *
+ * KW: This code is never reached, see the test above.
*/
/* we'll construct a new pixelstore struct */
@@ -435,25 +422,15 @@ static GLboolean fxDDDrawBitmap(GLcontext *ctx, GLint px, GLint py,
return GL_TRUE;
}
-#ifdef XF86DRI
-#define INSIDE(c, x, y) inClipRects((c), (x), (y))
-#else
-#define INSIDE(c, x, y) (1)
-#endif
-
{
- const GLint winX = fxMesa->x_offset;
- const GLint winY = fxMesa->y_offset + fxMesa->height - 1;
+ const GLint winX = 0;
+ const GLint winY = fxMesa->height - 1;
/* The dest stride depends on the hardware and whether we're drawing
* to the front or back buffer. This compile-time test seems to do
* the job for now.
*/
-#ifdef XF86DRI
- const GLint dstStride = (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT)
- ? (fxMesa->screen_width) : (info.strideInBytes / 2);
-#else
const GLint dstStride = info.strideInBytes / 2; /* stride in GLushorts */
-#endif
+
GLint row;
/* compute dest address of bottom-left pixel in bitmap */
GLushort *dst = (GLushort *) info.lfbPtr
@@ -469,8 +446,7 @@ static GLboolean fxDDDrawBitmap(GLcontext *ctx, GLint px, GLint py,
GLint col;
for (col=0; col<width; col++) {
if (*src & mask) {
- if (INSIDE(fxMesa, winX + px + col, winY - py - row))
- dst[col] = color;
+ dst[col] = color;
}
if (mask == 128U) {
src++;
@@ -489,8 +465,7 @@ static GLboolean fxDDDrawBitmap(GLcontext *ctx, GLint px, GLint py,
GLint col;
for (col=0; col<width; col++) {
if (*src & mask) {
- if (INSIDE(fxMesa, winX + px + col, winY - py - row))
- dst[col] = color;
+ dst[col] = color;
}
if (mask == 1U) {
src++;
@@ -507,8 +482,6 @@ static GLboolean fxDDDrawBitmap(GLcontext *ctx, GLint px, GLint py,
}
}
-#undef INSIDE
-
FX_grLfbUnlock(GR_LFB_WRITE_ONLY,fxMesa->currentFB);
return GL_TRUE;
}
@@ -520,7 +493,7 @@ static GLboolean fxDDReadPixels( GLcontext *ctx, GLint x, GLint y,
const struct gl_pixelstore_attrib *packing,
GLvoid *dstImage )
{
- if (ctx->ImageTransferState) {
+ if (ctx->_ImageTransferState) {
return GL_FALSE; /* can't do this */
}
else {
@@ -535,14 +508,9 @@ static GLboolean fxDDReadPixels( GLcontext *ctx, GLint x, GLint y,
GR_ORIGIN_UPPER_LEFT,
FXFALSE,
&info)) {
- const GLint winX = fxMesa->x_offset;
- const GLint winY = fxMesa->y_offset + fxMesa->height - 1;
-#ifdef XF86DRI
- const GLint srcStride = (fxMesa->glCtx->Color.DrawBuffer == GL_FRONT)
- ? (fxMesa->screen_width) : (info.strideInBytes / 2);
-#else
+ const GLint winX = 0;
+ const GLint winY = fxMesa->height - 1;
const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */
-#endif
const GLushort *src = (const GLushort *) info.lfbPtr
+ (winY - y) * srcStride + (winX + x);
GLubyte *dst = (GLubyte *) _mesa_image_address(packing, dstImage,
@@ -640,18 +608,6 @@ static void fxDDFinish(GLcontext *ctx)
}
-static GLint fxDDGetParameteri(const GLcontext *ctx, GLint param)
-{
- switch(param) {
- case DD_HAVE_HARDWARE_FOG:
- return 1;
- default:
- fprintf(stderr,"fx Driver: internal error in fxDDGetParameteri(): %x\n", (int) param);
- fxCloseHardware();
- exit(-1);
- return 0;
- }
-}
void fxDDSetNearFar(GLcontext *ctx, GLfloat n, GLfloat f)
@@ -666,39 +622,6 @@ void fxDDSetNearFar(GLcontext *ctx, GLfloat n, GLfloat f)
*/
static const GLubyte *fxDDGetString(GLcontext *ctx, GLenum name)
{
-#if defined(GLX_DIRECT_RENDERING)
- /* Building for DRI driver */
- switch (name) {
- case GL_RENDERER:
- {
- static char buffer[100];
- char hardware[100];
- strcpy(hardware, grGetString(GR_HARDWARE));
- if (strcmp(hardware, "Voodoo3 (tm)") == 0)
- strcpy(hardware, "Voodoo3");
- else if (strcmp(hardware, "Voodoo Banshee (tm)") == 0)
- strcpy(hardware, "VoodooBanshee");
- else {
- /* unexpected result: replace spaces with hyphens */
- int i;
- for (i = 0; hardware[i]; i++) {
- if (hardware[i] == ' ' || hardware[i] == '\t')
- hardware[i] = '-';
- }
- }
- /* now make the GL_RENDERER string */
- sprintf(buffer, "Mesa DRI %s 20000510", hardware);
- return buffer;
- }
- case GL_VENDOR:
- return "Precision Insight, Inc.";
- default:
- return NULL;
- }
-
-#else
-
- /* Building for Voodoo1/2 stand-alone Mesa */
switch (name) {
case GL_RENDERER:
{
@@ -738,7 +661,6 @@ static const GLubyte *fxDDGetString(GLcontext *ctx, GLenum name)
default:
return NULL;
}
-#endif
}
@@ -834,12 +756,17 @@ int fxDDInitFxMesaContext( fxMesaContext fxMesa )
fxMesa->new_state = _NEW_ALL;
fxDDSetupInit();
- fxDDClipInit();
fxDDTrifuncInit();
fxDDFastPathInit();
+
+ /* Initialize the software rasterizer and helper modules.
+ */
+ _swrast_CreateContext( fxMesa->glCtx );
+ _swsetup_CreateContext( fxMesa->glCtx );
+
+
fxSetupDDPointers(fxMesa->glCtx);
- fxDDRenderInit(fxMesa->glCtx);
fxDDInitExtensions(fxMesa->glCtx);
fxDDSetNearFar(fxMesa->glCtx,1.0,100.0);
@@ -868,13 +795,6 @@ int fxDDInitFxMesaContext( fxMesaContext fxMesa )
}
-#if 0
-/* Example extension function */
-static void fxFooBarEXT(GLint i)
-{
- printf("You called glFooBarEXT(%d)\n", i);
-}
-#endif
void fxDDInitExtensions( GLcontext *ctx )
@@ -894,26 +814,6 @@ void fxDDInitExtensions( GLcontext *ctx )
if (!fxMesa->emulateTwoTMUs)
gl_extensions_disable(ctx, "GL_ARB_multitexture");
-
-
- /* Example of hooking in an extension function.
- * For DRI-based drivers, also see __driRegisterExtensions in the
- * tdfx_xmesa.c file.
- */
-#if 0
- {
- void **dispatchTable = (void **) ctx->Exec;
- const int _gloffset_FooBarEXT = 555; /* just an example number! */
- const int tabSize = _glapi_get_dispatch_table_size();
- assert(_gloffset_FooBarEXT < tabSize);
- dispatchTable[_gloffset_FooBarEXT] = (void *) fxFooBarEXT;
- /* XXX You would also need to hook into the display list dispatch
- * table. Really, the implementation of extensions might as well
- * be in the core of Mesa since core Mesa and the device driver
- * is one big shared lib.
- */
- }
-#endif
}
@@ -929,48 +829,52 @@ static GLboolean fxIsInHardware(GLcontext *ctx)
{
fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
+ if (ctx->RenderMode != GL_RENDER)
+ return GL_FALSE;
+
if (!ctx->Hint.AllowDrawMem)
return GL_TRUE; /* you'll take it and like it */
- if((ctx->RasterMask & (STENCIL_BIT | MULTI_DRAW_BIT)) ||
- ((ctx->Color.BlendEnabled) && (ctx->Color.BlendEquation!=GL_FUNC_ADD_EXT)) ||
- ((ctx->Color.ColorLogicOpEnabled) && (ctx->Color.LogicOp!=GL_COPY)) ||
- (ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) ||
- (!((ctx->Color.ColorMask[RCOMP]==ctx->Color.ColorMask[GCOMP]) &&
- (ctx->Color.ColorMask[GCOMP]==ctx->Color.ColorMask[BCOMP]) &&
- (ctx->Color.ColorMask[ACOMP]==ctx->Color.ColorMask[ACOMP])))
- )
+ if (ctx->Stencil.Enabled ||
+ ctx->Color.MultiDrawBuffer ||
+ ((ctx->Color.BlendEnabled) && (ctx->Color.BlendEquation!=GL_FUNC_ADD_EXT)) ||
+ ((ctx->Color.ColorLogicOpEnabled) && (ctx->Color.LogicOp!=GL_COPY)) ||
+ (ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) ||
+ (!((ctx->Color.ColorMask[RCOMP]==ctx->Color.ColorMask[GCOMP]) &&
+ (ctx->Color.ColorMask[GCOMP]==ctx->Color.ColorMask[BCOMP]) &&
+ (ctx->Color.ColorMask[ACOMP]==ctx->Color.ColorMask[ACOMP])))
+ )
{
return GL_FALSE;
}
/* Unsupported texture/multitexture cases */
if(fxMesa->emulateTwoTMUs) {
- if((ctx->Enabled & (TEXTURE0_3D | TEXTURE1_3D)) ||
+ if((ctx->_Enabled & (TEXTURE0_3D | TEXTURE1_3D)) ||
/* Not very well written ... */
- ((ctx->Enabled & (TEXTURE0_1D | TEXTURE1_1D)) &&
- ((ctx->Enabled & (TEXTURE0_2D | TEXTURE1_2D))!=(TEXTURE0_2D | TEXTURE1_2D)))
+ ((ctx->_Enabled & (TEXTURE0_1D | TEXTURE1_1D)) &&
+ ((ctx->_Enabled & (TEXTURE0_2D | TEXTURE1_2D))!=(TEXTURE0_2D | TEXTURE1_2D)))
) {
return GL_FALSE;
}
- if (ctx->Texture.ReallyEnabled & TEXTURE0_2D) {
+ if (ctx->Texture._ReallyEnabled & TEXTURE0_2D) {
if (ctx->Texture.Unit[0].EnvMode == GL_BLEND &&
- (ctx->Texture.ReallyEnabled & TEXTURE1_2D ||
+ (ctx->Texture._ReallyEnabled & TEXTURE1_2D ||
ctx->Texture.Unit[0].EnvColor[0] != 0 ||
ctx->Texture.Unit[0].EnvColor[1] != 0 ||
ctx->Texture.Unit[0].EnvColor[2] != 0 ||
ctx->Texture.Unit[0].EnvColor[3] != 1)) {
return GL_FALSE;
}
- if (ctx->Texture.Unit[0].Current->Image[0]->Border > 0)
+ if (ctx->Texture.Unit[0]._Current->Image[0]->Border > 0)
return GL_FALSE;
}
- if (ctx->Texture.ReallyEnabled & TEXTURE1_2D) {
+ if (ctx->Texture._ReallyEnabled & TEXTURE1_2D) {
if (ctx->Texture.Unit[1].EnvMode == GL_BLEND)
return GL_FALSE;
- if (ctx->Texture.Unit[0].Current->Image[0]->Border > 0)
+ if (ctx->Texture.Unit[0]._Current->Image[0]->Border > 0)
return GL_FALSE;
}
@@ -982,8 +886,8 @@ static GLboolean fxIsInHardware(GLcontext *ctx)
/* KW: This was wrong (I think) and I changed it... which doesn't mean
* it is now correct...
*/
- if((ctx->Enabled & (TEXTURE0_1D | TEXTURE0_2D | TEXTURE0_3D)) &&
- (ctx->Enabled & (TEXTURE1_1D | TEXTURE1_2D | TEXTURE1_3D)))
+ if((ctx->_Enabled & (TEXTURE0_1D | TEXTURE0_2D | TEXTURE0_3D)) &&
+ (ctx->_Enabled & (TEXTURE1_1D | TEXTURE1_2D | TEXTURE1_3D)))
{
/* Can't use multipass to blend a multitextured triangle - fall
* back to software.
@@ -1002,16 +906,16 @@ static GLboolean fxIsInHardware(GLcontext *ctx)
}
}
} else {
- if((ctx->Enabled & (TEXTURE1_1D | TEXTURE1_2D | TEXTURE1_3D)) ||
+ if((ctx->_Enabled & (TEXTURE1_1D | TEXTURE1_2D | TEXTURE1_3D)) ||
/* Not very well written ... */
- ((ctx->Enabled & TEXTURE0_1D) &&
- (!(ctx->Enabled & TEXTURE0_2D)))
+ ((ctx->_Enabled & TEXTURE0_1D) &&
+ (!(ctx->_Enabled & TEXTURE0_2D)))
) {
return GL_FALSE;
}
- if((ctx->Texture.ReallyEnabled & TEXTURE0_2D) &&
+ if((ctx->Texture._ReallyEnabled & TEXTURE0_2D) &&
(ctx->Texture.Unit[0].EnvMode==GL_BLEND)) {
return GL_FALSE;
}
@@ -1023,50 +927,32 @@ static GLboolean fxIsInHardware(GLcontext *ctx)
static void fxDDUpdateDDPointers(GLcontext *ctx)
{
- fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
GLuint new_state = ctx->NewState;
- if (MESA_VERBOSE&(VERBOSE_DRIVER|VERBOSE_STATE))
- fprintf(stderr,"fxmesa: fxDDUpdateDDPointers(...)\n");
+ _swrast_InvalidateState( ctx, new_state );
+ _swsetup_InvalidateState( ctx, new_state );
- if (new_state & _FX_NEW_FALLBACK)
- fxMesa->is_in_hardware = fxIsInHardware(ctx);
+ if (new_state & (_FX_NEW_IS_IN_HARDWARE |
+ _FX_NEW_RENDERSTATE |
+ _FX_NEW_SETUP_FUNCTION))
+ {
+ fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
- if (fxMesa->is_in_hardware) {
+ if (new_state & _FX_NEW_IS_IN_HARDWARE)
+ fxMesa->is_in_hardware = fxIsInHardware(ctx);
+
if (fxMesa->new_state)
fxSetupFXUnits(ctx);
- if (new_state & _FX_NEW_RENDERSTATE) {
+ if (new_state & _FX_NEW_RENDERSTATE)
fxDDChooseRenderState( ctx );
-
- fxMesa->RenderVBTables=fxDDChooseRenderVBTables(ctx);
- fxMesa->RenderVBClippedTab=fxMesa->RenderVBTables[0];
- fxMesa->RenderVBCulledTab=fxMesa->RenderVBTables[1];
- fxMesa->RenderVBRawTab=fxMesa->RenderVBTables[2];
- }
if (new_state & _FX_NEW_SETUP_FUNCTION)
- ctx->Driver.RasterSetup=fxDDChooseSetupFunction(ctx);
-
-
- ctx->Driver.PointsFunc=fxMesa->PointsFunc;
- ctx->Driver.LineFunc=fxMesa->LineFunc;
- ctx->Driver.TriangleFunc=fxMesa->TriangleFunc;
- ctx->Driver.QuadFunc=fxMesa->QuadFunc;
- } else {
- fxMesa->render_index = FX_FALLBACK;
+ ctx->Driver.RasterSetup = fxDDChooseSetupFunction(ctx);
}
}
-static void fxDDReducedPrimitiveChange(GLcontext *ctx, GLenum prim)
-{
- if (ctx->Polygon.CullFlag) {
- if (ctx->ReducedPrimitive != GL_POLYGON) { /* Lines or Points */
- FX_grCullMode(GR_CULL_DISABLE);
- FX_CONTEXT(ctx)->cullMode=GR_CULL_DISABLE;
- }
- }
-}
+
void fxSetupDDPointers(GLcontext *ctx)
{
@@ -1074,13 +960,7 @@ void fxSetupDDPointers(GLcontext *ctx)
fprintf(stderr,"fxmesa: fxSetupDDPointers()\n");
}
- ctx->Driver.UpdateStateNotify = (_FX_NEW_SETUP_FUNCTION|
- _FX_NEW_RENDERSTATE|
- _FX_NEW_FALLBACK|
- _SWRAST_NEW_TRIANGLE|
- _SWRAST_NEW_LINE|
- _SWRAST_NEW_POINT);
-
+ ctx->Driver.UpdateStateNotify = ~0;
ctx->Driver.UpdateState=fxDDUpdateDDPointers;
ctx->Driver.WriteDepthSpan=fxDDWriteDepthSpan;
@@ -1092,8 +972,6 @@ void fxSetupDDPointers(GLcontext *ctx)
ctx->Driver.NearFar=fxDDSetNearFar;
- ctx->Driver.GetParameteri=fxDDGetParameteri;
-
ctx->Driver.ClearIndex=NULL;
ctx->Driver.ClearColor=fxDDClearColor;
ctx->Driver.Clear=fxDDClear;
@@ -1137,27 +1015,16 @@ void fxSetupDDPointers(GLcontext *ctx)
ctx->Driver.CullFace=fxDDCullFace;
ctx->Driver.ShadeModel=fxDDShadeModel;
ctx->Driver.Enable=fxDDEnable;
- ctx->Driver.ReducedPrimitiveChange=fxDDReducedPrimitiveChange;
ctx->Driver.RegisterVB=fxDDRegisterVB;
ctx->Driver.UnregisterVB=fxDDUnregisterVB;
ctx->Driver.RegisterPipelineStages = fxDDRegisterPipelineStages;
- ctx->Driver.OptimizeImmediatePipeline = 0; /* nothing done yet */
- ctx->Driver.OptimizePrecalcPipeline = 0;
-
-/* if (getenv("MESA_USE_FAST") || getenv("FX_USE_FAST")) */
-/* ctx->Driver.OptimizePrecalcPipeline = fxDDOptimizePrecalcPipeline; */
-
if (!getenv("FX_NO_FAST"))
ctx->Driver.BuildPrecalcPipeline = fxDDBuildPrecalcPipeline;
- ctx->Driver.TriangleCaps = DD_TRI_CULL|DD_TRI_OFFSET|DD_TRI_LIGHT_TWOSIDE;
-
fxSetupDDSpanPointers(ctx);
-
- FX_CONTEXT(ctx)->render_index = 1; /* force an update */
fxDDUpdateDDPointers(ctx);
}