From c4fe46f0b8b45407ea40500b869ae1beca71063c Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 27 Apr 2006 02:50:31 +0000 Subject: [PATCH] fixes for CHAN_BITS!=8 --- src/mesa/main/colortab.c | 64 ++++++++++++++++++++++++++-------- src/mesa/swrast/s_accum.c | 20 +++++++---- src/mesa/swrast/s_logic.c | 2 +- src/mesa/swrast/s_texcombine.c | 41 ++++++++++++---------- 4 files changed, 88 insertions(+), 39 deletions(-) diff --git a/src/mesa/main/colortab.c b/src/mesa/main/colortab.c index e2f95cf7f9b..8b6fc127fe9 100644 --- a/src/mesa/main/colortab.c +++ b/src/mesa/main/colortab.c @@ -767,7 +767,11 @@ _mesa_GetColorTable( GLenum target, GLenum format, rgba[i][RCOMP] = 0; rgba[i][GCOMP] = 0; rgba[i][BCOMP] = 0; +#if CHAN_BITS==32 + rgba[i][ACOMP] = tableF[i]; +#else rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); +#endif } } else { @@ -786,18 +790,25 @@ _mesa_GetColorTable( GLenum target, GLenum format, const GLfloat *tableF = (const GLfloat *) table->Table; GLuint i; for (i = 0; i < table->Size; i++) { - rgba[i][RCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - rgba[i][GCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); +#if CHAN_BITS==32 + rgba[i][RCOMP] = + rgba[i][GCOMP] = + rgba[i][BCOMP] = tableF[i]; + rgba[i][ACOMP] = CHAN_MAX; +#else + rgba[i][RCOMP] = + rgba[i][GCOMP] = rgba[i][BCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); rgba[i][ACOMP] = CHAN_MAX; +#endif } } else { const GLchan *tableUB = (const GLchan *) table->Table; GLuint i; for (i = 0; i < table->Size; i++) { - rgba[i][RCOMP] = tableUB[i]; - rgba[i][GCOMP] = tableUB[i]; + rgba[i][RCOMP] = + rgba[i][GCOMP] = rgba[i][BCOMP] = tableUB[i]; rgba[i][ACOMP] = CHAN_MAX; } @@ -808,18 +819,25 @@ _mesa_GetColorTable( GLenum target, GLenum format, const GLfloat *tableF = (const GLfloat *) table->Table; GLuint i; for (i = 0; i < table->Size; i++) { - rgba[i][RCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF); - rgba[i][GCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF); +#if CHAN_BITS==32 + rgba[i][RCOMP] = + rgba[i][GCOMP] = + rgba[i][BCOMP] = tableF[i*2+0]; + rgba[i][ACOMP] = tableF[i*2+1]; +#else + rgba[i][RCOMP] = + rgba[i][GCOMP] = rgba[i][BCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF); rgba[i][ACOMP] = IROUND_POS(tableF[i*2+1] * CHAN_MAXF); +#endif } } else { const GLchan *tableUB = (const GLchan *) table->Table; GLuint i; for (i = 0; i < table->Size; i++) { - rgba[i][RCOMP] = tableUB[i*2+0]; - rgba[i][GCOMP] = tableUB[i*2+0]; + rgba[i][RCOMP] = + rgba[i][GCOMP] = rgba[i][BCOMP] = tableUB[i*2+0]; rgba[i][ACOMP] = tableUB[i*2+1]; } @@ -830,19 +848,26 @@ _mesa_GetColorTable( GLenum target, GLenum format, const GLfloat *tableF = (const GLfloat *) table->Table; GLuint i; for (i = 0; i < table->Size; i++) { - rgba[i][RCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - rgba[i][GCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - rgba[i][BCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); +#if CHAN_BITS==32 + rgba[i][RCOMP] = + rgba[i][GCOMP] = + rgba[i][BCOMP] = + rgba[i][ACOMP] = tableF[i]; +#else + rgba[i][RCOMP] = + rgba[i][GCOMP] = + rgba[i][BCOMP] = rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); +#endif } } else { const GLchan *tableUB = (const GLchan *) table->Table; GLuint i; for (i = 0; i < table->Size; i++) { - rgba[i][RCOMP] = tableUB[i]; - rgba[i][GCOMP] = tableUB[i]; - rgba[i][BCOMP] = tableUB[i]; + rgba[i][RCOMP] = + rgba[i][GCOMP] = + rgba[i][BCOMP] = rgba[i][ACOMP] = tableUB[i]; } } @@ -852,10 +877,17 @@ _mesa_GetColorTable( GLenum target, GLenum format, const GLfloat *tableF = (const GLfloat *) table->Table; GLuint i; for (i = 0; i < table->Size; i++) { +#if CHAN_BITS==32 + rgba[i][RCOMP] = tableF[i*3+0]; + rgba[i][GCOMP] = tableF[i*3+1]; + rgba[i][BCOMP] = tableF[i*3+2]; + rgba[i][ACOMP] = CHAN_MAX; +#else rgba[i][RCOMP] = IROUND_POS(tableF[i*3+0] * CHAN_MAXF); rgba[i][GCOMP] = IROUND_POS(tableF[i*3+1] * CHAN_MAXF); rgba[i][BCOMP] = IROUND_POS(tableF[i*3+2] * CHAN_MAXF); rgba[i][ACOMP] = CHAN_MAX; +#endif } } else { @@ -872,6 +904,9 @@ _mesa_GetColorTable( GLenum target, GLenum format, case GL_RGBA: if (table->Type == GL_FLOAT) { const GLfloat *tableF = (const GLfloat *) table->Table; +#if CHAN_BITS==32 + _mesa_memcpy(rgba, tableF, 4 * table->Size * sizeof(GLfloat)); +#else GLuint i; for (i = 0; i < table->Size; i++) { rgba[i][RCOMP] = IROUND_POS(tableF[i*4+0] * CHAN_MAXF); @@ -879,6 +914,7 @@ _mesa_GetColorTable( GLenum target, GLenum format, rgba[i][BCOMP] = IROUND_POS(tableF[i*4+2] * CHAN_MAXF); rgba[i][ACOMP] = IROUND_POS(tableF[i*4+3] * CHAN_MAXF); } +#endif } else { const GLchan *tableUB = (const GLchan *) table->Table; diff --git a/src/mesa/swrast/s_accum.c b/src/mesa/swrast/s_accum.c index cf6dab912b9..a159e804976 100644 --- a/src/mesa/swrast/s_accum.c +++ b/src/mesa/swrast/s_accum.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.5 + * Version: 6.5.1 * - * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -35,6 +35,9 @@ #include "s_span.h" +/* XXX this would have to change for accum buffers with more or less + * than 16 bits per color channel. + */ #define ACCUM_SCALE16 32767.0 @@ -419,9 +422,6 @@ accum_load(GLcontext *ctx, GLfloat value, } } } - else { - /* other types someday */ - } } @@ -462,7 +462,8 @@ accum_return(GLcontext *ctx, GLfloat value, if (accumRb->DataType == GL_SHORT || accumRb->DataType == GL_UNSIGNED_SHORT) { const GLfloat scale = value * CHAN_MAXF / ACCUM_SCALE16; - GLuint buffer, i; + GLuint buffer; + GLint i; /* XXX maybe transpose the 'i' and 'buffer' loops??? */ for (i = 0; i < height; i++) { @@ -496,10 +497,17 @@ accum_return(GLcontext *ctx, GLfloat value, /* scaled integer (or float) accum buffer */ GLint j; for (j = 0; j < width; j++) { +#if CHAN_BITS==32 + GLchan r = acc[j * 4 + 0] * scale; + GLchan g = acc[j * 4 + 1] * scale; + GLchan b = acc[j * 4 + 2] * scale; + GLchan a = acc[j * 4 + 3] * scale; +#else GLint r = IROUND( (GLfloat) (acc[j * 4 + 0]) * scale ); GLint g = IROUND( (GLfloat) (acc[j * 4 + 1]) * scale ); GLint b = IROUND( (GLfloat) (acc[j * 4 + 2]) * scale ); GLint a = IROUND( (GLfloat) (acc[j * 4 + 3]) * scale ); +#endif rgba[j][RCOMP] = CLAMP( r, 0, CHAN_MAX ); rgba[j][GCOMP] = CLAMP( g, 0, CHAN_MAX ); rgba[j][BCOMP] = CLAMP( b, 0, CHAN_MAX ); diff --git a/src/mesa/swrast/s_logic.c b/src/mesa/swrast/s_logic.c index ff3c3fc2f14..60458c2b804 100644 --- a/src/mesa/swrast/s_logic.c +++ b/src/mesa/swrast/s_logic.c @@ -216,7 +216,7 @@ _swrast_logicop_rgba_span(GLcontext *ctx, struct gl_renderbuffer *rb, ASSERT(span->end < MAX_WIDTH); ASSERT(span->arrayMask & SPAN_RGBA); - ASSERT(rb->DataType == GL_UNSIGNED_BYTE); + ASSERT(rb->DataType == CHAN_TYPE); if (span->arrayMask & SPAN_XY) { _swrast_get_values(ctx, rb, span->end, span->array->x, span->array->y, diff --git a/src/mesa/swrast/s_texcombine.c b/src/mesa/swrast/s_texcombine.c index 3c9fdc4d757..db77ad8bc3e 100644 --- a/src/mesa/swrast/s_texcombine.c +++ b/src/mesa/swrast/s_texcombine.c @@ -36,6 +36,11 @@ #define PROD(A,B) ( (GLuint)(A) * ((GLuint)(B)+1) ) #define S_PROD(A,B) ( (GLint)(A) * ((GLint)(B)+1) ) +#if CHAN_BITS == 32 +typedef GLfloat ChanTemp; +#else +typedef GLuint ChanTemp; +#endif /** @@ -996,10 +1001,10 @@ texture_apply( const GLcontext *ctx, break; case GL_LUMINANCE: for (i=0;i