i965: fixes for JMPI
[mesa.git] / src / mesa / drivers / glide / fxg.c
index 25b2bb6b9c3e070d225dc0179188c3b542e66e73..afb9441adede646b011a915f7223ef511f920025 100644 (file)
  *  Web   : http://www.geocities.com/dborca
  */
 
-#ifdef FX
 
+#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"
 
 
 /****************************************************************************\
 * logging                                                                    *
 \****************************************************************************/
-#if DEBUG_TRAP
-#define TRAP_LOG trap_printf
+#if FX_TRAP_GLIDE
+#define TRAP_LOG trp_printf
 #ifdef __GNUC__
 __attribute__ ((format(printf, 1, 2)))
 #endif /* __GNUC__ */
-int trap_printf (const char *format, ...)
+int trp_printf (const char *format, ...)
 {
  va_list arg;
  int n;
@@ -65,17 +66,17 @@ int trap_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                                                                    *
 \****************************************************************************/
@@ -234,8 +235,10 @@ const char *TRP_BLEND (GrAlphaBlendFnc_t func)
         TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_SRC_COLOR);
         /*TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_DST_COLOR); ==GR_BLEND_ONE_MINUS_SRC_COLOR*/
         TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_DST_ALPHA);
-        TRAP_CASE_STRING(GR_BLEND_RESERVED_8);
-        TRAP_CASE_STRING(GR_BLEND_RESERVED_9);
+        TRAP_CASE_STRING(GR_BLEND_SAME_COLOR_EXT);
+        /*TRAP_CASE_STRING(GR_BLEND_RESERVED_8); ==GR_BLEND_SAME_COLOR_EXT*/
+        TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_SAME_COLOR_EXT);
+        /*TRAP_CASE_STRING(GR_BLEND_RESERVED_9); ==GR_BLEND_ONE_MINUS_SAME_COLOR_EXT*/
         TRAP_CASE_STRING(GR_BLEND_RESERVED_A);
         TRAP_CASE_STRING(GR_BLEND_RESERVED_B);
         TRAP_CASE_STRING(GR_BLEND_RESERVED_C);
@@ -733,8 +736,6 @@ const char *TRP_BLENDOP (GrAlphaBlendOp_t op)
         TRAP_CASE_STRING(GR_BLEND_OP_ADD);
         TRAP_CASE_STRING(GR_BLEND_OP_SUB);
         TRAP_CASE_STRING(GR_BLEND_OP_REVSUB);
-        TRAP_CASE_STRING(GR_BLEND_SAME_COLOR_EXT);
-        TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_SAME_COLOR_EXT);
         TRAP_NODEFAULT;
  }
 }
@@ -785,6 +786,25 @@ const char *TRP_TMU (GrChipID_t tmu)
  }
 }
 
+const char *TRP_TXDITHER (FxU32 dither)
+{
+ switch (dither) {
+        TRAP_CASE_STRING(TX_DITHER_NONE);
+        TRAP_CASE_STRING(TX_DITHER_4x4);
+        TRAP_CASE_STRING(TX_DITHER_ERR);
+        TRAP_NODEFAULT;
+ }
+}
+
+const char *TRP_TXCOMPRESS (FxU32 compress)
+{
+ switch (compress) {
+        TRAP_CASE_STRING(TX_COMPRESSION_STATISTICAL);
+        TRAP_CASE_STRING(TX_COMPRESSION_HEURISTIC);
+        TRAP_NODEFAULT;
+ }
+}
+
 
 
 /****************************************************************************\
@@ -794,6 +814,7 @@ const char *TRP_TMU (GrChipID_t tmu)
 /*
 ** 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);
@@ -801,6 +822,11 @@ void (FX_CALL *real_grChromaRangeExt) (GrColor_t color, GrColor_t range, GrChrom
 void (FX_CALL *real_grTexChromaModeExt) (GrChipID_t tmu, GrChromakeyMode_t mode);
 void (FX_CALL *real_grTexChromaRangeExt) (GrChipID_t tmu, GrColor_t min, GrColor_t max, GrTexChromakeyMode_t mode);
 
+/* pointcast */
+void (FX_CALL *real_grTexDownloadTableExt) (GrChipID_t tmu, GrTexTable_t type, void *data);
+void (FX_CALL *real_grTexDownloadTablePartialExt) (GrChipID_t tmu, GrTexTable_t type, void *data, int start, int end);
+void (FX_CALL *real_grTexNCCTableExt) (GrChipID_t tmu, GrNCCTable_t table);
+
 /* tbext */
 void (FX_CALL *real_grTextureBufferExt) (GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLOD, GrLOD_t largeLOD, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 odd_even_mask);
 void (FX_CALL *real_grTextureAuxBufferExt) (GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLOD, GrLOD_t largeLOD, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 odd_even_mask);
@@ -822,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);
+
 
 
 /****************************************************************************\
@@ -992,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"
@@ -1339,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
 }
 
@@ -1347,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
 }
 
@@ -1789,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"
@@ -1857,6 +1891,41 @@ void FX_CALL trap_grTexChromaRangeExt (GrChipID_t           tmu,
  assert(real_grTexChromaRangeExt);
  (*real_grTexChromaRangeExt)(tmu, min, max, mode);
 #undef FN_NAME
+}
+
+        /* pointcast */
+void FX_CALL trap_grTexDownloadTableExt (GrChipID_t   tmu,
+                                         GrTexTable_t type,
+                                         void         *data)
+{
+#define FN_NAME "grTexDownloadTableExt"
+ TRAP_LOG("%s(%s, %s, %p)\n", FN_NAME, TRP_TMU(tmu), TRP_TABLE(type), data);
+ assert(real_grTexDownloadTableExt);
+ (*real_grTexDownloadTableExt)(tmu, type, data);
+#undef FN_NAME
+}
+
+void FX_CALL trap_grTexDownloadTablePartialExt (GrChipID_t   tmu,
+                                                GrTexTable_t type,
+                                                void         *data,
+                                                int          start,
+                                                int          end)
+{
+#define FN_NAME "grTexDownloadTablePartialExt"
+ TRAP_LOG("%s(%s, %s, %p, %d, %d)\n", FN_NAME, TRP_TMU(tmu), TRP_TABLE(type), data, start, end);
+ assert(real_grTexDownloadTablePartialExt);
+ (*real_grTexDownloadTablePartialExt)(tmu, type, data, start, end);
+#undef FN_NAME
+}
+
+void FX_CALL trap_grTexNCCTableExt (GrChipID_t   tmu,
+                                    GrNCCTable_t table)
+{
+#define FN_NAME "grTexNCCTableExt"
+ TRAP_LOG("%s(%s, %s)\n", FN_NAME, TRP_TMU(tmu), TRP_NCC(table));
+ assert(real_grTexNCCTableExt);
+ (*real_grTexNCCTableExt)(tmu, table);
+#undef FN_NAME
 }
 
         /* tbext */
@@ -2089,30 +2158,124 @@ void FX_CALL trap_grTBufferWriteMaskExt (FxU32 tmask)
  (*real_grTBufferWriteMaskExt)(tmask);
 #undef FN_NAME
 }
+
+/*
+** texus functions
+*/
+void FX_CALL trap_txImgQuantize (char  *dst,
+                                 char  *src,
+                                 int   w,
+                                 int   h,
+                                 FxU32 format,
+                                 FxU32 dither)
+{
+#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));
+ assert(real_txImgQuantize);
+ (*real_txImgQuantize)(dst, src, w, h, format, dither);
+#undef FN_NAME
+}
+
+void FX_CALL trap_txMipQuantize (TxMip *pxMip,
+                                 TxMip *txMip,
+                                 int   fmt,
+                                 FxU32 d,
+                                 FxU32 comp)
+{
+#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));
+ assert(real_txMipQuantize);
+ (*real_txMipQuantize)(pxMip, txMip, fmt, d, comp);
+#undef FN_NAME
+}
+
+void FX_CALL trap_txPalToNcc (GuNccTable *ncc_table,
+                              const FxU32 *pal)
+{
+#define FN_NAME "txPalToNcc"
+ TRAP_LOG("%s(%p, %p)\n", FN_NAME, (void *)ncc_table, (void *)pal);
+ assert(real_txPalToNcc);
+ (*real_txPalToNcc)(ncc_table, pal);
+#undef FN_NAME
+}
 #endif
 
 
 
 /****************************************************************************\
-* interface
+* 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);
+}
+
+void FX_CALL fake_grTexDownloadTablePartialExt (GrChipID_t   tmu,
+                                                GrTexTable_t type,
+                                                void         *data,
+                                                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                                                                  *
 \****************************************************************************/
-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
-#else  /* DEBUG_TRAP */
-#define GET_EXT_ADDR(name)  *(GrProc *)&Glide->name = grGetProcAddress(#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 */
+ 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);
@@ -2133,6 +2296,13 @@ void tdfx_hook_glide (struct tdfx_glide *Glide)
  GET_EXT_ADDR(grAlphaBlendFunctionExt);
  GET_EXT_ADDR(grTBufferWriteMaskExt);
 
+ /*
+ ** texus
+ */
+ GET_EXT_NULL(txImgQuantize);
+ GET_EXT_NULL(txMipQuantize);
+ GET_EXT_NULL(txPalToNcc);
+
 #undef GET_EXT_ADDR
 }