[Mesa-dev] [PATCH 1/4] glsl: Only set ir_variable::constant_value for const-decorated variables

Iago Toral itoral at igalia.com
Thu Oct 8 02:50:42 PDT 2015


On Wed, 2015-10-07 at 14:34 -0700, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> Right now we're also setting for uniforms, and that doesn't seem to hurt
> things.  The next patch will make general global variables in GLSL ES,
> and those definitely should not have constant_value set!

I think this breaks uniforms initializers in desktop GLSL (which are
allowed). See link_uniform_initializers.cpp, that code expects uniforms
with constant_value set.

Verified with this quick test:

--- vertex shader:
#version 330
layout(location = 0) in vec3 inVertexPosition;
uniform mat4 MVP;
uniform float test = 1.0;
out float v2f;

void main()
{
   gl_Position = MVP * vec4(inVertexPosition, 1);
   v2f = test;
}

--- fragment shader:
#version 330
in float v2f;
out vec3 color;

void main()
{
   color = vec3(v2f);
}

Without your patch, the constant initialization of 'test' is handled by
linker::set_uniform_initializer, which won't happen with this patch
applied.

Iago

> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/glsl/ast_to_hir.cpp | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 9511440..e3d4c44 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3238,17 +3238,20 @@ process_initializer(ir_variable *var, ast_declaration *decl,
>                                  decl->identifier);
>                 if (var->type->is_numeric()) {
>                    /* Reduce cascading errors. */
> -                  var->constant_value = ir_constant::zero(state, var->type);
> +                  var->constant_value = type->qualifier.flags.q.constant
> +                     ? ir_constant::zero(state, var->type) : NULL;
>                 }
>              }
>           } else {
>              rhs = constant_value;
> -            var->constant_value = constant_value;
> +            var->constant_value = type->qualifier.flags.q.constant
> +               ? constant_value : NULL;
>           }
>        } else {
>           if (var->type->is_numeric()) {
>              /* Reduce cascading errors. */
> -            var->constant_value = ir_constant::zero(state, var->type);
> +            var->constant_value = type->qualifier.flags.q.constant
> +               ? ir_constant::zero(state, var->type) : NULL;
>           }
>        }
>     }




More information about the mesa-dev mailing list