From 60174c1aef7c6650a800f16f103a4f9ed2d1004e Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 14 Aug 2001 14:08:44 +0000 Subject: Fixes for 32-bit GLchans: smooth/flat/textured triangles seem to work now. --- src/mesa/swrast/s_context.h | 6 ++--- src/mesa/swrast/s_span.c | 6 ++--- src/mesa/swrast/s_texture.c | 17 ++++++------- src/mesa/swrast/s_tritemp.h | 59 +++++++++++++++++++++++++-------------------- 4 files changed, 47 insertions(+), 41 deletions(-) (limited to 'src/mesa/swrast') diff --git a/src/mesa/swrast/s_context.h b/src/mesa/swrast/s_context.h index 5aad31683ba..88f877e883e 100644 --- a/src/mesa/swrast/s_context.h +++ b/src/mesa/swrast/s_context.h @@ -1,4 +1,4 @@ -/* $Id: s_context.h,v 1.11 2001/07/13 20:07:37 brianp Exp $ */ +/* $Id: s_context.h,v 1.12 2001/08/14 14:08:44 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -195,8 +195,8 @@ _swrast_validate_derived( GLcontext *ctx ); * These should probably go elsewhere at some point. */ #if CHAN_TYPE == GL_FLOAT -#define ChanToFixed(X) FloatToFixed(X) -#define FixedToChan(X) FixedToFloat(X) +#define ChanToFixed(X) (X) +#define FixedToChan(X) (X) #else #define ChanToFixed(X) IntToFixed(X) #define FixedToChan(X) FixedToInt(X) diff --git a/src/mesa/swrast/s_span.c b/src/mesa/swrast/s_span.c index 8e57296a09a..07ab8bd1a59 100644 --- a/src/mesa/swrast/s_span.c +++ b/src/mesa/swrast/s_span.c @@ -1,4 +1,4 @@ -/* $Id: s_span.c,v 1.16 2001/07/23 16:08:19 brianp Exp $ */ +/* $Id: s_span.c,v 1.17 2001/08/14 14:08:44 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -859,7 +859,7 @@ _mesa_write_texture_span( GLcontext *ctx, GLuint n, GLint x, GLint y, write_all = GL_FALSE; } - /* Texture with alpha test*/ + /* Texture with alpha test */ if (ctx->Color.AlphaEnabled) { /* Texturing without alpha is done after depth-testing which gives a potential speed-up. */ @@ -1015,7 +1015,7 @@ _mesa_write_multitexture_span( GLcontext *ctx, GLuint n, GLint x, GLint y, write_all = GL_FALSE; } - /* Texture with alpha test*/ + /* Texture with alpha test */ if (ctx->Color.AlphaEnabled) { /* Texturing without alpha is done after depth-testing which * gives a potential speed-up. diff --git a/src/mesa/swrast/s_texture.c b/src/mesa/swrast/s_texture.c index 3d8b41de60f..9c3e2c5b5f6 100644 --- a/src/mesa/swrast/s_texture.c +++ b/src/mesa/swrast/s_texture.c @@ -1,4 +1,4 @@ -/* $Id: s_texture.c,v 1.37 2001/08/07 22:05:11 brianp Exp $ */ +/* $Id: s_texture.c,v 1.38 2001/08/14 14:08:44 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -910,8 +910,7 @@ opt_sample_rgba_2d( GLcontext *ctx, GLuint texUnit, const GLint colMask = img->Width - 1; const GLint rowMask = img->Height - 1; const GLint shift = img->WidthLog2; - GLuint k; - GLchan (*ptr_rgba)[4] = rgba; + GLuint i; (void) u; (void) lambda; ASSERT(tObj->WrapS==GL_REPEAT); @@ -919,12 +918,12 @@ opt_sample_rgba_2d( GLcontext *ctx, GLuint texUnit, ASSERT(img->Border==0); ASSERT(img->Format==GL_RGBA); - for (k=0; kData) + (pos << 2); /* pos*4 */ - COPY_CHAN4 (ptr_rgba, texel); + for (i = 0; i < n; i++) { + const GLint col = IFLOOR(s[i] * width) & colMask; + const GLint row = IFLOOR(t[i] * height) & rowMask; + const GLint pos = (row << shift) | col; + const GLchan *texel = ((GLchan *) img->Data) + (pos << 2); /* pos*4 */ + COPY_CHAN4(rgba[i], texel); } } diff --git a/src/mesa/swrast/s_tritemp.h b/src/mesa/swrast/s_tritemp.h index 9f0ce46a21d..ae381d39c01 100644 --- a/src/mesa/swrast/s_tritemp.h +++ b/src/mesa/swrast/s_tritemp.h @@ -1,4 +1,4 @@ -/* $Id: s_tritemp.h,v 1.23 2001/07/26 15:57:49 brianp Exp $ */ +/* $Id: s_tritemp.h,v 1.24 2001/08/14 14:08:44 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -419,23 +419,23 @@ GLfloat eMaj_dg, eBot_dg; GLfloat eMaj_db, eBot_db; GLfloat eMaj_da, eBot_da; - eMaj_dr = (GLint) vMax->color[RCOMP] - (GLint) vMin->color[RCOMP]; - eBot_dr = (GLint) vMid->color[RCOMP] - (GLint) vMin->color[RCOMP]; + eMaj_dr = vMax->color[RCOMP] - vMin->color[RCOMP]; + eBot_dr = vMid->color[RCOMP] - vMin->color[RCOMP]; drdx = oneOverArea * (eMaj_dr * eBot.dy - eMaj.dy * eBot_dr); span.redStep = drdx; drdy = oneOverArea * (eMaj.dx * eBot_dr - eMaj_dr * eBot.dx); - eMaj_dg = (GLint) vMax->color[GCOMP] - (GLint) vMin->color[GCOMP]; - eBot_dg = (GLint) vMid->color[GCOMP] - (GLint) vMin->color[GCOMP]; + eMaj_dg = vMax->color[GCOMP] - vMin->color[GCOMP]; + eBot_dg = vMid->color[GCOMP] - vMin->color[GCOMP]; dgdx = oneOverArea * (eMaj_dg * eBot.dy - eMaj.dy * eBot_dg); span.greenStep = dgdx; dgdy = oneOverArea * (eMaj.dx * eBot_dg - eMaj_dg * eBot.dx); - eMaj_db = (GLint) vMax->color[BCOMP] - (GLint) vMin->color[BCOMP]; - eBot_db = (GLint) vMid->color[BCOMP] - (GLint) vMin->color[BCOMP]; + eMaj_db = vMax->color[BCOMP] - vMin->color[BCOMP]; + eBot_db = vMid->color[BCOMP] - vMin->color[BCOMP]; dbdx = oneOverArea * (eMaj_db * eBot.dy - eMaj.dy * eBot_db); span.blueStep = dbdx; dbdy = oneOverArea * (eMaj.dx * eBot_db - eMaj_db * eBot.dx); - eMaj_da = (GLint) vMax->color[ACOMP] - (GLint) vMin->color[ACOMP]; - eBot_da = (GLint) vMid->color[ACOMP] - (GLint) vMin->color[ACOMP]; + eMaj_da = vMax->color[ACOMP] - vMin->color[ACOMP]; + eBot_da = vMid->color[ACOMP] - vMin->color[ACOMP]; dadx = oneOverArea * (eMaj_da * eBot.dy - eMaj.dy * eBot_da); span.alphaStep = dadx; dady = oneOverArea * (eMaj.dx * eBot_da - eMaj_da * eBot.dx); @@ -484,18 +484,18 @@ GLfloat eMaj_dsr, eBot_dsr; GLfloat eMaj_dsg, eBot_dsg; GLfloat eMaj_dsb, eBot_dsb; - eMaj_dsr = (GLint) vMax->specular[RCOMP] - (GLint) vMin->specular[RCOMP]; - eBot_dsr = (GLint) vMid->specular[RCOMP] - (GLint) vMin->specular[RCOMP]; + eMaj_dsr = vMax->specular[RCOMP] - vMin->specular[RCOMP]; + eBot_dsr = vMid->specular[RCOMP] - vMin->specular[RCOMP]; dsrdx = oneOverArea * (eMaj_dsr * eBot.dy - eMaj.dy * eBot_dsr); span.specRedStep = dsrdx; dsrdy = oneOverArea * (eMaj.dx * eBot_dsr - eMaj_dsr * eBot.dx); - eMaj_dsg = (GLint) vMax->specular[GCOMP] - (GLint) vMin->specular[GCOMP]; - eBot_dsg = (GLint) vMid->specular[GCOMP] - (GLint) vMin->specular[GCOMP]; + eMaj_dsg = vMax->specular[GCOMP] - vMin->specular[GCOMP]; + eBot_dsg = vMid->specular[GCOMP] - vMin->specular[GCOMP]; dsgdx = oneOverArea * (eMaj_dsg * eBot.dy - eMaj.dy * eBot_dsg); span.specGreenStep = dsgdx; dsgdy = oneOverArea * (eMaj.dx * eBot_dsg - eMaj_dsg * eBot.dx); - eMaj_dsb = (GLint) vMax->specular[BCOMP] - (GLint) vMin->specular[BCOMP]; - eBot_dsb = (GLint) vMid->specular[BCOMP] - (GLint) vMin->specular[BCOMP]; + eMaj_dsb = vMax->specular[BCOMP] - vMin->specular[BCOMP]; + eBot_dsb = vMid->specular[BCOMP] - vMin->specular[BCOMP]; dsbdx = oneOverArea * (eMaj_dsb * eBot.dy - eMaj.dy * eBot_dsb); span.specBlueStep = dsbdx; dsbdy = oneOverArea * (eMaj.dx * eBot_dsb - eMaj_dsb * eBot.dx); @@ -919,13 +919,17 @@ #endif #ifdef INTERP_FLOAT_RGBA if (ctx->Light.ShadeModel == GL_SMOOTH) { - fr = vLower->color[RCOMP] + drdx * adjx + drdy * adjy; + fr = vLower->color[RCOMP] + + (drdx * adjx + drdy * adjy) * (1.0F / FIXED_SCALE); fdrOuter = drdy + dxOuter * drdx; - fg = vLower->color[GCOMP] + dgdx * adjx + dgdy * adjy; + fg = vLower->color[GCOMP] + + (dgdx * adjx + dgdy * adjy) * (1.0F / FIXED_SCALE); fdgOuter = dgdy + dxOuter * dgdx; - fb = vLower->color[BCOMP] + dbdx * adjx + dbdy * adjy; + fb = vLower->color[BCOMP] + + (dbdx * adjx + dbdy * adjy) * (1.0F / FIXED_SCALE); fdbOuter = dbdy + dxOuter * dbdx; - fa = vLower->color[ACOMP] + dadx * adjx + dady * adjy; + fa = vLower->color[ACOMP] + + (dadx * adjx + dady * adjy) * (1.0F / FIXED_SCALE); fdaOuter = dady + dxOuter * dadx; } else { @@ -939,13 +943,13 @@ #ifdef INTERP_SPEC if (ctx->Light.ShadeModel == GL_SMOOTH) { fsr = (GLfixed) (ChanToFixed(vLower->specular[RCOMP]) - + dsrdx * adjx + dsrdy * adjy) + FIXED_HALF; + + dsrdx * adjx + dsrdy * adjy) + FIXED_HALF; fdsrOuter = SignedFloatToFixed(dsrdy + dxOuter * dsrdx); fsg = (GLfixed) (ChanToFixed(vLower->specular[GCOMP]) - + dsgdx * adjx + dsgdy * adjy) + FIXED_HALF; + + dsgdx * adjx + dsgdy * adjy) + FIXED_HALF; fdsgOuter = SignedFloatToFixed(dsgdy + dxOuter * dsgdx); fsb = (GLfixed) (ChanToFixed(vLower->specular[BCOMP]) - + dsbdx * adjx + dsbdy * adjy) + FIXED_HALF; + + dsbdx * adjx + dsbdy * adjy) + FIXED_HALF; fdsbOuter = SignedFloatToFixed(dsbdy + dxOuter * dsbdx); } else { @@ -957,18 +961,21 @@ #endif #ifdef INTERP_FLOAT_SPEC if (ctx->Light.ShadeModel == GL_SMOOTH) { - fsr = vLower->specular[RCOMP] + dsrdx * adjx + dsrdy * adjy; + fsr = vLower->specular[RCOMP] + + (dsrdx * adjx + dsrdy * adjy) * (1.0F / FIXED_SCALE); fdsrOuter = dsrdy + dxOuter * dsrdx; - fsg = vLower->specular[GCOMP] + dsgdx * adjx + dsgdy * adjy; + fsg = vLower->specular[GCOMP] + + (dsgdx * adjx + dsgdy * adjy) * (1.0F / FIXED_SCALE); fdsgOuter = dsgdy + dxOuter * dsgdx; - fsb = vLower->specular[BCOMP] + dsbdx * adjx + dsbdy * adjy; + fsb = vLower->specular[BCOMP] + + (dsbdx * adjx + dsbdy * adjy) * (1.0F / FIXED_SCALE); fdsbOuter = dsbdy + dxOuter * dsbdx; } else { fsr = v2->specular[RCOMP]; fsg = v2->specular[GCOMP]; fsb = v2->specular[BCOMP]; - fdsrOuter = fdsgOuter = fdsbOuter = 0.0F: + fdsrOuter = fdsgOuter = fdsbOuter = 0.0F; } #endif #ifdef INTERP_INDEX -- cgit v1.2.3