From ba3da6154c324cc916845bc5de3de077d0b59ffc Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Sat, 12 Nov 2005 18:44:29 +0000 Subject: [PATCH] Added OSMesaColorClamp(), bug 4917 --- include/GL/osmesa.h | 13 +++++++++++-- src/mesa/drivers/osmesa/osmesa.c | 16 ++++++++++++++++ src/mesa/main/blend.c | 3 +++ src/mesa/main/context.c | 6 ------ src/mesa/main/image.c | 2 +- src/mesa/main/mtypes.h | 9 +++------ src/mesa/swrast/s_context.c | 6 ++++++ src/mesa/swrast/s_context.h | 1 + src/mesa/swrast/s_span.c | 14 ++++++++++++++ 9 files changed, 55 insertions(+), 15 deletions(-) diff --git a/include/GL/osmesa.h b/include/GL/osmesa.h index ef645905c4d..c5057819402 100644 --- a/include/GL/osmesa.h +++ b/include/GL/osmesa.h @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.3 + * Version: 6.5 * - * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2005 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"), @@ -267,6 +267,15 @@ GLAPI OSMESAproc GLAPIENTRY OSMesaGetProcAddress( const char *funcName ); + +/** + * Enable/disable color clamping, off by default. + * New in Mesa 6.5 + */ +GLAPI void GLAPIENTRY +OSMesaColorClamp(GLboolean enable); + + #if defined(__BEOS__) || defined(__QUICKDRAW__) #pragma export off #endif diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c index e4cb27d1163..9d74c33988c 100644 --- a/src/mesa/drivers/osmesa/osmesa.c +++ b/src/mesa/drivers/osmesa/osmesa.c @@ -1255,3 +1255,19 @@ OSMesaGetProcAddress( const char *funcName ) } return _glapi_get_proc_address(funcName); } + + +GLAPI void GLAPIENTRY +OSMesaColorClamp(GLboolean enable) +{ + OSMesaContext osmesa = OSMesaGetCurrentContext(); + + if (enable == GL_TRUE) { + osmesa->mesa.Color.ClampFragmentColor = GL_TRUE; + } + else { + osmesa->mesa.Color.ClampFragmentColor = GL_FIXED_ONLY_ARB; + } +} + + diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c index 61b2b17c0c3..aebc70421ab 100644 --- a/src/mesa/main/blend.c +++ b/src/mesa/main/blend.c @@ -574,6 +574,9 @@ void _mesa_init_color( GLcontext * ctx ) else { ctx->Color.DrawBuffer[0] = GL_FRONT; } + + ctx->Color.ClampFragmentColor = GL_FIXED_ONLY_ARB; + ctx->Color.ClampReadColor = GL_FIXED_ONLY_ARB; } /*@}*/ diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 698dbd33bfb..b25300a0b0e 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1090,12 +1090,6 @@ init_attrib_groups( GLcontext *ctx ) ctx->NewState = _NEW_ALL; ctx->ErrorValue = (GLenum) GL_NO_ERROR; ctx->_Facing = 0; -#if CHAN_TYPE == GL_FLOAT - ctx->ClampFragmentColors = GL_FALSE; /* XXX temporary */ -#else - ctx->ClampFragmentColors = GL_TRUE; -#endif - ctx->ClampVertexColors = GL_TRUE; return GL_TRUE; } diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c index b9a032307c2..0a117a967b6 100644 --- a/src/mesa/main/image.c +++ b/src/mesa/main/image.c @@ -1079,7 +1079,7 @@ _mesa_pack_rgba_span_float( GLcontext *ctx, if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { /* compute luminance values */ - if (ctx->ClampFragmentColors) { + if (ctx->Color.ClampReadColor == GL_TRUE) { for (i = 0; i < n; i++) { GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; luminance[i] = CLAMP(sum, 0.0F, 1.0F); diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 1a90583295c..17978e7135a 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -536,6 +536,9 @@ struct gl_colorbuffer_attrib /*@}*/ GLboolean DitherFlag; /**< Dither enable flag */ + + GLenum ClampFragmentColor; /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */ + GLenum ClampReadColor; /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */ }; @@ -2896,12 +2899,6 @@ struct __GLcontextRec * We don't have a better way to communicate this value from * swrast_setup to swrast. */ - /** \name Color clamping (tentative part of GL_ARB_color_clamp_control) */ - /*@{*/ - GLboolean ClampFragmentColors; - GLboolean ClampVertexColors; - /*@}*/ - /** \name For debugging/development only */ /*@{*/ GLboolean FirstTimeCurrent; diff --git a/src/mesa/swrast/s_context.c b/src/mesa/swrast/s_context.c index 186fda0949f..9d283b0589e 100644 --- a/src/mesa/swrast/s_context.c +++ b/src/mesa/swrast/s_context.c @@ -105,6 +105,12 @@ _swrast_update_rasterflags( GLcontext *ctx ) rasterMask |= ATIFRAGSHADER_BIT; } +#if CHAN_TYPE == GL_FLOAT + if (ctx->Color.ClampFragmentColor == GL_TRUE) { + rasterMask |= CLAMPING_BIT; + } +#endif + SWRAST_CONTEXT(ctx)->_RasterMask = rasterMask; } diff --git a/src/mesa/swrast/s_context.h b/src/mesa/swrast/s_context.h index 3d738819e94..5cfe7627a5d 100644 --- a/src/mesa/swrast/s_context.h +++ b/src/mesa/swrast/s_context.h @@ -245,6 +245,7 @@ typedef void (*swrast_tri_func)( GLcontext *ctx, const SWvertex *, #define TEXTURE_BIT 0x1000 /**< Texturing really enabled */ #define FRAGPROG_BIT 0x2000 /**< Fragment program enabled */ #define ATIFRAGSHADER_BIT 0x4000 /**< ATI Fragment shader enabled */ +#define CLAMPING_BIT 0x8000 /**< Clamp colors to [0,1] */ /*@}*/ #define _SWRAST_NEW_RASTERMASK (_NEW_BUFFERS| \ diff --git a/src/mesa/swrast/s_span.c b/src/mesa/swrast/s_span.c index fbff31b90e3..1cf743ae483 100644 --- a/src/mesa/swrast/s_span.c +++ b/src/mesa/swrast/s_span.c @@ -1276,6 +1276,20 @@ _swrast_write_rgba_span( GLcontext *ctx, struct sw_span *span) } } + /* Clamp color/alpha values over the range [0.0, 1.0] before storage */ +#if CHAN_TYPE == GL_FLOAT + if (ctx->Color.ClampFragmentColor) { + GLchan (*rgba)[4] = span->array->rgba; + GLuint i; + for (i = 0; i < span->end; i++) { + rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0, CHAN_MAXF); + rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0, CHAN_MAXF); + rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0, CHAN_MAXF); + rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0, CHAN_MAXF); + } + } +#endif + if (swrast->_RasterMask & MULTI_DRAW_BIT) { /* need to do blend/logicop separately for each color buffer */ multi_write_rgba_span(ctx, span);