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)
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" : "");
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
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,
#include "fxg.h"
-
+#ifndef FX_PACKEDCOLOR
+#define FX_PACKEDCOLOR 1
+#endif
#define MAX_NUM_SST 4
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) */
#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 */
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];
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;
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");
}
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);
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);
#endif
+#if FX_PACKEDCOLOR
#define VERT_SET_RGBA( dst, f ) \
do { \
UNCLAMPED_FLOAT_TO_UBYTE(dst->pargb[2], f[0]);\
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 */
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;
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 */
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 )
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 {
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]);
} 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) {
}
+#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) {