Voodoo2 happiness

This commit is contained in:
Daniel Borca 2003-11-03 12:01:03 +00:00
parent 7093114285
commit 313e12e058
7 changed files with 66 additions and 160 deletions

View file

@ -555,19 +555,19 @@ fxMesaCreateContext(GLuint win,
grGet(GR_MEMORY_TMU, 4, &result);
tmuRam = result / (1024 * 1024);
grGet(GR_MEMORY_FB, 4, &result);
fbRam = result / 1024;
fbRam = result / (1024 * 1024);
}
END_BOARD_LOCK();
sprintf(fxMesa->rendererString, "Mesa %s v0.51 %s %dkB FB, %dMB TM, %d TMU, %s",
sprintf(fxMesa->rendererString, "Mesa %s v0.51 %s %dMB FB, %dMB TM, %d TMU, %s",
grGetString(GR_RENDERER),
grGetString(GR_HARDWARE),
fbRam,
tmuRam * voodoo->nTexelfx,
voodoo->nTexelfx,
(voodoo->numChips > 1) ? "SLI" : "NOSLI");
fxInitPixelTables(fxMesa, useBGR);
fxMesa->bgrOrder = useBGR;
/* screen */
fxMesa->screen_width = FX_grSstScreenWidth();

View file

@ -58,13 +58,6 @@
/* These lookup table are used to extract RGB values in [0,255] from
* 16-bit pixel values.
*/
GLubyte FX_PixelToR[0x10000];
GLubyte FX_PixelToG[0x10000];
GLubyte FX_PixelToB[0x10000];
/* lookup table for scaling 4 bit colors up to 8 bits */
GLuint FX_rgb_scale_4[16] = {
0, 17, 34, 51, 68, 85, 102, 119,
@ -92,39 +85,6 @@ GLuint FX_rgb_scale_6[64] = {
};
/*
* Initialize the FX_PixelTo{RGB} arrays.
* Input: bgrOrder - if TRUE, pixels are in BGR order, else RGB order.
*/
void
fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder)
{
GLuint pixel;
fxMesa->bgrOrder = bgrOrder;
for (pixel = 0; pixel <= 0xffff; pixel++) {
GLuint r, g, b;
if (bgrOrder) {
r = (pixel & 0x001F) << 3;
g = (pixel & 0x07E0) >> 3;
b = (pixel & 0xF800) >> 8;
}
else {
r = (pixel & 0xF800) >> 8;
g = (pixel & 0x07E0) >> 3;
b = (pixel & 0x001F) << 3;
}
/* fill in low-order bits with proper rounding */
r = (GLuint)(((double)r * 255. / 0xF8) + 0.5);
g = (GLuint)(((double)g * 255. / 0xFC) + 0.5);
b = (GLuint)(((double)b * 255. / 0xF8) + 0.5);
FX_PixelToR[pixel] = r;
FX_PixelToG[pixel] = g;
FX_PixelToB[pixel] = b;
}
}
/*
* Disable color by masking out R, G, B, A
*/
@ -577,27 +537,13 @@ fxDDDrawBitmap2 (GLcontext *ctx, GLint px, GLint py,
GLint g = (GLint) (ctx->Current.RasterColor[GCOMP] * 255.0f);
GLint b = (GLint) (ctx->Current.RasterColor[BCOMP] * 255.0f);
GLint a = (GLint) (ctx->Current.RasterColor[ACOMP] * 255.0f);
#if 0
/* [dBorca]
* who uses bgr, anyway? Expecting the V2 from HM... :D
*/
if (fxMesa->bgrOrder)
color = (FxU16)
(((FxU16) 0xf8 & b) << (11 - 3)) |
(((FxU16) 0xfc & g) << (5 - 3 + 1)) | (((FxU16) 0xf8 & r) >> 3);
else
color = (FxU16)
(((FxU16) 0xf8 & r) << (11 - 3)) |
(((FxU16) 0xfc & g) << (5 - 3 + 1)) | (((FxU16) 0xf8 & b) >> 3);
#else
if (fxMesa->colDepth == 15) {
color = TDFXPACKCOLOR1555(b, g, r, a);
mode = GR_LFBWRITEMODE_1555;
} else {
color = TDFXPACKCOLOR565(b, g, r);
color = fxMesa->bgrOrder ? TDFXPACKCOLOR565(r, g, b) : TDFXPACKCOLOR565(b, g, r);
mode = GR_LFBWRITEMODE_565;
}
#endif
}
info.size = sizeof(info);
@ -755,21 +701,7 @@ fxDDDrawBitmap4 (GLcontext *ctx, GLint px, GLint py,
GLint g = (GLint) (ctx->Current.RasterColor[GCOMP] * 255.0f);
GLint b = (GLint) (ctx->Current.RasterColor[BCOMP] * 255.0f);
GLint a = (GLint) (ctx->Current.RasterColor[ACOMP] * 255.0f);
#if 0
/* [dBorca]
* who uses bgr, anyway? Expecting the V2 from HM... :D
*/
if (fxMesa->bgrOrder)
color = (FxU16)
(((FxU16) 0xf8 & b) << (11 - 3)) |
(((FxU16) 0xfc & g) << (5 - 3 + 1)) | (((FxU16) 0xf8 & r) >> 3);
else
color = (FxU16)
(((FxU16) 0xf8 & r) << (11 - 3)) |
(((FxU16) 0xfc & g) << (5 - 3 + 1)) | (((FxU16) 0xf8 & b) >> 3);
#else
color = TDFXPACKCOLOR8888(b, g, r, a);
#endif
}
info.size = sizeof(info);
@ -889,20 +821,18 @@ fxDDReadPixels565 (GLcontext * ctx,
GLubyte *d = dst;
for (col = 0; col < halfWidth; col++) {
const GLuint pixel = ((const GLuint *) src)[col];
const GLint pixel0 = pixel & 0xffff;
const GLint pixel1 = pixel >> 16;
*d++ = FX_PixelToR[pixel0];
*d++ = FX_PixelToG[pixel0];
*d++ = FX_PixelToB[pixel0];
*d++ = FX_PixelToR[pixel1];
*d++ = FX_PixelToG[pixel1];
*d++ = FX_PixelToB[pixel1];
*d++ = FX_rgb_scale_5[(pixel >> 11) & 0x1f];
*d++ = FX_rgb_scale_6[(pixel >> 5) & 0x3f];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 27) & 0x1f];
*d++ = FX_rgb_scale_6[(pixel >> 21) & 0x3f];
*d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
}
if (extraPixel) {
GLushort pixel = src[width - 1];
*d++ = FX_PixelToR[pixel];
*d++ = FX_PixelToG[pixel];
*d++ = FX_PixelToB[pixel];
*d++ = FX_rgb_scale_5[(pixel >> 11) & 0x1f];
*d++ = FX_rgb_scale_6[(pixel >> 5) & 0x3f];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
}
dst += dstStride;
src -= srcStride;
@ -917,22 +847,20 @@ fxDDReadPixels565 (GLcontext * ctx,
GLubyte *d = dst;
for (col = 0; col < halfWidth; col++) {
const GLuint pixel = ((const GLuint *) src)[col];
const GLint pixel0 = pixel & 0xffff;
const GLint pixel1 = pixel >> 16;
*d++ = FX_PixelToR[pixel0];
*d++ = FX_PixelToG[pixel0];
*d++ = FX_PixelToB[pixel0];
*d++ = FX_rgb_scale_5[(pixel >> 11) & 0x1f];
*d++ = FX_rgb_scale_6[(pixel >> 5) & 0x3f];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = 255;
*d++ = FX_PixelToR[pixel1];
*d++ = FX_PixelToG[pixel1];
*d++ = FX_PixelToB[pixel1];
*d++ = FX_rgb_scale_5[(pixel >> 27) & 0x1f];
*d++ = FX_rgb_scale_6[(pixel >> 21) & 0x3f];
*d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
*d++ = 255;
}
if (extraPixel) {
const GLushort pixel = src[width - 1];
*d++ = FX_PixelToR[pixel];
*d++ = FX_PixelToG[pixel];
*d++ = FX_PixelToB[pixel];
*d++ = FX_rgb_scale_5[(pixel >> 11) & 0x1f];
*d++ = FX_rgb_scale_6[(pixel >> 5) & 0x3f];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = 255;
}
dst += dstStride;
@ -1005,18 +933,18 @@ fxDDReadPixels555 (GLcontext * ctx,
GLubyte *d = dst;
for (col = 0; col < halfWidth; col++) {
const GLuint pixel = ((const GLuint *) src)[col];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 26) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
}
if (extraPixel) {
GLushort pixel = src[width - 1];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
}
dst += dstStride;
src -= srcStride;
@ -1031,20 +959,20 @@ fxDDReadPixels555 (GLcontext * ctx,
GLubyte *d = dst;
for (col = 0; col < halfWidth; col++) {
const GLuint pixel = ((const GLuint *) src)[col];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = (pixel & 0x8000) ? 255 : 0;
*d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 26) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
*d++ = (pixel & 0x80000000) ? 255 : 0;
}
if (extraPixel) {
const GLushort pixel = src[width - 1];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
*d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
*d++ = FX_rgb_scale_5[ pixel & 0x1f];
*d++ = (pixel & 0x8000) ? 255 : 0;
}
dst += dstStride;
@ -1377,7 +1305,9 @@ fxDDInitFxMesaContext(fxMesaContext fxMesa)
if (fxMesa->haveZBuffer)
grDepthBufferMode(GR_DEPTHBUFFER_ZBUFFER);
grLfbWriteColorFormat(GR_COLORFORMAT_ABGR);
if (!fxMesa->bgrOrder) {
grLfbWriteColorFormat(GR_COLORFORMAT_ABGR);
}
fxMesa->textureAlign = FX_grGetInteger(GR_TEXTURE_ALIGN);
/* [koolsmoky] */

View file

@ -406,18 +406,6 @@ static void fxReadRGBASpan_RGB565 (const GLcontext * ctx,
for (i = j = 0; i < n; i += 2, j++) {
GLuint pixel = data32[j];
#if 0
GLuint pixel0 = pixel & 0xffff;
GLuint pixel1 = pixel >> 16;
rgba[i][RCOMP] = FX_PixelToR[pixel0];
rgba[i][GCOMP] = FX_PixelToG[pixel0];
rgba[i][BCOMP] = FX_PixelToB[pixel0];
rgba[i][ACOMP] = 255;
rgba[i + 1][RCOMP] = FX_PixelToR[pixel1];
rgba[i + 1][GCOMP] = FX_PixelToG[pixel1];
rgba[i + 1][BCOMP] = FX_PixelToB[pixel1];
rgba[i + 1][ACOMP] = 255;
#else
rgba[i][0] = FX_rgb_scale_5[(pixel >> 11) & 0x1F];
rgba[i][1] = FX_rgb_scale_6[(pixel >> 5) & 0x3F];
rgba[i][2] = FX_rgb_scale_5[ pixel & 0x1F];
@ -426,21 +414,13 @@ static void fxReadRGBASpan_RGB565 (const GLcontext * ctx,
rgba[i+1][1] = FX_rgb_scale_6[(pixel >> 21) & 0x3F];
rgba[i+1][2] = FX_rgb_scale_5[(pixel >> 16) & 0x1F];
rgba[i+1][3] = 255;
#endif
}
if (extraPixel) {
GLushort pixel = data16[n];
#if 0
rgba[n][RCOMP] = FX_PixelToR[pixel];
rgba[n][GCOMP] = FX_PixelToG[pixel];
rgba[n][BCOMP] = FX_PixelToB[pixel];
rgba[n][ACOMP] = 255;
#else
rgba[n][0] = FX_rgb_scale_5[(pixel >> 11) & 0x1F];
rgba[n][1] = FX_rgb_scale_6[(pixel >> 5) & 0x3F];
rgba[n][2] = FX_rgb_scale_5[ pixel & 0x1F];
rgba[n][3] = 255;
#endif
}
grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);

View file

@ -864,8 +864,8 @@ GLboolean fxDDIsCompressedFormat ( GLcontext *ctx, GLenum internalFormat )
/* [dBorca]
* we are handling differently the above formats from the generic
* GL_COMPRESSED_RGB[A]. For this, we will always separately
* check for the ones below!
* GL_COMPRESSED_RGB[A]. For this, we will always have to separately
* check the below formats...
*/
#if FX_TC_NCC || FX_TC_NAPALM
@ -1495,7 +1495,7 @@ fxDDCompressedTexImage2D (GLcontext *ctx, GLenum target,
/* choose the texture format */
assert(ctx->Driver.ChooseTextureFormat);
texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx,
internalFormat, format, type);
internalFormat, -1/*format*/, -1/*type*/);
assert(texImage->TexFormat);
/* Determine the appropriate Glide texel format,
@ -1542,11 +1542,12 @@ fxDDCompressedTexImage2D (GLcontext *ctx, GLenum target,
}
#endif
ti->info.format = mml->glideFormat;
texImage->FetchTexel = fxFetchFunction(texImage->TexFormat->MesaFormat);
/* [dBorca] Hack alert:
* what about different size/texel? other anomalies? SW rescaling?
*/
ti->info.format = mml->glideFormat;
texImage->FetchTexel = fxFetchFunction(texImage->TexFormat->MesaFormat);
/* [dBorca]
* Hack alert: unsure...

View file

@ -409,13 +409,6 @@ tfxUnitsState;
_NEW_COLOR) \
/* These lookup table are used to extract RGB values in [0,255] from
* 16-bit pixel values.
*/
extern GLubyte FX_PixelToR[0x10000];
extern GLubyte FX_PixelToG[0x10000];
extern GLubyte FX_PixelToB[0x10000];
/* lookup table for scaling y bit colors up to 8 bits */
extern GLuint FX_rgb_scale_4[16];
extern GLuint FX_rgb_scale_5[32];
@ -688,7 +681,6 @@ extern void fxDDDestroyFxMesaContext(fxMesaContext fxMesa);
extern void fxSetScissorValues(GLcontext * ctx);
extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa,
struct gl_texture_object *tObj, GLint where);
extern void fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder);
extern void fxCheckIsInHardware(GLcontext *ctx);

View file

@ -194,7 +194,9 @@ FX_grSstQueryHardware(GrHwConfiguration * config)
grSstSelect(i);
extension = grGetString(GR_HARDWARE);
if (strstr(extension, "Voodoo Banshee")) {
if (strstr(extension, "Voodoo2")) {
config->SSTs[i].type = GR_SSTTYPE_Voodoo2;
} else if (strstr(extension, "Voodoo Banshee")) {
config->SSTs[i].type = GR_SSTTYPE_Banshee;
} else if (strstr(extension, "Voodoo3")) {
config->SSTs[i].type = GR_SSTTYPE_Voodoo3;
@ -202,8 +204,8 @@ FX_grSstQueryHardware(GrHwConfiguration * config)
config->SSTs[i].type = GR_SSTTYPE_Voodoo4;
} else if (strstr(extension, "Voodoo5")) {
config->SSTs[i].type = GR_SSTTYPE_Voodoo5;
} else { /* Voodoo1,2,rush */
/* ZZZ TO DO: Need to distinguish whether we have V1 or V2 or Rush. */
} else { /* Voodoo1,rush */
/* ZZZ TO DO: Need to distinguish whether we have V1 or Rush. */
config->SSTs[i].type = GR_SSTTYPE_VOODOO;
}

View file

@ -803,33 +803,27 @@ fxSetupDoubleTMU_NoLock(fxMesaContext fxMesa,
}
}
/* [dBorca] Hack alert:
* we put these in reverse order, so that if we can't
* do _REAL_ pointcast, the TMU0 table gets broadcasted
*/
if (!fxMesa->haveGlobalPaletteTexture) {
/* pointcast */
if (ti0->info.format == GR_TEXFMT_P_8) {
if (TDFX_DEBUG & VERBOSE_DRIVER) {
fprintf(stderr, "%s: uploading texture palette for TMU0\n", __FUNCTION__);
}
fxMesa->Glide.grTexDownloadTableExt(ti0->whichTMU, ti0->paltype, &(ti0->palette));
}
#if 1
else /* does anyone guess why is this here? :D */
#endif
if (ti1->info.format == GR_TEXFMT_P_8) {
if (TDFX_DEBUG & VERBOSE_DRIVER) {
fprintf(stderr, "%s: uploading texture palette for TMU1\n", __FUNCTION__);
}
fxMesa->Glide.grTexDownloadTableExt(ti1->whichTMU, ti1->paltype, &(ti1->palette));
}
if (ti0->info.format == GR_TEXFMT_P_8) {
if (TDFX_DEBUG & VERBOSE_DRIVER) {
fprintf(stderr, "%s: uploading texture palette for TMU0\n", __FUNCTION__);
}
fxMesa->Glide.grTexDownloadTableExt(ti0->whichTMU, ti0->paltype, &(ti0->palette));
}
}
#if FX_TC_NCC
/* pointcast */
if ((ti0->info.format == GR_TEXFMT_AYIQ_8422) ||
(ti0->info.format == GR_TEXFMT_YIQ_422)) {
if (TDFX_DEBUG & VERBOSE_DRIVER) {
fprintf(stderr, "%s: uploading NCC0 table for TMU0\n", __FUNCTION__);
}
fxMesa->Glide.grTexDownloadTableExt(ti0->whichTMU, GR_TEXTABLE_NCC0, &(ti0->palette));
}
if ((ti1->info.format == GR_TEXFMT_AYIQ_8422) ||
(ti1->info.format == GR_TEXFMT_YIQ_422)) {
if (TDFX_DEBUG & VERBOSE_DRIVER) {
@ -837,6 +831,13 @@ fxSetupDoubleTMU_NoLock(fxMesaContext fxMesa,
}
fxMesa->Glide.grTexDownloadTableExt(ti1->whichTMU, GR_TEXTABLE_NCC0, &(ti1->palette));
}
if ((ti0->info.format == GR_TEXFMT_AYIQ_8422) ||
(ti0->info.format == GR_TEXFMT_YIQ_422)) {
if (TDFX_DEBUG & VERBOSE_DRIVER) {
fprintf(stderr, "%s: uploading NCC0 table for TMU0\n", __FUNCTION__);
}
fxMesa->Glide.grTexDownloadTableExt(ti0->whichTMU, GR_TEXTABLE_NCC0, &(ti0->palette));
}
#endif
grTexSource(tmu0, ti0->tm[tmu0]->startAddr,