-/* $Id: fxglidew.c,v 1.19 2001/09/23 16:50:01 brianp Exp $ */
-
/*
* Mesa 3-D graphics library
* Version: 4.0
* Brian Paul
* Daryll Strauss
* Keith Whitwell
+ * Daniel Borca
+ * Hiroshi Morii
*/
/* fxsetup.c - 3Dfx VooDoo rendering mode setup functions */
#endif
#if defined(FX)
-#include "glide.h"
#include "fxglidew.h"
#include "fxdrv.h"
FxI32
FX_grGetInteger_NoLock(FxU32 pname)
{
-#if !defined(FX_GLIDE3)
- switch (pname) {
- case FX_FOG_TABLE_ENTRIES:
- return GR_FOG_TABLE_SIZE;
- case FX_GLIDE_STATE_SIZE:
- return sizeof(GrState);
- case FX_LFB_PIXEL_PIPE:
- return FXFALSE;
- case FX_PENDING_BUFFERSWAPS:
- return grBufferNumPending();
- case FX_TEXTURE_ALIGN:
- /* This is a guess from reading the glide3 docs */
- return 8;
- default:
- if (MESA_VERBOSE & VERBOSE_DRIVER) {
- fprintf(stderr, "Wrong parameter in FX_grGetInteger!\n");
- }
- return -1;
- }
-#else
- FxU32 grname;
- FxI32 result;
-
- switch (pname) {
- case FX_FOG_TABLE_ENTRIES:
- case FX_GLIDE_STATE_SIZE:
- case FX_LFB_PIXEL_PIPE:
- case FX_PENDING_BUFFERSWAPS:
- case FX_TEXTURE_ALIGN:
- grname = pname;
- break;
- default:
- if (MESA_VERBOSE & VERBOSE_DRIVER) {
- fprintf(stderr, "Wrong parameter in FX_grGetInteger!\n");
- }
- return -1;
- }
-
- grGet(grname, 4, &result);
- return result;
-#endif
-}
-
-FxI32
-FX_grGetInteger(FxU32 pname)
-{
- int result;
-
- BEGIN_BOARD_LOCK();
- result = FX_grGetInteger_NoLock(pname);
- END_BOARD_LOCK();
- return result;
-}
-
-
-FxBool
-FX_grLfbLock(GrLock_t type, GrBuffer_t buffer,
- GrLfbWriteMode_t writeMode, GrOriginLocation_t origin,
- FxBool pixelPipeline, GrLfbInfo_t * info)
-{
- FxBool result;
-
- BEGIN_BOARD_LOCK();
- result = grLfbLock(type, buffer, writeMode, origin, pixelPipeline, info);
- END_BOARD_LOCK();
- return result;
-}
-
-FxU32
-FX_grTexTextureMemRequired(FxU32 evenOdd, GrTexInfo * info)
-{
- FxU32 result;
-
- BEGIN_BOARD_LOCK();
- result = grTexTextureMemRequired(evenOdd, info);
- END_BOARD_LOCK();
- return result;
-}
-
-FxU32
-FX_grTexMinAddress(GrChipID_t tmu)
-{
- FxU32 result;
-
- BEGIN_BOARD_LOCK();
- result = grTexMinAddress(tmu);
- END_BOARD_LOCK();
- return result;
-}
+ FxI32 result;
-extern FxU32
-FX_grTexMaxAddress(GrChipID_t tmu)
-{
- FxU32 result;
+ if (grGet(pname, 4, &result)) {
+ return result;
+ }
- BEGIN_BOARD_LOCK();
- result = grTexMaxAddress(tmu);
- END_BOARD_LOCK();
- return result;
+ if (TDFX_DEBUG & VERBOSE_DRIVER) {
+ fprintf(stderr, "FX_grGetInteger_NoLock: wrong parameter (%lx)\n", pname);
+ }
+ return -1;
}
FxBool
FX_grSstControl(FxU32 code)
{
-#if defined(FX_GLIDE3)
/* The glide 3 sources call for grEnable/grDisable to be called in exchange
* for grSstControl. */
switch (code) {
}
/* Appearently GR_CONTROL_RESIZE can be ignored. */
return 1; /* OK? */
-#else
- FxU32 result;
- BEGIN_BOARD_LOCK();
- result = grSstControl(code);
- END_BOARD_LOCK();
- return result;
-#endif
-}
-
-
-#if defined(FX_GLIDE3)
-
-void
-FX_grGammaCorrectionValue(float val)
-{
- (void) val;
-/* ToDo */
}
-int
-FX_getFogTableSize(void)
-{
- int result;
- BEGIN_BOARD_LOCK();
- grGet(GR_FOG_TABLE_ENTRIES, sizeof(int), (void *) &result);
- END_BOARD_LOCK();
- return result;
-}
-
-int
-FX_getGrStateSize(void)
-{
- int result;
- BEGIN_BOARD_LOCK();
- grGet(GR_GLIDE_STATE_SIZE, sizeof(int), (void *) &result);
- END_BOARD_LOCK();
-
- return result;
-
-}
int
FX_grSstScreenWidth()
return result[3];
}
-void
-FX_grGlideGetVersion(char *buf)
-{
- BEGIN_BOARD_LOCK();
- strcpy(buf, grGetString(GR_VERSION));
- END_BOARD_LOCK();
-}
-
void
FX_grSstPerfStats(GrSstPerfStats_t * st)
{
st->pixelsOut = n;
}
-void
-FX_grAADrawLine(GrVertex * a, GrVertex * b)
-{
- /* ToDo */
- BEGIN_CLIP_LOOP();
- grDrawLine(a, b);
- END_CLIP_LOOP();
-}
-
-void
-FX_grAADrawPoint(GrVertex * a)
-{
- BEGIN_CLIP_LOOP();
- grDrawPoint(a);
- END_CLIP_LOOP();
-}
-
-void
-FX_grDrawPolygonVertexList(int n, GrVertex * verts)
-{
- BEGIN_CLIP_LOOP();
- grDrawVertexArrayContiguous(GR_POLYGON, n, verts, sizeof(GrVertex));
- END_CLIP_LOOP();
-}
-
void
FX_setupGrVertexLayout(void)
{
grCoordinateSpace(GR_WINDOW_COORDS);
grVertexLayout(GR_PARAM_XY, GR_VERTEX_X_OFFSET << 2, GR_PARAM_ENABLE);
- grVertexLayout(GR_PARAM_RGB, GR_VERTEX_R_OFFSET << 2, GR_PARAM_ENABLE);
+#if FX_PACKEDCOLOR
+ grVertexLayout(GR_PARAM_PARGB, GR_VERTEX_PARGB_OFFSET << 2, GR_PARAM_ENABLE);
+#else /* !FX_PACKEDCOLOR */
+ grVertexLayout(GR_PARAM_RGB, GR_VERTEX_RGB_OFFSET << 2, GR_PARAM_ENABLE);
grVertexLayout(GR_PARAM_A, GR_VERTEX_A_OFFSET << 2, GR_PARAM_ENABLE);
+#endif /* !FX_PACKEDCOLOR */
grVertexLayout(GR_PARAM_Q, GR_VERTEX_OOW_OFFSET << 2, GR_PARAM_ENABLE);
grVertexLayout(GR_PARAM_Z, GR_VERTEX_OOZ_OFFSET << 2, GR_PARAM_ENABLE);
grVertexLayout(GR_PARAM_ST0, GR_VERTEX_SOW_TMU0_OFFSET << 2,
}
}
-void
-FX_grHints(GrHint_t hintType, FxU32 hintMask)
-{
- BEGIN_BOARD_LOCK();
- FX_grHints_NoLock(hintType, hintMask);
- END_BOARD_LOCK();
-}
-
/*
* Glide3 doesn't have the grSstQueryHardware function anymore.
* Instead, we call grGet() and fill in the data structures ourselves.
for (i = 0; i < config->num_sst; i++) {
FxI32 result;
+ const char *extension;
- config->SSTs[i].type = GR_SSTTYPE_VOODOO;
grSstSelect(i);
+ extension = grGetString(GR_HARDWARE);
+ if (strstr(extension, "Rush")) {
+ config->SSTs[i].type = GR_SSTTYPE_SST96;
+ } else if (strstr(extension, "Voodoo2")) {
+ config->SSTs[i].type = GR_SSTTYPE_Voodoo2;
+ } else if (strstr(extension, "Voodoo Banshee")) {
+ config->SSTs[i].type = GR_SSTTYPE_Banshee;
+ } else if (strstr(extension, "Voodoo3")) {
+ config->SSTs[i].type = GR_SSTTYPE_Voodoo3;
+ } else if (strstr(extension, "Voodoo4")) {
+ config->SSTs[i].type = GR_SSTTYPE_Voodoo4;
+ } else if (strstr(extension, "Voodoo5")) {
+ config->SSTs[i].type = GR_SSTTYPE_Voodoo5;
+ } else {
+ config->SSTs[i].type = GR_SSTTYPE_VOODOO;
+ }
+
grGet(GR_MEMORY_FB, 4, &result);
- config->SSTs[i].sstBoard.VoodooConfig.fbRam = result / (1024 * 1024);
+ config->SSTs[i].fbRam = result / (1024 * 1024);
grGet(GR_NUM_TMU, 4, &result);
- config->SSTs[i].sstBoard.VoodooConfig.nTexelfx = result;
+ config->SSTs[i].nTexelfx = result;
grGet(GR_REVISION_FB, 4, &result);
- config->SSTs[i].sstBoard.VoodooConfig.fbiRev = result;
-
- grGet(GR_NUM_FB, 4, (void *) &numFB);
- if (numFB > 1)
- config->SSTs[i].sstBoard.VoodooConfig.sliDetect = FXTRUE;
- else
- config->SSTs[i].sstBoard.VoodooConfig.sliDetect = FXFALSE;
+ config->SSTs[i].fbiRev = result;
- for (j = 0; j < config->SSTs[i].sstBoard.VoodooConfig.nTexelfx; j++) {
+ for (j = 0; j < config->SSTs[i].nTexelfx; j++) {
grGet(GR_MEMORY_TMU, 4, &result);
- config->SSTs[i].sstBoard.VoodooConfig.tmuConfig[j].tmuRam =
- result / (1024 * 1024);
+ config->SSTs[i].tmuConfig[j].tmuRam = result / (1024 * 1024);
grGet(GR_REVISION_TMU, 4, &result);
- config->SSTs[i].sstBoard.VoodooConfig.tmuConfig[j].tmuRev = result;
+ config->SSTs[i].tmuConfig[j].tmuRev = result;
}
- }
- END_BOARD_LOCK();
- return 1;
-}
-
-#else
-int
-FX_grSstScreenWidth()
-{
- int i;
- BEGIN_BOARD_LOCK();
- i = grSstScreenWidth();
- END_BOARD_LOCK();
- return i;
-}
-
-int
-FX_grSstScreenHeight()
-{
- int i;
- BEGIN_BOARD_LOCK();
- i = grSstScreenHeight();
- END_BOARD_LOCK();
- return i;
-}
+ extension = grGetString(GR_EXTENSION);
+ config->SSTs[i].HavePalExt = (strstr(extension, " PALETTE6666 ") != NULL);
+ config->SSTs[i].HavePixExt = (strstr(extension, " PIXEXT ") != NULL);
+ config->SSTs[i].HaveTexFmt = (strstr(extension, " TEXFMT ") != NULL);
+ config->SSTs[i].HaveCmbExt = (strstr(extension, " COMBINE ") != NULL);
+ config->SSTs[i].HaveMirExt = (strstr(extension, " TEXMIRROR ") != NULL);
+ config->SSTs[i].HaveTexUma = (strstr(extension, " TEXUMA ") != NULL);
-int
-FX_grSstQueryHardware(GrHwConfiguration * c)
-{
- int i;
- BEGIN_BOARD_LOCK();
- i = grSstQueryHardware(c);
- END_BOARD_LOCK();
- return i;
-}
+ /* number of Voodoo chips */
+ grGet(GR_NUM_FB, 4, (void *) &numFB);
+ config->SSTs[i].numChips = numFB;
+ }
-#endif /* FX_GLIDE3 */
+ tdfx_hook_glide(&config->Glide, getenv("MESA_FX_POINTCAST") != NULL);
-/* It appears to me that this function is needed either way. */
-FX_GrContext_t
-FX_grSstWinOpen(FxU32 hWnd,
- GrScreenResolution_t screen_resolution,
- GrScreenRefresh_t refresh_rate,
- GrColorFormat_t color_format,
- GrOriginLocation_t origin_location,
- int nColBuffers, int nAuxBuffers)
-{
- FX_GrContext_t i;
- BEGIN_BOARD_LOCK();
- i = grSstWinOpen(hWnd,
- screen_resolution,
- refresh_rate,
- color_format, origin_location, nColBuffers, nAuxBuffers);
-
- /*
- fprintf(stderr,
- "grSstWinOpen( win %d res %d ref %d fmt %d\n"
- " org %d ncol %d naux %d )\n"
- " ==> %d\n",
- hWnd,
- screen_resolution,
- refresh_rate,
- color_format,
- origin_location,
- nColBuffers,
- nAuxBuffers,
- i);
- */
END_BOARD_LOCK();
- return i;
+ return 1;
}