diff options
| author | Brian Paul <brian.paul@tungstengraphics.com> | 2006-10-18 23:14:02 +0000 | 
|---|---|---|
| committer | Brian Paul <brian.paul@tungstengraphics.com> | 2006-10-18 23:14:02 +0000 | 
| commit | 31293910b4e982f2ef54d79aff78f2f854121da1 (patch) | |
| tree | 64113920914c1454a5a099793388086b05f791ad /src | |
| parent | ff07d6de4c1db68bae1f652ed8c6146400ddebae (diff) | |
added clamp_colors(), updated assertions
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/swrast/s_span.c | 54 | 
1 files changed, 33 insertions, 21 deletions
diff --git a/src/mesa/swrast/s_span.c b/src/mesa/swrast/s_span.c index 040058fe86..4628fd0527 100644 --- a/src/mesa/swrast/s_span.c +++ b/src/mesa/swrast/s_span.c @@ -1267,8 +1267,25 @@ apply_aa_coverage(SWspan *span)  /** + * Clamp span's float colors to [0,1] + */ +static void +clamp_colors(SWspan *span) +{ +   GLfloat (*rgba)[4] = span->array->color.sz4.rgba; +   GLuint i; +   ASSERT(span->array->ChanType == GL_FLOAT); +   for (i = 0; i < span->end; i++) { +      rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); +      rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); +      rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); +      rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); +   } +} + + +/**   * Convert the span's color arrays to the given type. - * XXX this could be put into image.c and reused in several places.   */  static void  convert_color_type(GLcontext *ctx, SWspan *span, GLenum newType) @@ -1321,10 +1338,13 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)                                         ctx->FragmentProgram._Enabled ||                                         ctx->ShaderObjects._FragmentShaderPresent); -   ASSERT(span->primitive == GL_POINT  ||  span->primitive == GL_LINE || -	  span->primitive == GL_POLYGON  ||  span->primitive == GL_BITMAP); +   ASSERT(span->primitive == GL_POINT || +          span->primitive == GL_LINE || +	  span->primitive == GL_POLYGON || +          span->primitive == GL_BITMAP);     ASSERT(span->end <= MAX_WIDTH);     ASSERT((span->interpMask & span->arrayMask) == 0); +   ASSERT((span->interpMask & SPAN_RGBA) ^ (span->arrayMask & SPAN_RGBA));     /*     printf("%s()  interp 0x%x  array 0x%x\n", __FUNCTION__, @@ -1368,10 +1388,9 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)     }     /* Interpolate texcoords? */ -   if (ctx->Texture._EnabledCoordUnits -       && (span->interpMask & SPAN_TEXTURE) -       && (span->arrayMask & SPAN_TEXTURE) == 0) { +   if (ctx->Texture._EnabledCoordUnits && (span->interpMask & SPAN_TEXTURE)) {        interpolate_texcoords(ctx, span); +      ASSERT(span->arrayMask & SPAN_TEXTURE);     }     if (ctx->ShaderObjects._FragmentShaderPresent) { @@ -1385,7 +1404,7 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)      */     if (!deferredTexture) {        /* Now we need the rgba array, fill it in if needed */ -      if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) +      if (span->interpMask & SPAN_RGBA)           interpolate_colors(span);        if (span->interpMask & SPAN_SPEC) @@ -1483,7 +1502,7 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)      */     if (deferredTexture) {        /* Now we need the rgba array, fill it in if needed */ -      if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) +      if (span->interpMask & SPAN_RGBA)           interpolate_colors(span);        if (span->interpMask & SPAN_SPEC) @@ -1495,7 +1514,7 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)  #if FEATURE_ARB_fragment_shader        if (ctx->ShaderObjects._FragmentShaderPresent) {           if (span->interpMask & SPAN_Z) -            _swrast_span_interpolate_z (ctx, span); +            _swrast_span_interpolate_z(ctx, span);           _swrast_exec_arbshader (ctx, span);        }        else @@ -1510,7 +1529,8 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)     ASSERT(span->arrayMask & SPAN_RGBA); -   if (!ctx->FragmentProgram._Enabled) { +   if (!ctx->FragmentProgram._Enabled && +       !ctx->ShaderObjects._FragmentShaderPresent) {        /* Add base and specular colors */        if (ctx->Fog.ColorSumEnabled ||            (ctx->Light.Enabled && @@ -1540,18 +1560,10 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *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); -      } +   if (ctx->Color.ClampFragmentColor && +       span->array->ChanType == GL_FLOAT) { +      clamp_colors(span);     } -#endif     /*      * Write to renderbuffers  | 
