diff options
Diffstat (limited to 'src/mesa/drivers/glide/fxapi.c')
-rw-r--r-- | src/mesa/drivers/glide/fxapi.c | 783 |
1 files changed, 407 insertions, 376 deletions
diff --git a/src/mesa/drivers/glide/fxapi.c b/src/mesa/drivers/glide/fxapi.c index 451c3a8ce2a..89b4a38a620 100644 --- a/src/mesa/drivers/glide/fxapi.c +++ b/src/mesa/drivers/glide/fxapi.c @@ -1,4 +1,4 @@ -/* $Id: fxapi.c,v 1.37 2003/08/19 15:52:53 brianp Exp $ */ +/* $Id: fxapi.c,v 1.38 2003/10/02 17:36:44 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -44,6 +44,22 @@ #if defined(FX) #include "fxdrv.h" +#ifndef TDFX_DEBUG +int TDFX_DEBUG = (0 +/* | VERBOSE_VARRAY */ +/* | VERBOSE_TEXTURE */ +/* | VERBOSE_IMMEDIATE */ +/* | VERBOSE_PIPELINE */ +/* | VERBOSE_DRIVER */ +/* | VERBOSE_STATE */ +/* | VERBOSE_API */ +/* | VERBOSE_DISPLAY_LIST */ +/* | VERBOSE_LIGHTING */ +/* | VERBOSE_PRIMS */ +/* | VERBOSE_VERTS */ + ); +#endif + static fxMesaContext fxMesaCurrentCtx = NULL; /* @@ -54,8 +70,8 @@ static int glbGlideInitialized = 0; static int glb3DfxPresent = 0; static int glbTotNumCtx = 0; -GrHwConfiguration glbHWConfig; -int glbCurrentBoard = 0; +static GrHwConfiguration glbHWConfig; +static int glbCurrentBoard = 0; #if defined(__WIN32__) @@ -78,7 +94,7 @@ cleangraphics(void) static void cleangraphics_handler(int s) { - fprintf(stderr, "fxmesa: Received a not handled signal %d\n", s); + fprintf(stderr, "fxmesa: ERROR: received a not handled signal %d\n", s); cleangraphics(); /* abort(); */ @@ -91,8 +107,7 @@ cleangraphics_handler(int s) * Select the Voodoo board to use when creating * a new context. */ -GLboolean GLAPIENTRY -fxMesaSelectCurrentBoard(int n) +GLboolean GLAPIENTRY fxMesaSelectCurrentBoard (int n) { fxQueryHardware(); @@ -142,13 +157,14 @@ gl3DfxSetPaletteEXT(GLuint * pal) { fxMesaContext fxMesa = fxMesaCurrentCtx; - if (MESA_VERBOSE & VERBOSE_DRIVER) { + if (TDFX_DEBUG & VERBOSE_DRIVER) { int i; - fprintf(stderr, "fxmesa: gl3DfxSetPaletteEXT()\n"); + fprintf(stderr, "%s(...)\n", __FUNCTION__); - for (i = 0; i < 256; i++) - fprintf(stderr, "%x\n", pal[i]); + for (i = 0; i < 256; i++) { + fprintf(stderr, "\t%x\n", pal[i]); + } } if (fxMesa) { @@ -159,53 +175,34 @@ gl3DfxSetPaletteEXT(GLuint * pal) } -static GrScreenResolution_t -fxBestResolution(int width, int height, int aux) +static GrScreenResolution_t fxBestResolution (int width, int height) { - static int resolutions[][5] = { - {320, 200, GR_RESOLUTION_320x200, 2, 2}, - {320, 240, GR_RESOLUTION_320x240, 2, 2}, - {512, 384, GR_RESOLUTION_512x384, 2, 2}, - {640, 400, GR_RESOLUTION_640x400, 2, 2}, - {640, 480, GR_RESOLUTION_640x480, 2, 2}, - {800, 600, GR_RESOLUTION_800x600, 4, 2}, - {960, 720, GR_RESOLUTION_960x720, 6, 4} -#ifdef GR_RESOLUTION_1024x768 - , {1024, 768, GR_RESOLUTION_1024x768, 8, 4} -#endif -#ifdef GR_RESOLUTION_1280x1024 - , {1280, 1024, GR_RESOLUTION_1280x1024, 8, 8} -#endif -#ifdef GR_RESOLUTION_1600x1200 - , {1600, 1200, GR_RESOLUTION_1600x1200, 16, 8} -#endif - }; - int NUM_RESOLUTIONS = sizeof(resolutions) / (sizeof(int) * 5); - int i, fbmem; - GrScreenResolution_t lastvalidres = resolutions[4][2]; - - fxQueryHardware(); - - fbmem = glbHWConfig.SSTs[glbCurrentBoard].VoodooConfig.fbRam - * glbHWConfig.SSTs[glbCurrentBoard].VoodooConfig.numChips; - - /* A work around for BZFlag */ - - if ((width == 1) && (height == 1)) { - width = 640; - height = 480; - } - - for (i = 0; i < NUM_RESOLUTIONS; i++) { - if (resolutions[i][4 - aux] <= fbmem) { - if ((width <= resolutions[i][0]) && (height <= resolutions[i][1])) { - return resolutions[i][2]; - } - lastvalidres = resolutions[i][2]; - } - } + static int resolutions[][5] = { + { 320, 200, GR_RESOLUTION_320x200 }, + { 320, 240, GR_RESOLUTION_320x240 }, + { 512, 384, GR_RESOLUTION_512x384 }, + { 640, 400, GR_RESOLUTION_640x400 }, + { 640, 480, GR_RESOLUTION_640x480 }, + { 800, 600, GR_RESOLUTION_800x600 }, + {1024, 768, GR_RESOLUTION_1024x768 }, + {1280, 1024, GR_RESOLUTION_1280x1024}, + {1600, 1200, GR_RESOLUTION_1600x1200}, + }; + + int i, NUM_RESOLUTIONS = sizeof(resolutions) / sizeof(resolutions[0]); + int lastvalidres = 4; /* set default to GR_RESOLUTION_640x480 */ + int min = 2048 * 2048; /* max is GR_RESOLUTION_2048x2048 */ + + for (i = 0; i < NUM_RESOLUTIONS; i++) { + if ((width <= resolutions[i][0]) && (height <= resolutions[i][1])) { + if (min > (resolutions[i][0] * resolutions[i][1])) { + min = resolutions[i][0] * resolutions[i][1]; + lastvalidres = i; + } + } + } - return lastvalidres; + return resolutions[lastvalidres][2]; } @@ -213,63 +210,16 @@ fxMesaContext GLAPIENTRY fxMesaCreateBestContext(GLuint win, GLint width, GLint height, const GLint attribList[]) { - GrScreenRefresh_t refresh; - int i; - int res, aux; - refresh = GR_REFRESH_75Hz; - - if (getenv("SST_SCREENREFRESH")) { - if (!strcmp(getenv("SST_SCREENREFRESH"), "60")) - refresh = GR_REFRESH_60Hz; - if (!strcmp(getenv("SST_SCREENREFRESH"), "70")) - refresh = GR_REFRESH_70Hz; - if (!strcmp(getenv("SST_SCREENREFRESH"), "72")) - refresh = GR_REFRESH_72Hz; - if (!strcmp(getenv("SST_SCREENREFRESH"), "75")) - refresh = GR_REFRESH_75Hz; - if (!strcmp(getenv("SST_SCREENREFRESH"), "80")) - refresh = GR_REFRESH_80Hz; - if (!strcmp(getenv("SST_SCREENREFRESH"), "85")) - refresh = GR_REFRESH_85Hz; - if (!strcmp(getenv("SST_SCREENREFRESH"), "90")) - refresh = GR_REFRESH_90Hz; - if (!strcmp(getenv("SST_SCREENREFRESH"), "100")) - refresh = GR_REFRESH_100Hz; - if (!strcmp(getenv("SST_SCREENREFRESH"), "120")) - refresh = GR_REFRESH_120Hz; - } - - aux = 0; - for (i = 0; attribList[i] != FXMESA_NONE; i++) - if ((attribList[i] == FXMESA_ALPHA_SIZE) || - (attribList[i] == FXMESA_DEPTH_SIZE)) { - if (attribList[++i] > 0) { - aux = 1; - break; - } - } + int res = fxBestResolution(width, height); - res = fxBestResolution(width, height, aux); + if (res == -1) { + return NULL; + } - return fxMesaCreateContext(win, res, refresh, attribList); + return fxMesaCreateContext(win, res, GR_REFRESH_60Hz/*ZZZ: GR_REFRESH_75Hz*/, attribList); } -#if 0 -void -fxsignals() -{ - signal(SIGINT, SIG_IGN); - signal(SIGHUP, SIG_IGN); - signal(SIGPIPE, SIG_IGN); - signal(SIGFPE, SIG_IGN); - signal(SIGBUS, SIG_IGN); - signal(SIGILL, SIG_IGN); - signal(SIGSEGV, SIG_IGN); - signal(SIGTERM, SIG_IGN); -} -#endif - /* * Create a new FX/Mesa context and return a handle to it. */ @@ -278,149 +228,269 @@ fxMesaCreateContext(GLuint win, GrScreenResolution_t res, GrScreenRefresh_t ref, const GLint attribList[]) { - fxMesaContext fxMesa = NULL; - int i, type; - int aux; - GLboolean doubleBuffer = GL_FALSE; - GLboolean alphaBuffer = GL_FALSE; - GLboolean verbose = GL_FALSE; - GLint depthSize = 0; - GLint stencilSize = 0; - GLint accumSize = 0; - GLcontext *shareCtx = NULL; - GLcontext *ctx = 0; - /*FX_GrContext_t glideContext = 0; */ - char *errorstr; - GLboolean useBGR; - GLuint pixFmt, colDepth = 16; - GLint redBits, greenBits, blueBits, alphaBits; - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxMesaCreateContext() Start\n"); - } + fxMesaContext fxMesa = NULL; + GLcontext *ctx = NULL, *shareCtx = NULL; + + int i; + const char *str; + int numChips, sliaa, fsaa; + struct SstCard_St *voodoo; + struct tdfx_glide *Glide; + + GLboolean aux; + GLboolean doubleBuffer; + GLuint colDepth; + GLuint depthSize, alphaSize, stencilSize, accumSize; + GLuint redBits, greenBits, blueBits, alphaBits; + GrPixelFormat_t pixFmt; + + GLboolean useBGR; + GLboolean verbose = GL_FALSE; + + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(...)\n", __FUNCTION__); + } - if (getenv("MESA_FX_INFO")) - verbose = GL_TRUE; - - aux = 0; - i = 0; - while (attribList[i] != FXMESA_NONE) { - switch (attribList[i]) { - case FXMESA_COLORDEPTH: - colDepth = attribList[++i]; - break; - case FXMESA_DOUBLEBUFFER: - doubleBuffer = GL_TRUE; - break; - case FXMESA_ALPHA_SIZE: - i++; - alphaBuffer = attribList[i] > 0; - if (alphaBuffer) { - aux = 1; - } - break; - case FXMESA_DEPTH_SIZE: - i++; - depthSize = attribList[i]; - if (depthSize) { - aux = 1; - } - break; - case FXMESA_STENCIL_SIZE: - i++; - stencilSize = attribList[i]; - break; - case FXMESA_ACCUM_SIZE: - i++; - accumSize = attribList[i]; - break; - /* XXX ugly hack here for sharing display lists */ -#define FXMESA_SHARE_CONTEXT 990099 /* keep in sync with xmesa1.c! */ - case FXMESA_SHARE_CONTEXT: - i++; - { - const void *vPtr = &attribList[i]; - GLcontext **ctx = (GLcontext **) vPtr; - shareCtx = *ctx; - } - break; - default: - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: bad FXMESA_* switch\n"); - } - return NULL; - } - i++; - } + if (getenv("MESA_FX_INFO")) { + verbose = GL_TRUE; + } - if (depthSize) { - depthSize = (colDepth == 32) ? 24 : 16; - } + /* Okay, first process the user flags */ + aux = GL_FALSE; + doubleBuffer = GL_FALSE; + colDepth = 16; + depthSize = alphaSize = stencilSize = accumSize = 0; + + i = 0; + while (attribList[i] != FXMESA_NONE) { + switch (attribList[i]) { + case FXMESA_COLORDEPTH: + colDepth = attribList[++i]; + break; + case FXMESA_DOUBLEBUFFER: + doubleBuffer = GL_TRUE; + break; + case FXMESA_ALPHA_SIZE: + if ((alphaSize = attribList[++i])) { + aux = GL_TRUE; + } + break; + case FXMESA_DEPTH_SIZE: + if ((depthSize = attribList[++i])) { + aux = GL_TRUE; + } + break; + case FXMESA_STENCIL_SIZE: + stencilSize = attribList[++i]; + break; + case FXMESA_ACCUM_SIZE: + accumSize = attribList[++i]; + break; + /* XXX ugly hack here for sharing display lists */ + case FXMESA_SHARE_CONTEXT: + { + const void *vPtr = &attribList[++i]; + GLcontext **ctx = (GLcontext **)vPtr; + shareCtx = *ctx; + } + break; + default: + fprintf(stderr, "%s: ERROR: wrong parameter (%d) passed\n", __FUNCTION__, attribList[i]); + return NULL; + } + i++; + } - /* A workaround for Linux GLQuake */ - if (depthSize && alphaBuffer) - alphaBuffer = 0; + if (!fxQueryHardware()) { + fprintf(stderr, "%s: ERROR: no Voodoo hardware!\n", __FUNCTION__); + return NULL; + } - if ((type = fxQueryHardware()) < 0) { - fprintf(stderr, "fxmesa: ERROR no Voodoo hardware!\n"); - return NULL; - } + grSstSelect(glbCurrentBoard); + /*grEnable(GR_OPENGL_MODE_EXT);*/ /* ZZZ: trick to make GL happy. + Glide3 will unmap memory for card when grSstWinClose is called. + This also forces the SLI band height to be 32 (above 1024x768) or 16 + and disables the splash screen due to y-origin swapping. + Note: We only want the former. */ + voodoo = &glbHWConfig.SSTs[glbCurrentBoard]; + numChips = voodoo->numChips; + + fxMesa = (fxMesaContext)CALLOC_STRUCT(tfxMesaContext); + if (!fxMesa) { + str = "private context"; + goto errorhandler; + } - grSstSelect(glbCurrentBoard); + fxMesa->type = voodoo->type; + fxMesa->HavePixExt = voodoo->HavePixExt; + fxMesa->HaveTexFmt = voodoo->HaveTexFmt; + fxMesa->HaveCmbExt = voodoo->HaveCmbExt; + fxMesa->HaveMirExt = voodoo->HaveMirExt; + fxMesa->HaveTexus2 = voodoo->HaveTexus2; + fxMesa->Glide = glbHWConfig.Glide; + Glide = &fxMesa->Glide; + sprintf(fxMesa->rendererString, "Mesa %s v0.51 %s %dMB FB, %dMB TM, %d TMU, %s", + grGetString(GR_RENDERER), + grGetString(GR_HARDWARE), + voodoo->fbRam, + (voodoo->tmuConfig[GR_TMU0].tmuRam + ((voodoo->nTexelfx > 1) ? voodoo->tmuConfig[GR_TMU1].tmuRam : 0)), + voodoo->nTexelfx, + (numChips > 1) ? "SLI" : "NOSLI"); + + switch (fxMesa->colDepth = colDepth) { + case 15: + redBits = 5; + greenBits = 5; + blueBits = 5; + alphaBits = 1; + pixFmt = GR_PIXFMT_ARGB_1555; + break; + case 16: + redBits = 5; + greenBits = 6; + blueBits = 5; + alphaBits = depthSize ? 0 : 8; + pixFmt = GR_PIXFMT_RGB_565; + break; + case 32: + redBits = 8; + greenBits = 8; + blueBits = 8; + alphaBits = 8; + pixFmt = GR_PIXFMT_ARGB_8888; + break; + default: + str = "pixelFormat"; + goto errorhandler; + } - fxMesa = (fxMesaContext) calloc(1, sizeof(struct tfxMesaContext)); - if (!fxMesa) { - errorstr = "malloc"; - goto errorhandler; - } + /* Tips: + * 1. we don't bother setting/checking AUX for stencil, because we'll decide + * later whether we have HW stencil, based on depth buffer (thus AUX is + * properly set) + * 2. when both DEPTH and ALPHA are enabled, depth should win. However, it is + * not clear whether 15bpp and 32bpp require AUX alpha buffer. Furthermore, + * alpha buffering is required only if destination alpha is used in alpha + * blending; alpha blending modes that do not use destination alpha can be + * used w/o alpha buffer. + * 3. `alphaBits' is what we can provide + * `alphaSize' is what app requests + * if we cannot provide enough bits for alpha buffer, we should fallback to + * SW alpha. However, setting `alphaBits' to `alphaSize' might confuse some + * of the span functions... + */ + + fxMesa->haveHwAlpha = GL_FALSE; + if (alphaSize && (alphaSize <= alphaBits)) { + alphaSize = alphaBits; + fxMesa->haveHwAlpha = GL_TRUE; + } - fxMesa->haveTwoTMUs = (glbHWConfig.SSTs[glbCurrentBoard].VoodooConfig.nTexelfx > 1); - fxMesa->haveDoubleBuffer = doubleBuffer; - fxMesa->haveAlphaBuffer = alphaBuffer; - fxMesa->haveGlobalPaletteTexture = GL_FALSE; - fxMesa->haveZBuffer = depthSize ? 1 : 0; - fxMesa->verbose = verbose; - fxMesa->board = glbCurrentBoard; - fxMesa->maxTextureSize = glbHWConfig.SSTs[glbCurrentBoard].VoodooConfig.maxTextureSize; /* [koolsmoky] */ - - - switch (fxMesa->colDepth = colDepth) { - case 15: - redBits = 5; - greenBits = 5; - blueBits = 5; - alphaBits = 1; - pixFmt = GR_PIXFMT_ARGB_1555; - break; - case 16: - redBits = 5; - greenBits = 6; - blueBits = 5; - alphaBits = 0; - pixFmt = GR_PIXFMT_RGB_565; - break; - case 32: - redBits = 8; - greenBits = 8; - blueBits = 8; - alphaBits = 8; - pixFmt = GR_PIXFMT_ARGB_8888; - break; - default: - errorstr = "pixelFormat"; - goto errorhandler; - } + fxMesa->haveHwStencil = (fxMesa->HavePixExt && stencilSize && depthSize == 24); + fxMesa->haveZBuffer = depthSize > 0; + fxMesa->haveDoubleBuffer = doubleBuffer; + fxMesa->haveGlobalPaletteTexture = GL_FALSE; + fxMesa->verbose = verbose; + fxMesa->board = glbCurrentBoard; - fxMesa->glideContext = FX_grSstWinOpen(&glbHWConfig.SSTs[glbCurrentBoard], - (FxU32)win, res, ref, - GR_COLORFORMAT_ABGR, - pixFmt, - GR_ORIGIN_LOWER_LEFT, 2, aux); - if (!fxMesa->glideContext) { - errorstr = "grSstWinOpen"; - goto errorhandler; - } + fxMesa->haveTwoTMUs = (voodoo->nTexelfx > 1); + + if ((str = Glide->grGetRegistryOrEnvironmentStringExt("FX_GLIDE_NUM_TMU"))) { + if (atoi(str) <= 1) { + fxMesa->haveTwoTMUs = GL_FALSE; + } + } + + if ((str = Glide->grGetRegistryOrEnvironmentStringExt("FX_GLIDE_SWAPPENDINGCOUNT"))) { + fxMesa->maxPendingSwapBuffers = atoi(str); + if (fxMesa->maxPendingSwapBuffers > 3) { + fxMesa->maxPendingSwapBuffers = 3; + } else if (fxMesa->maxPendingSwapBuffers < 0) { + fxMesa->maxPendingSwapBuffers = 0; + } + } else { + fxMesa->maxPendingSwapBuffers = 2; + } + + if ((str = Glide->grGetRegistryOrEnvironmentStringExt("FX_GLIDE_SWAPINTERVAL"))) { + fxMesa->swapInterval = atoi(str); + } else { + fxMesa->swapInterval = 0; + } + + if ((str = Glide->grGetRegistryOrEnvironmentStringExt("SSTH3_SLI_AA_CONFIGURATION"))) { + sliaa = atoi(str); + } else { + sliaa = 0; + } + switch (colDepth) { + case 15: + if ((numChips == 4) && (sliaa == 8)) { + pixFmt = GR_PIXFMT_AA_8_ARGB_1555; + fsaa = 8; + } else if (((numChips == 4) && (sliaa == 7)) || ((numChips == 2) && (sliaa == 4))) { + pixFmt = GR_PIXFMT_AA_4_ARGB_1555; + fsaa = 4; + } else if (((numChips == 4) && (sliaa == 6)) || ((numChips == 2) && (sliaa == 3)) || ((numChips == 1) && (sliaa == 1))) { + pixFmt = GR_PIXFMT_AA_2_ARGB_1555; + fsaa = 2; + } else { + fsaa = 0; + } + break; + case 16: + if ((numChips == 4) && (sliaa == 8)) { + pixFmt = GR_PIXFMT_AA_8_RGB_565; + fsaa = 8; + } else if (((numChips == 4) && (sliaa == 7)) || ((numChips == 2) && (sliaa == 4))) { + pixFmt = GR_PIXFMT_AA_4_RGB_565; + fsaa = 4; + } else if (((numChips == 4) && (sliaa == 6)) || ((numChips == 2) && (sliaa == 3)) || ((numChips == 1) && (sliaa == 1))) { + pixFmt = GR_PIXFMT_AA_2_RGB_565; + fsaa = 2; + } else { + fsaa = 0; + } + break; + case 32: + if ((numChips == 4) && (sliaa == 8)) { + pixFmt = GR_PIXFMT_AA_8_ARGB_8888; + fsaa = 8; + } else if (((numChips == 4) && (sliaa == 7)) || ((numChips == 2) && (sliaa == 4))) { + pixFmt = GR_PIXFMT_AA_4_ARGB_8888; + fsaa = 4; + } else if (((numChips == 4) && (sliaa == 6)) || ((numChips == 2) && (sliaa == 3)) || ((numChips == 1) && (sliaa == 1))) { + pixFmt = GR_PIXFMT_AA_2_ARGB_8888; + fsaa = 2; + } else { + fsaa = 0; + } + break; + default: /* NOTREACHED */ + str = "pixelFormat"; + goto errorhandler; + } + fxMesa->fsaa = fsaa; + + BEGIN_BOARD_LOCK(); + if (fxMesa->HavePixExt) { + fxMesa->glideContext = Glide->grSstWinOpenExt((FxU32)win, res, ref, + GR_COLORFORMAT_ABGR, GR_ORIGIN_LOWER_LEFT, + pixFmt, + 2, aux); + } else if (pixFmt == GR_PIXFMT_RGB_565) { + fxMesa->glideContext = grSstWinOpen((FxU32)win, res, ref, + GR_COLORFORMAT_ABGR, GR_ORIGIN_LOWER_LEFT, + 2, aux); + } else { + fxMesa->glideContext = 0; + } + END_BOARD_LOCK(); + if (!fxMesa->glideContext) { + str = "grSstWinOpen"; + goto errorhandler; + } /* * Pixel tables are used during pixel read-back @@ -429,7 +499,7 @@ fxMesaCreateContext(GLuint win, * As a consequence, 32bit read-back is not swizzled! * Also determine if we need vertex snapping. */ - switch (glbHWConfig.SSTs[glbCurrentBoard].type) { + switch (voodoo->type) { case GR_SSTTYPE_VOODOO: case GR_SSTTYPE_Banshee: useBGR = GL_TRUE; @@ -448,12 +518,6 @@ fxMesaCreateContext(GLuint win, break; } - if (verbose) { - fprintf(stderr, "Voodoo pixel order = %s, vertex snapping = %d\n", - useBGR ? "BGR" : "RGB", - fxMesa->snapVertices); - } - fxInitPixelTables(fxMesa, useBGR); fxMesa->width = FX_grSstScreenWidth(); @@ -467,22 +531,40 @@ fxMesaCreateContext(GLuint win, fxMesa->screen_width = fxMesa->width; fxMesa->screen_height = fxMesa->height; - fxMesa->new_state = ~0; - - if (verbose) - fprintf(stderr, "Voodoo screen: %dx%dx%d\n", - (int)FX_grSstScreenWidth(), (int)FX_grSstScreenHeight(), colDepth); - - fxMesa->glVis = _mesa_create_visual(GL_TRUE, /* RGB mode */ - doubleBuffer, GL_FALSE, /* stereo */ - redBits, greenBits, blueBits, alphaBits, /* RGBA bits */ - 0, /* index bits */ + if (verbose) { + char buf[80]; + + strcpy(buf, grGetString(GR_VERSION)); + fprintf(stderr, "Voodoo Using Glide %s\n", buf); + fprintf(stderr, "Voodoo Number of boards: %d\n", glbHWConfig.num_sst); + fprintf(stderr, "Voodoo Number of TMUs: %d\n", voodoo->nTexelfx); + fprintf(stderr, "Voodoo fbRam: %d\n", voodoo->fbRam); + fprintf(stderr, "Voodoo fbiRev: %d\n", voodoo->fbiRev); + fprintf(stderr, "Voodoo chips detected: %d\n", voodoo->numChips); + fprintf(stderr, "Voodoo pixel order = %s, vertex snapping = %d\n", + useBGR ? "BGR" : "RGB", + fxMesa->snapVertices); + fprintf(stderr, "Voodoo screen: %dx%d.%d\n", + fxMesa->screen_width, fxMesa->screen_height, colDepth); + } + + fxMesa->glVis = _mesa_create_visual(GL_TRUE, /* RGB mode */ + doubleBuffer, + GL_FALSE, /* stereo */ + redBits, /* RGBA.R bits */ + greenBits, /* RGBA.G bits */ + blueBits, /* RGBA.B bits */ + alphaSize, /* RGBA.A bits */ + 0, /* index bits */ depthSize, /* depth_size */ stencilSize, /* stencil_size */ - accumSize, accumSize, accumSize, - accumSize, 1); + accumSize, + accumSize, + accumSize, + alphaSize ? accumSize : 0, + 1); if (!fxMesa->glVis) { - errorstr = "_mesa_create_visual"; + str = "_mesa_create_visual"; goto errorhandler; } @@ -490,24 +572,24 @@ fxMesaCreateContext(GLuint win, shareCtx, (void *) fxMesa, GL_TRUE); if (!ctx) { - errorstr = "_mesa_create_context"; + str = "_mesa_create_context"; goto errorhandler; } if (!fxDDInitFxMesaContext(fxMesa)) { - errorstr = "fxDDInitFxMesaContext failed"; + str = "fxDDInitFxMesaContext"; goto errorhandler; } - fxMesa->glBuffer = _mesa_create_framebuffer(fxMesa->glVis, GL_FALSE, /* no software depth */ - fxMesa->glVis->stencilBits > 0, - fxMesa->glVis->accumRedBits > - 0, - fxMesa->glVis->alphaBits > 0); + fxMesa->glBuffer = _mesa_create_framebuffer(fxMesa->glVis, + GL_FALSE, /* no software depth */ + stencilSize && !fxMesa->haveHwStencil, + fxMesa->glVis->accumRedBits > 0, + alphaSize && !fxMesa->haveHwAlpha); if (!fxMesa->glBuffer) { - errorstr = "_mesa_create_framebuffer"; + str = "_mesa_create_framebuffer"; goto errorhandler; } @@ -528,35 +610,35 @@ fxMesaCreateContext(GLuint win, } #endif - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxMesaCreateContext() End\n"); - } - return fxMesa; - errorhandler: - if (fxMesa) { - if (fxMesa->glideContext) - grSstWinClose(fxMesa->glideContext); - fxMesa->glideContext = 0; - - if (fxMesa->state) - free(fxMesa->state); - if (fxMesa->fogTable) - free(fxMesa->fogTable); - if (fxMesa->glBuffer) - _mesa_destroy_framebuffer(fxMesa->glBuffer); - if (fxMesa->glVis) - _mesa_destroy_visual(fxMesa->glVis); - if (fxMesa->glCtx) - _mesa_destroy_context(fxMesa->glCtx); - free(fxMesa); - } +errorhandler: + if (fxMesa) { + if (fxMesa->glideContext) { + grSstWinClose(fxMesa->glideContext); + fxMesa->glideContext = 0; + } + + if (fxMesa->state) { + FREE(fxMesa->state); + } + if (fxMesa->fogTable) { + FREE(fxMesa->fogTable); + } + if (fxMesa->glBuffer) { + _mesa_destroy_framebuffer(fxMesa->glBuffer); + } + if (fxMesa->glVis) { + _mesa_destroy_visual(fxMesa->glVis); + } + if (fxMesa->glCtx) { + _mesa_destroy_context(fxMesa->glCtx); + } + FREE(fxMesa); + } - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: ERROR (%s)\n", errorstr); - } - return NULL; + fprintf(stderr, "%s: ERROR: %s\n", __FUNCTION__, str); + return NULL; } @@ -577,8 +659,8 @@ fxMesaUpdateScreenSize(fxMesaContext fxMesa) void GLAPIENTRY fxMesaDestroyContext(fxMesaContext fxMesa) { - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxMesaDestroyContext()\n"); + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(...)\n", __FUNCTION__); } if (!fxMesa) @@ -621,10 +703,10 @@ fxMesaDestroyContext(fxMesaContext fxMesa) _mesa_destroy_context(fxMesa->glCtx); _mesa_destroy_framebuffer(fxMesa->glBuffer); - fxCloseHardware(); grSstWinClose(fxMesa->glideContext); + fxCloseHardware(); - free(fxMesa); + FREE(fxMesa); if (fxMesa == fxMesaCurrentCtx) fxMesaCurrentCtx = NULL; @@ -637,16 +719,12 @@ fxMesaDestroyContext(fxMesaContext fxMesa) void GLAPIENTRY fxMesaMakeCurrent(fxMesaContext fxMesa) { - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxMesaMakeCurrent(...) Start\n"); - } - if (!fxMesa) { _mesa_make_current(NULL, NULL); fxMesaCurrentCtx = NULL; - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxMesaMakeCurrent(NULL) End\n"); + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(NULL)\n", __FUNCTION__); } return; @@ -655,14 +733,17 @@ fxMesaMakeCurrent(fxMesaContext fxMesa) /* if this context is already the current one, we can return early */ if (fxMesaCurrentCtx == fxMesa && fxMesaCurrentCtx->glCtx == _mesa_get_current_context()) { - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, - "fxmesa: fxMesaMakeCurrent(fxMesaCurrentCtx==fxMesa) End\n"); + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(fxMesaCurrentCtx==fxMesa)\n", __FUNCTION__); } return; } + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(...)\n", __FUNCTION__); + } + if (fxMesaCurrentCtx) grGlideGetState((GrState *) fxMesaCurrentCtx->state); @@ -678,43 +759,17 @@ fxMesaMakeCurrent(fxMesaContext fxMesa) /* The first time we call MakeCurrent we set the initial viewport size */ if (fxMesa->glCtx->Viewport.Width == 0) _mesa_set_viewport(fxMesa->glCtx, 0, 0, fxMesa->width, fxMesa->height); - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxMesaMakeCurrent(...) End\n"); - } } -#if 0 -static void -QueryCounters(void) -{ - static GLuint prevPassed = 0; - static GLuint prevFailed = 0; - GLuint failed, passed; - GrSstPerfStats_t st; - - FX_grSstPerfStats(&st); - failed = st.zFuncFail - st.aFuncFail - st.chromaFail; - passed = st.pixelsIn - failed; - printf("failed: %d passed: %d\n", failed - prevFailed, - passed - prevPassed); - - prevPassed = passed; - prevFailed = failed; -} -#endif - - /* * Swap front/back buffers for current context if double buffered. */ void GLAPIENTRY fxMesaSwapBuffers(void) { - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, - "fxmesa: ------------------------------- fxMesaSwapBuffers() -------------------------------\n"); + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s()\n", __FUNCTION__); } if (fxMesaCurrentCtx) { @@ -745,53 +800,29 @@ fxMesaSwapBuffers(void) /* * Query 3Dfx hardware presence/kind */ -int GLAPIENTRY -fxQueryHardware(void) +GLboolean GLAPIENTRY fxQueryHardware (void) { - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxQueryHardware() Start\n"); - } + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s()\n", __FUNCTION__); + } - if (!glbGlideInitialized) { - grGlideInit(); - if (FX_grSstQueryHardware(&glbHWConfig)) { - grSstSelect(glbCurrentBoard); - glb3DfxPresent = 1; - - if (getenv("MESA_FX_INFO")) { - char buf[80]; - GrVoodooConfig_t *voodoo = &glbHWConfig.SSTs[glbCurrentBoard].VoodooConfig; - - strcpy(buf, grGetString(GR_VERSION)); - fprintf(stderr, "Voodoo Using Glide %s\n", buf); - fprintf(stderr, "Voodoo Number of boards: %d\n", glbHWConfig.num_sst); - fprintf(stderr, "Voodoo Number of TMUs: %d\n", voodoo->nTexelfx); - fprintf(stderr, "Voodoo fbRam: %d\n", voodoo->fbRam); - fprintf(stderr, "Voodoo fbiRev: %d\n", voodoo->fbiRev); - fprintf(stderr, "Voodoo chips detected: %d\n", voodoo->numChips); - } - } - else { - glb3DfxPresent = 0; - } + if (!glbGlideInitialized) { + grGlideInit(); + glb3DfxPresent = FX_grSstQueryHardware(&glbHWConfig); - glbGlideInitialized = 1; + glbGlideInitialized = 1; #if defined(__WIN32__) - _onexit((_onexit_t) cleangraphics); + _onexit((_onexit_t) cleangraphics); #elif defined(__linux__) - /* Only register handler if environment variable is not defined. */ - if (!getenv("MESA_FX_NO_SIGNALS")) { - atexit(cleangraphics); - } + /* Only register handler if environment variable is not defined. */ + if (!getenv("MESA_FX_NO_SIGNALS")) { + atexit(cleangraphics); + } #endif - } - - if (MESA_VERBOSE & VERBOSE_DRIVER) { - fprintf(stderr, "fxmesa: fxQueryHardware() End (voodooo)\n"); - } + } - return glbHWConfig.SSTs[glbCurrentBoard].type; + return glb3DfxPresent; } @@ -802,7 +833,7 @@ void GLAPIENTRY fxCloseHardware(void) { if (glbGlideInitialized) { - if (getenv("MESA_FX_INFO")) { + if (fxMesaCurrentCtx && fxMesaCurrentCtx->verbose) { GrSstPerfStats_t st; FX_grSstPerfStats(&st); |