[Mesa-dev] [PATCH] glsl: mark explicit uniforms as explicit in other stages too

Tapani Pälli tapani.palli at intel.com
Thu Jan 14 04:08:56 PST 2016



On 01/14/2016 01:49 PM, Timothy Arceri wrote:
> On Thu, 2016-01-14 at 13:02 +0200, Tapani Pälli wrote:
>> If shader declares uniform explicit location in one stage but
>> implicit in
>> another, explicit location should be used. Patch marks implicit
>> uniforms
>> as explicit if they were explicit in another stage. This makes sure
>> that
>> we don't treat them implicit later when assigning locations.
>
>
> I think it would be better to fix the code in cross_validate_globals()
> it seems it is halfway doing this already but it only copies the
> explicit location from later stages into the first uniform it found,
> and not the otherway around

True, I'll try moving the copying there.

> I think you just need to check if the existing uniform is explicit and
> copy the location to the currently matched var if its not explicit and
> it should fix this bug.

Right, do the same as this patch but no additional map required, nice!

>>
>> Fixes following CTS test:
>>     ES31-CTS.explicit_uniform_location.uniform-loc-implicit-in-some
>> -stages3
>>
>> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
>> ---
>>   src/glsl/linker.cpp | 36 +++++++++++++++++++++++++++++++++++-
>>   1 file changed, 35 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
>> index 564c471..70e701c 100644
>> --- a/src/glsl/linker.cpp
>> +++ b/src/glsl/linker.cpp
>> @@ -3131,11 +3131,33 @@ check_explicit_uniform_locations(struct
>> gl_context *ctx,
>>       */
>>      string_to_uint_map *uniform_map = new string_to_uint_map;
>>
>> -   if (!uniform_map) {
>> +   /* This map is used to validate that uniforms with explicit
>> location are
>> +    * given the same explicit location properly across shader stages
>> which
>> +    * reference the same uniform without explicit location
>> qualifier.
>> +    */
>> +   string_to_uint_map *explicit_map = new string_to_uint_map;
>> +
>> +   if (!uniform_map || !explicit_map) {
>>         linker_error(prog, "Out of memory during linking.\n");
>>         return;
>>      }
>>
>> +   /* A pass to generate hash that contains all uniforms where
>> location
>> +    * has been set explicitly.
>> +    */
>> +   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
>> +      struct gl_shader *sh = prog->_LinkedShaders[i];
>> +      if (!sh)
>> +         continue;
>> +      foreach_in_list(ir_instruction, node, sh->ir) {
>> +         ir_variable *var = node->as_variable();
>> +         if (!var || var->data.mode != ir_var_uniform ||
>> +             !var->data.explicit_location)
>> +            continue;
>> +         explicit_map->put(var->data.location, var->name);
>> +      }
>> +   }
>> +
>>      unsigned entries_total = 0;
>>      for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
>>         struct gl_shader *sh = prog->_LinkedShaders[i];
>> @@ -3148,6 +3170,17 @@ check_explicit_uniform_locations(struct
>> gl_context *ctx,
>>            if (!var || var->data.mode != ir_var_uniform)
>>               continue;
>>
>> +         /* Check if this uniform with implicit location was marked
>> explicit
>> +          * by any shader stage. If so, mark it explicit in this
>> stage too to
>> +          * make sure later processing does not treat it as implicit
>> one.
>> +          */
>> +         unsigned hash_loc;
>> +         if (!var->data.explicit_location &&
>> +             explicit_map->get(hash_loc, var->name)) {
>> +            var->data.explicit_location = 1;
>> +            var->data.location = hash_loc;
>> +         }
>> +
>>            entries_total += var->type->uniform_locations();
>>
>>            if (var->data.explicit_location) {
>> @@ -3173,6 +3206,7 @@ check_explicit_uniform_locations(struct
>> gl_context *ctx,
>>                      ctx->Const.MaxUserAssignableUniformLocations);
>>      }
>>      delete uniform_map;
>> +   delete explicit_map;
>>   }
>>
>>   static bool


More information about the mesa-dev mailing list