added (back!) option to use non-packedcolor
authorDaniel Borca <dborca@users.sourceforge.net>
Fri, 24 Sep 2004 07:03:53 +0000 (07:03 +0000)
committerDaniel Borca <dborca@users.sourceforge.net>
Fri, 24 Sep 2004 07:03:53 +0000 (07:03 +0000)
docs/README.3DFX
src/mesa/drivers/glide/fxapi.c
src/mesa/drivers/glide/fxdrv.h
src/mesa/drivers/glide/fxglidew.c
src/mesa/drivers/glide/fxglidew.h
src/mesa/drivers/glide/fxtris.c
src/mesa/drivers/glide/fxvb.c
src/mesa/drivers/glide/fxvbtmp.h

index cac7d102e56d2feaa44db36fa330a7048c9d9825..739d06fe58701c4b05fa32e3a093e13c7808e8bb 100644 (file)
@@ -60,6 +60,8 @@ FX_DEBUG
        enable driver debug code
 FX_TRAP_GLIDE
        enable Glide trace code
+FX_PACKEDCOLOR
+       use packed color in vertex structure
 FX_TC_NAPALM
        map GL_COMPRESSED_RGB[A] to FXT1. This will have effect on Napalm
        only (can coexist with FX_TC_NCC, but has higher priority)
index 5c77ed339ffa24d12f5e3ef79fd7b06e9dd1d5e9..708dad51f41f3cac91acdd596cb89f7f02d3b5c9 100644 (file)
@@ -638,7 +638,7 @@ fxMesaCreateContext(GLuint win,
                       fxMesa->snapVertices ? "" : "no ");
    }
 
-  sprintf(fxMesa->rendererString, "Mesa %s v0.61 %s%s",
+  sprintf(fxMesa->rendererString, "Mesa %s v0.62 %s%s",
           grGetString(GR_RENDERER),
           grGetString(GR_HARDWARE),
           ((fxMesa->type < GR_SSTTYPE_Voodoo4) && (voodoo->numChips > 1)) ? " SLI" : "");
index c246444d1c35466e1030fe51a3f947e2f4a1b99a..9cc6d15e0bbdb4e101de9348c57ee0f28330aa48 100644 (file)
@@ -731,6 +731,28 @@ void fxSetupStencil (GLcontext *ctx);
 
 extern GLuint fx_check_IsInHardware(GLcontext *ctx);
 
+/***
+ *** CNORM: clamp float to [0,1] and map to float in [0,255]
+ ***/
+#if defined(USE_IEEE) && !defined(DEBUG)
+#define IEEE_0996 0x3f7f0000   /* 0.996 or so */
+#define CNORM(N, F)                            \
+        do {                                   \
+           fi_type __tmp;                      \
+           __tmp.f = (F);                      \
+           if (__tmp.i < 0)                    \
+              N = 0;                           \
+           else if (__tmp.i >= IEEE_0996)      \
+              N = 255.0f;                      \
+           else {                              \
+              N = (F) * 255.0f;                        \
+           }                                   \
+        } while (0)
+#else
+#define CNORM(n, f) \
+       n = (CLAMP((f), 0.0F, 1.0F) * 255.0F)
+#endif
+
 /* run-time debugging */
 #ifndef FX_DEBUG
 #define FX_DEBUG 0
index dd1f7b6ac66a0c29e31d55885035391e934f1db3..1fedf2ab969d4e650cbdbb6af6b10c134c2f10c7 100644 (file)
@@ -126,7 +126,12 @@ FX_setupGrVertexLayout(void)
 
    grCoordinateSpace(GR_WINDOW_COORDS);
    grVertexLayout(GR_PARAM_XY, GR_VERTEX_X_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,
index 472cf9473ccf66c5d11776119ed821772e8637d0..a19d0b58c73ea99a8527e0a59e51178538556147 100644 (file)
@@ -38,7 +38,9 @@
 
 #include "fxg.h"
 
-
+#ifndef FX_PACKEDCOLOR
+#define FX_PACKEDCOLOR 1
+#endif
 
 #define MAX_NUM_SST             4
 
@@ -112,6 +114,7 @@ typedef struct {
         float oow;             /* 1/w (used mipmapping - really 0xfff/w) */
 } GrTmuVertex;
 
+#if FX_PACKEDCOLOR
 typedef struct {
         float x, y;            /* X and Y in screen space */
         float ooz;             /* 65535/Z (used for Z-buffering) */
@@ -137,6 +140,34 @@ typedef struct {
 #define GR_VERTEX_OOW_TMU1_OFFSET       10
 #define GR_VERTEX_FOG_OFFSET            11
 #define GR_VERTEX_PSPEC_OFFSET          12
+#else  /* !FX_PACKEDCOLOR */
+typedef struct {
+        float x, y;            /* X and Y in screen space */
+        float ooz;             /* 65535/Z (used for Z-buffering) */
+        float oow;             /* 1/W (used for W-buffering, texturing) */
+        float r, g, b, a;      /* R, G, B, A [0..255] */
+        GrTmuVertex tmuvtx[GLIDE_NUM_TMU];
+        float fog;             /* fog coordinate */
+        float r1, g1, b1;      /* R, G, B [0..255] */
+        float psize;           /* point size */
+        long pad[20 - 19];     /* ensure multiple of 16 */
+} GrVertex;
+
+#define GR_VERTEX_X_OFFSET              0
+#define GR_VERTEX_Y_OFFSET              1
+#define GR_VERTEX_OOZ_OFFSET            2
+#define GR_VERTEX_OOW_OFFSET            3
+#define GR_VERTEX_RGB_OFFSET            4
+#define GR_VERTEX_A_OFFSET              7
+#define GR_VERTEX_SOW_TMU0_OFFSET       8
+#define GR_VERTEX_TOW_TMU0_OFFSET       9
+#define GR_VERTEX_OOW_TMU0_OFFSET       10
+#define GR_VERTEX_SOW_TMU1_OFFSET       11
+#define GR_VERTEX_TOW_TMU1_OFFSET       12
+#define GR_VERTEX_OOW_TMU1_OFFSET       13
+#define GR_VERTEX_FOG_OFFSET            14
+#define GR_VERTEX_SPEC_OFFSET           15
+#endif /* !FX_PACKEDCOLOR */
 
 
 
index 4270ceb0afec0be7244176726ee1b3752979685f..f53c2b31d0f4265b956b51203f2542a99286b7a3 100644 (file)
@@ -146,6 +146,7 @@ fx_translate_vertex( GLcontext *ctx, const GrVertex *src, SWvertex *dst)
    dst->win[2] = src->ooz;
    dst->win[3] = src->oow;
 
+#if FX_PACKEDCOLOR
    dst->color[0] = src->pargb[2];
    dst->color[1] = src->pargb[1];
    dst->color[2] = src->pargb[0];
@@ -154,6 +155,16 @@ fx_translate_vertex( GLcontext *ctx, const GrVertex *src, SWvertex *dst)
    dst->specular[0] = src->pspec[2];
    dst->specular[1] = src->pspec[1];
    dst->specular[2] = src->pspec[0];
+#else  /* !FX_PACKEDCOLOR */
+   dst->color[0] = src->r;
+   dst->color[1] = src->g;
+   dst->color[2] = src->b;
+   dst->color[3] = src->a;
+
+   dst->specular[0] = src->r1;
+   dst->specular[1] = src->g1;
+   dst->specular[2] = src->g1;
+#endif /* !FX_PACKEDCOLOR */
 
    dst->texcoord[ts0][0] = fxMesa->inv_s0scale * src->tmuvtx[0].sow * w;
    dst->texcoord[ts0][1] = fxMesa->inv_t0scale * src->tmuvtx[0].tow * w;
@@ -227,7 +238,11 @@ static void fx_print_vertex( GLcontext *ctx, const GrVertex *v )
  fprintf(stderr, "\tvertex at %p\n", (void *) v);
 
  fprintf(stderr, "\tx %f y %f z %f oow %f\n", v->x, v->y, v->ooz, v->oow);
+#if FX_PACKEDCOLOR
  fprintf(stderr, "\tr %d g %d b %d a %d\n", v->pargb[2], v->pargb[1], v->pargb[0], v->pargb[3]);
+#else  /* !FX_PACKEDCOLOR */
+ fprintf(stderr, "\tr %f g %f b %f a %f\n", v->r, v->g, v->b, v->a);
+#endif /* !FX_PACKEDCOLOR */
    
  fprintf(stderr, "\n");
 }
@@ -353,7 +368,7 @@ static void fx_draw_point_wide ( fxMesaContext fxMesa,
  const GLcontext *ctx = fxMesa->glCtx;
  const GLfloat psize = (ctx->_TriangleCaps & DD_POINT_ATTEN)
                        ? CLAMP(v0->psize, ctx->Point.MinSize, ctx->Point.MaxSize)
-                      : ctx->Point._Size; /* clamped */
+                       : ctx->Point._Size; /* clamped */
 
  if (ctx->Point.PointSprite) {
     fx_draw_point_sprite(fxMesa, v0, psize);
@@ -430,7 +445,7 @@ static void fx_draw_point_wide_aa ( fxMesaContext fxMesa,
  const GLcontext *ctx = fxMesa->glCtx;
  const GLfloat psize = (ctx->_TriangleCaps & DD_POINT_ATTEN)
                        ? CLAMP(v0->psize, ctx->Point.MinSize, ctx->Point.MaxSize)
-                      : ctx->Point._Size; /* clamped */
+                       : ctx->Point._Size; /* clamped */
 
  if (ctx->Point.PointSprite) {
     fx_draw_point_sprite(fxMesa, v0, psize);
@@ -514,6 +529,7 @@ static struct {
 #endif
 
 
+#if FX_PACKEDCOLOR
 #define VERT_SET_RGBA( dst, f )                        \
 do {                                           \
    UNCLAMPED_FLOAT_TO_UBYTE(dst->pargb[2], f[0]);\
@@ -553,6 +569,74 @@ do {                                               \
    fxMesaContext fxMesa = FX_CONTEXT(ctx);     \
    GLubyte color[n][4], spec[n][4];            \
    (void) color; (void) spec;
+#else  /* !FX_PACKEDCOLOR */
+#define VERT_SET_RGBA( dst, f )        \
+do {                           \
+   CNORM(dst->r, f[0]);                \
+   CNORM(dst->g, f[1]);                \
+   CNORM(dst->b, f[2]);                \
+   CNORM(dst->a, f[3]);                \
+} while (0)
+
+#define VERT_COPY_RGBA( v0, v1 )               \
+do {                                           \
+   *(GLuint *)&v0->r = *(GLuint *)&v1->r;      \
+   *(GLuint *)&v0->g = *(GLuint *)&v1->g;      \
+   *(GLuint *)&v0->b = *(GLuint *)&v1->b;      \
+   *(GLuint *)&v0->a = *(GLuint *)&v1->a;      \
+} while (0)
+
+#define VERT_SAVE_RGBA( idx )                          \
+do {                                           \
+   *(GLuint *)&color[idx][0] = *(GLuint *)&v[idx]->r;\
+   *(GLuint *)&color[idx][1] = *(GLuint *)&v[idx]->g;\
+   *(GLuint *)&color[idx][2] = *(GLuint *)&v[idx]->b;\
+   *(GLuint *)&color[idx][3] = *(GLuint *)&v[idx]->a;\
+} while (0)
+
+#define VERT_RESTORE_RGBA( idx )               \
+do {                                           \
+   *(GLuint *)&v[idx]->r = *(GLuint *)&color[idx][0];\
+   *(GLuint *)&v[idx]->g = *(GLuint *)&color[idx][1];\
+   *(GLuint *)&v[idx]->b = *(GLuint *)&color[idx][2];\
+   *(GLuint *)&v[idx]->a = *(GLuint *)&color[idx][3];\
+} while (0)
+
+
+#define VERT_SET_SPEC( dst, f )        \
+do {                           \
+   CNORM(dst->r1, f[0]);       \
+   CNORM(dst->g1, f[1]);       \
+   CNORM(dst->b1, f[2]);       \
+} while (0)
+
+#define VERT_COPY_SPEC( v0, v1 )               \
+do {                                           \
+   *(GLuint *)&v0->r1 = *(GLuint *)&v1->r1;    \
+   *(GLuint *)&v0->g1 = *(GLuint *)&v1->g1;    \
+   *(GLuint *)&v0->b1 = *(GLuint *)&v1->b1;    \
+} while (0)
+
+#define VERT_SAVE_SPEC( idx )                          \
+do {                                           \
+   *(GLuint *)&spec[idx][0] = *(GLuint *)&v[idx]->r1;\
+   *(GLuint *)&spec[idx][1] = *(GLuint *)&v[idx]->g1;\
+   *(GLuint *)&spec[idx][2] = *(GLuint *)&v[idx]->b1;\
+} while (0)
+
+#define VERT_RESTORE_SPEC( idx )               \
+do {                                           \
+   *(GLuint *)&v[idx]->r1 = *(GLuint *)&spec[idx][0];\
+   *(GLuint *)&v[idx]->g1 = *(GLuint *)&spec[idx][1];\
+   *(GLuint *)&v[idx]->b1 = *(GLuint *)&spec[idx][2];\
+} while (0)
+
+
+#define LOCAL_VARS(n)                          \
+   fxMesaContext fxMesa = FX_CONTEXT(ctx);     \
+   GLuint color[n][4], spec[n][4];             \
+   (void) color; (void) spec;
+#endif /* !FX_PACKEDCOLOR */
 
 
 
@@ -1511,7 +1595,11 @@ GLboolean fxMultipass_ColorSum (GLcontext *ctx, GLuint pass)
                 fxDDDepthMask( ctx, GL_FALSE );
              }
              /* switch to secondary colors */
+#if FX_PACKEDCOLOR
              grVertexLayout(GR_PARAM_PARGB, GR_VERTEX_PSPEC_OFFSET << 2, GR_PARAM_ENABLE);
+#else  /* !FX_PACKEDCOLOR */
+             grVertexLayout(GR_PARAM_RGB, GR_VERTEX_SPEC_OFFSET << 2, GR_PARAM_ENABLE);
+#endif /* !FX_PACKEDCOLOR */
              /* don't advertise new state */
              fxMesa->new_state = 0;
              break;
@@ -1522,7 +1610,11 @@ GLboolean fxMultipass_ColorSum (GLcontext *ctx, GLuint pass)
              ctx->Texture.Unit[0]._ReallyEnabled = t0;
              ctx->Texture.Unit[1]._ReallyEnabled = t1;
              /* revert to primary colors */
+#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);
+#endif /* !FX_PACKEDCOLOR */
              break;
         default:
              assert(0); /* NOTREACHED */
index 13bc1b3ecd8eb031c469f8ea419097f2213afc98..27cb164a3c3bb9632139636902d234ad966e617c 100644 (file)
@@ -55,7 +55,14 @@ static void copy_pv( GLcontext *ctx, GLuint edst, GLuint esrc )
    GrVertex *dst = fxMesa->verts + edst;
    GrVertex *src = fxMesa->verts + esrc;
 
+#if FX_PACKEDCOLOR
    *(GLuint *)&dst->pargb = *(GLuint *)&src->pargb;
+#else  /* !FX_PACKEDCOLOR */
+   *(GLuint *)&dst->r = *(GLuint *)&src->r;
+   *(GLuint *)&dst->g = *(GLuint *)&src->g;
+   *(GLuint *)&dst->b = *(GLuint *)&src->b;
+   *(GLuint *)&dst->a = *(GLuint *)&src->a;
+#endif /* !FX_PACKEDCOLOR */
 }
 
 static void copy_pv2( GLcontext *ctx, GLuint edst, GLuint esrc )
@@ -64,8 +71,18 @@ static void copy_pv2( GLcontext *ctx, GLuint edst, GLuint esrc )
    GrVertex *dst = fxMesa->verts + edst;
    GrVertex *src = fxMesa->verts + esrc;
 
+#if FX_PACKEDCOLOR
    *(GLuint *)&dst->pargb = *(GLuint *)&src->pargb;
    *(GLuint *)&dst->pspec = *(GLuint *)&src->pspec;
+#else  /* !FX_PACKEDCOLOR */
+   *(GLuint *)&dst->r = *(GLuint *)&src->r;
+   *(GLuint *)&dst->g = *(GLuint *)&src->g;
+   *(GLuint *)&dst->b = *(GLuint *)&src->b;
+   *(GLuint *)&dst->a = *(GLuint *)&src->a;
+   *(GLuint *)&dst->r1 = *(GLuint *)&src->r1;
+   *(GLuint *)&dst->g1 = *(GLuint *)&src->g1;
+   *(GLuint *)&dst->b1 = *(GLuint *)&src->b1;
+#endif /* !FX_PACKEDCOLOR */
 }
 
 static struct {
index 255ddc9296df3f806b7e9b32727551c1cad4906a..8ca46dde8f1000b97b792c137139ac3055f4ea60 100644 (file)
@@ -145,6 +145,7 @@ static void TAG(emit)( GLcontext *ctx,
         proj =  (GLfloat (*)[4])((GLubyte *)proj +  proj_stride);
       }
       if (IND & SETUP_RGBA) {
+#if FX_PACKEDCOLOR
          UNCLAMPED_FLOAT_TO_UBYTE(v->pargb[2], col[0][0]);
          UNCLAMPED_FLOAT_TO_UBYTE(v->pargb[1], col[0][1]);
          UNCLAMPED_FLOAT_TO_UBYTE(v->pargb[0], col[0][2]);
@@ -153,12 +154,28 @@ static void TAG(emit)( GLcontext *ctx,
          } else {
             v->pargb[3] = 255;
          }
+#else  /* !FX_PACKEDCOLOR */
+         CNORM(v->r, col[0][0]);
+         CNORM(v->g, col[0][1]);
+         CNORM(v->b, col[0][2]);
+         if (col_size == 4) {
+            CNORM(v->a, col[0][3]);
+         } else {
+            v->a = 255.0f;
+         }
+#endif /* !FX_PACKEDCOLOR */
         STRIDE_4F(col, col_stride);
       }
       if (IND & SETUP_SPEC) {
+#if FX_PACKEDCOLOR
         UNCLAMPED_FLOAT_TO_UBYTE(v->pspec[2], spec[0][0]);
         UNCLAMPED_FLOAT_TO_UBYTE(v->pspec[1], spec[0][1]);
         UNCLAMPED_FLOAT_TO_UBYTE(v->pspec[0], spec[0][2]);
+#else  /* !FX_PACKEDCOLOR */
+         CNORM(v->r1, spec[0][0]);
+         CNORM(v->g1, spec[0][1]);
+         CNORM(v->b1, spec[0][2]);
+#endif /* !FX_PACKEDCOLOR */
         STRIDE_4F(spec, spec_stride);
       }
       if (IND & SETUP_FOGC) {
@@ -253,15 +270,28 @@ static void TAG(interp)( GLcontext *ctx,
    }
 
    
+#if FX_PACKEDCOLOR
    INTERP_UB( t, dst->pargb[0], out->pargb[0], in->pargb[0] );
    INTERP_UB( t, dst->pargb[1], out->pargb[1], in->pargb[1] );
    INTERP_UB( t, dst->pargb[2], out->pargb[2], in->pargb[2] );
    INTERP_UB( t, dst->pargb[3], out->pargb[3], in->pargb[3] );
+#else  /* !FX_PACKEDCOLOR */
+   INTERP_F( t, dst->r, out->r, in->r );
+   INTERP_F( t, dst->g, out->g, in->g );
+   INTERP_F( t, dst->b, out->b, in->b );
+   INTERP_F( t, dst->a, out->a, in->a );
+#endif /* !FX_PACKEDCOLOR */
 
    if (IND & SETUP_SPEC) {
+#if FX_PACKEDCOLOR
       INTERP_UB( t, dst->pspec[0], out->pspec[0], in->pspec[0] );
       INTERP_UB( t, dst->pspec[1], out->pspec[1], in->pspec[1] );
       INTERP_UB( t, dst->pspec[2], out->pspec[2], in->pspec[2] );
+#else  /* !FX_PACKEDCOLOR */
+      INTERP_F( t, dst->r1, out->r1, in->r1 );
+      INTERP_F( t, dst->g1, out->g1, in->g1 );
+      INTERP_F( t, dst->b1, out->b1, in->b1 );
+#endif /* !FX_PACKEDCOLOR */
    }
 
    if (IND & SETUP_FOGC) {