mesa: don't set _ClampFragmentColor to TRUE if it has no effect

This should reduce shader recompilations with drivers that emulate fragment
color clamping, because we want the clamping to be enabled only if there is
a signed normalized or floating-point colorbuffer.

Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Marek Olšák
2013-03-28 01:56:01 +01:00
parent 21d407c1b8
commit 755648c37f
13 changed files with 37 additions and 21 deletions

View File

@@ -863,7 +863,7 @@ void _mesa_init_color( struct gl_context * ctx )
} }
ctx->Color.ClampFragmentColor = GL_FIXED_ONLY_ARB; ctx->Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
ctx->Color._ClampFragmentColor = GL_TRUE; ctx->Color._ClampFragmentColor = GL_FALSE;
ctx->Color.ClampReadColor = GL_FIXED_ONLY_ARB; ctx->Color.ClampReadColor = GL_FIXED_ONLY_ARB;
if (ctx->API == API_OPENGLES2) { if (ctx->API == API_OPENGLES2) {

View File

@@ -785,6 +785,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
fb->Width = 0; fb->Width = 0;
fb->Height = 0; fb->Height = 0;
fb->_AllColorBuffersFixedPoint = GL_TRUE; fb->_AllColorBuffersFixedPoint = GL_TRUE;
fb->_HasSNormOrFloatColorBuffer = GL_FALSE;
/* Start at -2 to more easily loop over all attachment points. /* Start at -2 to more easily loop over all attachment points.
* -2: depth buffer * -2: depth buffer
@@ -901,13 +902,17 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
/* check if integer color */ /* check if integer color */
fb->_IntegerColor = _mesa_is_format_integer_color(attFormat); fb->_IntegerColor = _mesa_is_format_integer_color(attFormat);
/* Update _AllColorBuffersFixedPoint. */ /* Update _AllColorBuffersFixedPoint and _HasSNormOrFloatColorBuffer. */
if (i >= 0) { if (i >= 0) {
GLenum type = _mesa_get_format_datatype(attFormat); GLenum type = _mesa_get_format_datatype(attFormat);
fb->_AllColorBuffersFixedPoint = fb->_AllColorBuffersFixedPoint =
fb->_AllColorBuffersFixedPoint && fb->_AllColorBuffersFixedPoint &&
(type == GL_UNSIGNED_NORMALIZED || type == GL_SIGNED_NORMALIZED); (type == GL_UNSIGNED_NORMALIZED || type == GL_SIGNED_NORMALIZED);
fb->_HasSNormOrFloatColorBuffer =
fb->_HasSNormOrFloatColorBuffer ||
type == GL_SIGNED_NORMALIZED || type == GL_FLOAT;
} }
/* Error-check width, height, format */ /* Error-check width, height, format */

View File

@@ -155,6 +155,7 @@ _mesa_initialize_window_framebuffer(struct gl_framebuffer *fb,
fb->Delete = _mesa_destroy_framebuffer; fb->Delete = _mesa_destroy_framebuffer;
fb->_Status = GL_FRAMEBUFFER_COMPLETE_EXT; fb->_Status = GL_FRAMEBUFFER_COMPLETE_EXT;
fb->_AllColorBuffersFixedPoint = !visual->floatMode; fb->_AllColorBuffersFixedPoint = !visual->floatMode;
fb->_HasSNormOrFloatColorBuffer = visual->floatMode;
compute_depth_max(fb); compute_depth_max(fb);
} }

View File

@@ -24,6 +24,7 @@
#include "glheader.h" #include "glheader.h"
#include "context.h" #include "context.h"
#include "blend.h"
#include "enable.h" #include "enable.h"
#include "enums.h" #include "enums.h"
#include "extensions.h" #include "extensions.h"
@@ -767,13 +768,13 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
break; break;
case GL_FOG_COLOR: case GL_FOG_COLOR:
if(ctx->Color._ClampFragmentColor) if (_mesa_get_clamp_fragment_color(ctx))
COPY_4FV(v->value_float_4, ctx->Fog.Color); COPY_4FV(v->value_float_4, ctx->Fog.Color);
else else
COPY_4FV(v->value_float_4, ctx->Fog.ColorUnclamped); COPY_4FV(v->value_float_4, ctx->Fog.ColorUnclamped);
break; break;
case GL_COLOR_CLEAR_VALUE: case GL_COLOR_CLEAR_VALUE:
if(ctx->Color._ClampFragmentColor) { if (_mesa_get_clamp_fragment_color(ctx)) {
v->value_float_4[0] = CLAMP(ctx->Color.ClearColor.f[0], 0.0F, 1.0F); v->value_float_4[0] = CLAMP(ctx->Color.ClearColor.f[0], 0.0F, 1.0F);
v->value_float_4[1] = CLAMP(ctx->Color.ClearColor.f[1], 0.0F, 1.0F); v->value_float_4[1] = CLAMP(ctx->Color.ClearColor.f[1], 0.0F, 1.0F);
v->value_float_4[2] = CLAMP(ctx->Color.ClearColor.f[2], 0.0F, 1.0F); v->value_float_4[2] = CLAMP(ctx->Color.ClearColor.f[2], 0.0F, 1.0F);
@@ -782,13 +783,13 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
COPY_4FV(v->value_float_4, ctx->Color.ClearColor.f); COPY_4FV(v->value_float_4, ctx->Color.ClearColor.f);
break; break;
case GL_BLEND_COLOR_EXT: case GL_BLEND_COLOR_EXT:
if(ctx->Color._ClampFragmentColor) if (_mesa_get_clamp_fragment_color(ctx))
COPY_4FV(v->value_float_4, ctx->Color.BlendColor); COPY_4FV(v->value_float_4, ctx->Color.BlendColor);
else else
COPY_4FV(v->value_float_4, ctx->Color.BlendColorUnclamped); COPY_4FV(v->value_float_4, ctx->Color.BlendColorUnclamped);
break; break;
case GL_ALPHA_TEST_REF: case GL_ALPHA_TEST_REF:
if(ctx->Color._ClampFragmentColor) if (_mesa_get_clamp_fragment_color(ctx))
v->value_float = ctx->Color.AlphaRef; v->value_float = ctx->Color.AlphaRef;
else else
v->value_float = ctx->Color.AlphaRefUnclamped; v->value_float = ctx->Color.AlphaRefUnclamped;

View File

@@ -2662,6 +2662,7 @@ struct gl_framebuffer
/* ARB_color_buffer_float */ /* ARB_color_buffer_float */
GLboolean _AllColorBuffersFixedPoint; /* no integer, no float */ GLboolean _AllColorBuffersFixedPoint; /* no integer, no float */
GLboolean _HasSNormOrFloatColorBuffer;
/** Array of all renderbuffer attachments, indexed by BUFFER_* tokens. */ /** Array of all renderbuffer attachments, indexed by BUFFER_* tokens. */
struct gl_renderbuffer_attachment Attachment[BUFFER_COUNT]; struct gl_renderbuffer_attachment Attachment[BUFFER_COUNT];

View File

@@ -314,7 +314,17 @@ update_multisample(struct gl_context *ctx)
static void static void
update_clamp_fragment_color(struct gl_context *ctx) update_clamp_fragment_color(struct gl_context *ctx)
{ {
ctx->Color._ClampFragmentColor = _mesa_get_clamp_fragment_color(ctx); struct gl_framebuffer *fb = ctx->DrawBuffer;
/* Don't clamp if:
* - there is no colorbuffer
* - all colorbuffers are unsigned normalized, so clamping has no effect
* - there is an integer colorbuffer
*/
if (!fb || !fb->_HasSNormOrFloatColorBuffer || fb->_IntegerColor)
ctx->Color._ClampFragmentColor = GL_FALSE;
else
ctx->Color._ClampFragmentColor = _mesa_get_clamp_fragment_color(ctx);
} }

View File

@@ -32,6 +32,7 @@
#include "main/glheader.h" #include "main/glheader.h"
#include "main/context.h" #include "main/context.h"
#include "main/blend.h"
#include "main/enums.h" #include "main/enums.h"
#include "main/macros.h" #include "main/macros.h"
#include "main/mtypes.h" #include "main/mtypes.h"
@@ -680,7 +681,7 @@ _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
if (pname == GL_TEXTURE_ENV_COLOR) { if (pname == GL_TEXTURE_ENV_COLOR) {
if(ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP)) if(ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
_mesa_update_state(ctx); _mesa_update_state(ctx);
if(ctx->Color._ClampFragmentColor) if (_mesa_get_clamp_fragment_color(ctx))
COPY_4FV( params, texUnit->EnvColor ); COPY_4FV( params, texUnit->EnvColor );
else else
COPY_4FV( params, texUnit->EnvColorUnclamped ); COPY_4FV( params, texUnit->EnvColorUnclamped );

View File

@@ -31,6 +31,7 @@
#include <stdbool.h> #include <stdbool.h>
#include "main/glheader.h" #include "main/glheader.h"
#include "main/blend.h"
#include "main/colormac.h" #include "main/colormac.h"
#include "main/context.h" #include "main/context.h"
#include "main/enums.h" #include "main/enums.h"
@@ -1415,7 +1416,7 @@ _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP)) if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
_mesa_update_state_locked(ctx); _mesa_update_state_locked(ctx);
if (ctx->Color._ClampFragmentColor) { if (_mesa_get_clamp_fragment_color(ctx)) {
params[0] = CLAMP(obj->Sampler.BorderColor.f[0], 0.0F, 1.0F); params[0] = CLAMP(obj->Sampler.BorderColor.f[0], 0.0F, 1.0F);
params[1] = CLAMP(obj->Sampler.BorderColor.f[1], 0.0F, 1.0F); params[1] = CLAMP(obj->Sampler.BorderColor.f[1], 0.0F, 1.0F);
params[2] = CLAMP(obj->Sampler.BorderColor.f[2], 0.0F, 1.0F); params[2] = CLAMP(obj->Sampler.BorderColor.f[2], 0.0F, 1.0F);

View File

@@ -31,6 +31,7 @@
#include "main/glheader.h" #include "main/glheader.h"
#include "main/context.h" #include "main/context.h"
#include "main/blend.h"
#include "main/imports.h" #include "main/imports.h"
#include "main/macros.h" #include "main/macros.h"
#include "main/mtypes.h" #include "main/mtypes.h"
@@ -239,14 +240,14 @@ _mesa_fetch_state(struct gl_context *ctx, const gl_state_index state[],
{ {
/* state[1] is the texture unit */ /* state[1] is the texture unit */
const GLuint unit = (GLuint) state[1]; const GLuint unit = (GLuint) state[1];
if(ctx->Color._ClampFragmentColor) if (_mesa_get_clamp_fragment_color(ctx))
COPY_4V(value, ctx->Texture.Unit[unit].EnvColor); COPY_4V(value, ctx->Texture.Unit[unit].EnvColor);
else else
COPY_4V(value, ctx->Texture.Unit[unit].EnvColorUnclamped); COPY_4V(value, ctx->Texture.Unit[unit].EnvColorUnclamped);
} }
return; return;
case STATE_FOG_COLOR: case STATE_FOG_COLOR:
if(ctx->Color._ClampFragmentColor) if (_mesa_get_clamp_fragment_color(ctx))
COPY_4V(value, ctx->Fog.Color); COPY_4V(value, ctx->Fog.Color);
else else
COPY_4V(value, ctx->Fog.ColorUnclamped); COPY_4V(value, ctx->Fog.ColorUnclamped);

View File

@@ -227,8 +227,7 @@ static void update_raster_state( struct st_context *st )
/* _NEW_FRAG_CLAMP */ /* _NEW_FRAG_CLAMP */
raster->clamp_fragment_color = !st->clamp_frag_color_in_shader && raster->clamp_fragment_color = !st->clamp_frag_color_in_shader &&
ctx->Color._ClampFragmentColor && ctx->Color._ClampFragmentColor;
!ctx->DrawBuffer->_IntegerColor;
raster->gl_rasterization_rules = 1; raster->gl_rasterization_rules = 1;
/* _NEW_RASTERIZER_DISCARD */ /* _NEW_RASTERIZER_DISCARD */

View File

@@ -86,8 +86,7 @@ update_fp( struct st_context *st )
/* _NEW_FRAG_CLAMP */ /* _NEW_FRAG_CLAMP */
key.clamp_color = st->clamp_frag_color_in_shader && key.clamp_color = st->clamp_frag_color_in_shader &&
st->ctx->Color._ClampFragmentColor && st->ctx->Color._ClampFragmentColor;
!st->ctx->DrawBuffer->_IntegerColor;
st->fp_variant = st_get_fp_variant(st, stfp, &key); st->fp_variant = st_get_fp_variant(st, stfp, &key);

View File

@@ -417,8 +417,7 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
key.st = st; key.st = st;
key.bitmap = GL_TRUE; key.bitmap = GL_TRUE;
key.clamp_color = st->clamp_frag_color_in_shader && key.clamp_color = st->clamp_frag_color_in_shader &&
st->ctx->Color._ClampFragmentColor && st->ctx->Color._ClampFragmentColor;
!st->ctx->DrawBuffer->_IntegerColor;
fpv = st_get_fp_variant(st, st->fp, &key); fpv = st_get_fp_variant(st, st->fp, &key);

View File

@@ -710,8 +710,7 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
struct pipe_rasterizer_state rasterizer; struct pipe_rasterizer_state rasterizer;
memset(&rasterizer, 0, sizeof(rasterizer)); memset(&rasterizer, 0, sizeof(rasterizer));
rasterizer.clamp_fragment_color = !st->clamp_frag_color_in_shader && rasterizer.clamp_fragment_color = !st->clamp_frag_color_in_shader &&
ctx->Color._ClampFragmentColor && ctx->Color._ClampFragmentColor;
!ctx->DrawBuffer->_IntegerColor;
rasterizer.gl_rasterization_rules = 1; rasterizer.gl_rasterization_rules = 1;
rasterizer.depth_clip = !ctx->Transform.DepthClamp; rasterizer.depth_clip = !ctx->Transform.DepthClamp;
rasterizer.scissor = ctx->Scissor.Enabled; rasterizer.scissor = ctx->Scissor.Enabled;
@@ -1037,8 +1036,7 @@ get_color_fp_variant(struct st_context *st)
ctx->Pixel.AlphaScale != 1.0); ctx->Pixel.AlphaScale != 1.0);
key.pixelMaps = ctx->Pixel.MapColorFlag; key.pixelMaps = ctx->Pixel.MapColorFlag;
key.clamp_color = st->clamp_frag_color_in_shader && key.clamp_color = st->clamp_frag_color_in_shader &&
st->ctx->Color._ClampFragmentColor && st->ctx->Color._ClampFragmentColor;
!st->ctx->DrawBuffer->_IntegerColor;
fpv = st_get_fp_variant(st, st->fp, &key); fpv = st_get_fp_variant(st, st->fp, &key);