i965: fixes for JMPI
[mesa.git] / src / mesa / drivers / glide / fxg.c
index 7d39ddbe5f0d28dc45383b19dbe39c9b83d168ef..afb9441adede646b011a915f7223ef511f920025 100644 (file)
 #ifdef FX
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <stdarg.h>
 #include <assert.h>
 
-#define DEBUG_TRAP_internal
+#define FX_TRAP_GLIDE_internal
 #include "fxg.h"
 
-/* texus.h */
-FX_ENTRY void FX_CALL txImgQuantize (char *dst, char *src, int w, int h, FxU32 format, FxU32 dither);
-FX_ENTRY void FX_CALL txMipQuantize (TxMip *pxMip, TxMip *txMip, int fmt, FxU32 d, FxU32 comp);
-FX_ENTRY void FX_CALL txPalToNcc (GuNccTable *ncc_table, const FxU32 *pal);
-/* texus.h */
-
 
 
 /****************************************************************************\
 * logging                                                                    *
 \****************************************************************************/
-#if DEBUG_TRAP
+#if FX_TRAP_GLIDE
 #define TRAP_LOG trp_printf
 #ifdef __GNUC__
 __attribute__ ((format(printf, 1, 2)))
@@ -71,17 +66,17 @@ int trp_printf (const char *format, ...)
  va_end(arg);
  return n;
 }
-#else  /* DEBUG_TRAP */
+#else  /* FX_TRAP_GLIDE */
 #ifdef __GNUC__
 #define TRAP_LOG(format, ...) do {} while (0)
 #else  /* __GNUC__ */
 #define TRAP_LOG              0 && (unsigned long)
 #endif /* __GNUC__ */
-#endif /* DEBUG_TRAP */
+#endif /* FX_TRAP_GLIDE */
 
 
 
-#if DEBUG_TRAP
+#if FX_TRAP_GLIDE
 /****************************************************************************\
 * helpers                                                                    *
 \****************************************************************************/
@@ -819,6 +814,7 @@ const char *TRP_TXCOMPRESS (FxU32 compress)
 /*
 ** glide extensions
 */
+void (FX_CALL *real_grSetNumPendingBuffers) (FxI32 NumPendingBuffers);
 char * (FX_CALL *real_grGetRegistryOrEnvironmentStringExt) (char *theEntry);
 void (FX_CALL *real_grGetGammaTableExt) (FxU32 nentries, FxU32 *red, FxU32 *green, FxU32 *blue);
 void (FX_CALL *real_grChromaRangeModeExt) (GrChromakeyMode_t mode);
@@ -852,6 +848,13 @@ void (FX_CALL *real_grColorMaskExt) (FxBool r, FxBool g, FxBool b, FxBool a);
 void (FX_CALL *real_grAlphaBlendFunctionExt) (GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, GrAlphaBlendOp_t rgb_op, GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df, GrAlphaBlendOp_t alpha_op);
 void (FX_CALL *real_grTBufferWriteMaskExt) (FxU32 tmask);
 
+/*
+** texus
+*/
+void (FX_CALL *real_txImgQuantize) (char *dst, char *src, int w, int h, FxU32 format, FxU32 dither);
+void (FX_CALL *real_txMipQuantize) (TxMip *pxMip, TxMip *txMip, int fmt, FxU32 d, FxU32 comp);
+void (FX_CALL *real_txPalToNcc) (GuNccTable *ncc_table, const FxU32 *pal);
+
 
 
 /****************************************************************************\
@@ -1022,14 +1025,6 @@ FxBool FX_CALL trap_grSstWinClose (GrContext_t context)
 #undef FN_NAME
 }
 
-void FX_CALL trap_grSetNumPendingBuffers (FxI32 NumPendingBuffers)
-{
-#define FN_NAME "grSetNumPendingBuffers"
- TRAP_LOG("%s(%ld)\n", FN_NAME, NumPendingBuffers);
- grSetNumPendingBuffers(NumPendingBuffers);
-#undef FN_NAME
-}
-
 FxBool FX_CALL trap_grSelectContext (GrContext_t context)
 {
 #define FN_NAME "grSelectContext"
@@ -1369,7 +1364,7 @@ void FX_CALL trap_grStippleMode (GrStippleMode_t mode)
 {
 #define FN_NAME "grStippleMode"
  TRAP_LOG("%s(%s)\n", FN_NAME, TRP_STIPPLEMODE(mode));
- grStippleMode(mode);
+ grStippleMode(mode); /* some Glide libs don't have it; not used anyway */
 #undef FN_NAME
 }
 
@@ -1377,7 +1372,7 @@ void FX_CALL trap_grStipplePattern (GrStipplePattern_t mode)
 {
 #define FN_NAME "grStipplePattern"
  TRAP_LOG("%s(%08lx)\n", FN_NAME, mode);
- grStipplePattern(mode);
+ grStipplePattern(mode); /* some Glide libs don't have it; not used anyway */
 #undef FN_NAME
 }
 
@@ -1819,6 +1814,15 @@ void FX_CALL trap_guFogGenerateLinear (GrFog_t *fogtable,
 /*
 ** glide extensions
 */
+void FX_CALL trap_grSetNumPendingBuffers (FxI32 NumPendingBuffers)
+{
+#define FN_NAME "grSetNumPendingBuffers"
+ TRAP_LOG("%s(%ld)\n", FN_NAME, NumPendingBuffers);
+ assert(real_grSetNumPendingBuffers);
+ (*real_grSetNumPendingBuffers)(NumPendingBuffers);
+#undef FN_NAME
+}
+
 char *FX_CALL trap_grGetRegistryOrEnvironmentStringExt (char *theEntry)
 {
 #define FN_NAME "grGetRegistryOrEnvironmentStringExt"
@@ -2167,7 +2171,8 @@ void FX_CALL trap_txImgQuantize (char  *dst,
 {
 #define FN_NAME "txImgQuantize"
  TRAP_LOG("%s(%p, %p, %d, %d, %s, %s)\n", FN_NAME, dst, src, w, h, TRP_TEXFMT(format), TRP_TXDITHER(dither));
- txImgQuantize(dst, src, w, h, format, dither);
+ assert(real_txImgQuantize);
+ (*real_txImgQuantize)(dst, src, w, h, format, dither);
 #undef FN_NAME
 }
 
@@ -2179,7 +2184,8 @@ void FX_CALL trap_txMipQuantize (TxMip *pxMip,
 {
 #define FN_NAME "txMipQuantize"
  TRAP_LOG("%s(%p, %p, %s, %s, %s)\n", FN_NAME, (void *)pxMip, (void *)txMip, TRP_TEXFMT(fmt), TRP_TXDITHER(d), TRP_TXCOMPRESS(comp));
- txMipQuantize(pxMip, txMip, fmt, d, comp);
+ assert(real_txMipQuantize);
+ (*real_txMipQuantize)(pxMip, txMip, fmt, d, comp);
 #undef FN_NAME
 }
 
@@ -2188,7 +2194,8 @@ void FX_CALL trap_txPalToNcc (GuNccTable *ncc_table,
 {
 #define FN_NAME "txPalToNcc"
  TRAP_LOG("%s(%p, %p)\n", FN_NAME, (void *)ncc_table, (void *)pal);
- txPalToNcc(ncc_table, pal);
+ assert(real_txPalToNcc);
+ (*real_txPalToNcc)(ncc_table, pal);
 #undef FN_NAME
 }
 #endif
@@ -2196,12 +2203,18 @@ void FX_CALL trap_txPalToNcc (GuNccTable *ncc_table,
 
 
 /****************************************************************************\
-* housekeeping (fake pointers)
+* housekeeping (fake pointers)                                               *
 \****************************************************************************/
+char *FX_CALL fake_grGetRegistryOrEnvironmentStringExt (char *theEntry)
+{
+ return getenv(theEntry);
+}
+
 void FX_CALL fake_grTexDownloadTableExt (GrChipID_t   tmu,
                                          GrTexTable_t type,
                                          void         *data)
 {
+ (void)tmu;
  grTexDownloadTable(type, data);
 }
 
@@ -2211,43 +2224,58 @@ void FX_CALL fake_grTexDownloadTablePartialExt (GrChipID_t   tmu,
                                                 int          start,
                                                 int          end)
 {
+ (void)tmu;
  grTexDownloadTablePartial(type, data, start, end);
 }
 
 void FX_CALL fake_grTexNCCTableExt (GrChipID_t   tmu,
                                     GrNCCTable_t table)
 {
+ (void)tmu;
  grTexNCCTable(table);
 }
 
 
 
 /****************************************************************************\
-* interface
+* interface                                                                  *
 \****************************************************************************/
-void tdfx_hook_glide (struct tdfx_glide *Glide)
+void tdfx_hook_glide (struct tdfx_glide *Glide, int pointcast)
 {
-#if DEBUG_TRAP
-#define GET_EXT_ADDR(name)  *(GrProc *)&real_##name = grGetProcAddress(#name), Glide->name = trap_##name
-#define GET_TXS_ADDR(name)  Glide->name = trap_##name
-#else  /* DEBUG_TRAP */
-#define GET_EXT_ADDR(name)  *(GrProc *)&Glide->name = grGetProcAddress(#name)
-#define GET_TXS_ADDR(name)  Glide->name = name
-#endif /* DEBUG_TRAP */
+/* GET_EXT_ADDR: get function pointer
+ * GET_EXT_FAKE: get function pointer if possible, else use a fake function
+ * GET_EXT_NULL: get function pointer if possible, else leave NULL pointer
+ */
+#if FX_TRAP_GLIDE
+#define GET_EXT_ADDR(name) *(GrProc *)&real_##name = grGetProcAddress(#name), Glide->name = trap_##name
+#define GET_EXT_FAKE(name) GET_EXT_ADDR(name); if (real_##name == NULL) real_##name = fake_##name
+#define GET_EXT_NULL(name) GET_EXT_ADDR(name); if (real_##name == NULL) Glide->name = NULL
+#else  /* FX_TRAP_GLIDE */
+#define GET_EXT_ADDR(name) *(GrProc *)&Glide->name = grGetProcAddress(#name)
+#define GET_EXT_FAKE(name) GET_EXT_ADDR(name); if (Glide->name == NULL) Glide->name = fake_##name
+#define GET_EXT_NULL(name) GET_EXT_ADDR(name)
+#endif /* FX_TRAP_GLIDE */
 
  /*
  ** glide extensions
  */
- GET_EXT_ADDR(grGetRegistryOrEnvironmentStringExt);
+ GET_EXT_NULL(grSetNumPendingBuffers);
+ GET_EXT_FAKE(grGetRegistryOrEnvironmentStringExt);
  GET_EXT_ADDR(grGetGammaTableExt);
  GET_EXT_ADDR(grChromaRangeModeExt);
  GET_EXT_ADDR(grChromaRangeExt);
  GET_EXT_ADDR(grTexChromaModeExt);
  GET_EXT_ADDR(grTexChromaRangeExt);
  /* pointcast */
- GET_EXT_ADDR(grTexDownloadTableExt);
- GET_EXT_ADDR(grTexDownloadTablePartialExt);
- GET_EXT_ADDR(grTexNCCTableExt);
+ if (pointcast) {
+    GET_EXT_FAKE(grTexDownloadTableExt);
+    GET_EXT_FAKE(grTexDownloadTablePartialExt);
+    GET_EXT_FAKE(grTexNCCTableExt);
+ } else {
+    Glide->grTexDownloadTableExt = fake_grTexDownloadTableExt;
+    Glide->grTexDownloadTablePartialExt = fake_grTexDownloadTablePartialExt;
+    Glide->grTexNCCTableExt = fake_grTexNCCTableExt;
+ }
  /* tbext */
  GET_EXT_ADDR(grTextureBufferExt);
  GET_EXT_ADDR(grTextureAuxBufferExt);
@@ -2271,22 +2299,9 @@ void tdfx_hook_glide (struct tdfx_glide *Glide)
  /*
  ** texus
  */
- GET_TXS_ADDR(txImgQuantize);
- GET_TXS_ADDR(txMipQuantize);
- GET_TXS_ADDR(txPalToNcc);
-
- /* housekeeping: make sure the pointcast always point to something valid */
- if (grGetProcAddress("grTexDownloadTableExt") == NULL) {
-#if DEBUG_TRAP
-    real_grTexDownloadTableExt = fake_grTexDownloadTableExt;
-    real_grTexDownloadTablePartialExt = fake_grTexDownloadTablePartialExt;
-    real_grTexNCCTableExt = fake_grTexNCCTableExt;
-#else
-    Glide->grTexDownloadTableExt = fake_grTexDownloadTableExt;
-    Glide->grTexDownloadTablePartialExt = fake_grTexDownloadTablePartialExt;
-    Glide->grTexNCCTableExt = fake_grTexNCCTableExt;
-#endif
- }
+ GET_EXT_NULL(txImgQuantize);
+ GET_EXT_NULL(txMipQuantize);
+ GET_EXT_NULL(txPalToNcc);
 
 #undef GET_EXT_ADDR
 }