[Mesa-dev] [PATCH 1/4] glsl: Only set ir_variable::constant_value for const-decorated variables
Ian Romanick
idr at freedesktop.org
Thu Oct 8 10:06:48 PDT 2015
On 10/08/2015 02:50 AM, Iago Toral wrote:
> 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.
You are correct. The run through that CI system that I started when I
sent the patches out confirms... all the uniform initializer tests fail.
I'm not sure why the linker doesn't just use constant_initializer
instead. I knew the linker needed this data (because I wrote that
part), but I was not expecting it to use constant_value. I'll dig more.
> 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