added (back!) option to use non-packedcolor

This commit is contained in:
Daniel Borca 2004-09-24 07:03:53 +00:00
parent 303c342d53
commit d9873c59ef
8 changed files with 203 additions and 4 deletions

View 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)

View 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" : "");

View 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

View 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,

View 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 */

View 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 */

View 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 {

View 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) {