[Mesa-dev] [PATCH 16/17] glsl: Add link time checks for GLSL precision qualifiers
Ian Romanick
idr at freedesktop.org
Wed Jul 29 15:21:28 PDT 2015
On 07/29/2015 07:01 AM, Samuel Iglesias Gonsalvez wrote:
> From: Iago Toral Quiroga <itoral at igalia.com>
>
> Currently, we only consider precision qualifiers at compile-time. This patch
> adds precision information to ir_variable so we can also do link time checks.
> Specifically, from the GLSL ES3 spec, 4.5.3 Precision Qualifiers:
>
> "The same uniform declared in different shaders that are linked together
> must have the same precision qualification."
>
> Notice that this patch will check the above also for GLSL ES globals that are
> not uniforms. This is not explicitly stated in the spec, but seems to be
> the only consistent choice since we can only have one definition of a global
> all its declarations should be identical, including precision qualifiers.
That's not right. Global variables from different stages that are not
inputs/outputs or uniforms are distinct... they don't even have to be
the same type. ES shaders only allow a single compliation unit per
stage, so we don't have to worry about inter-stage globals.
> These checks don't affect desktop GLSL shaders because we ignore precision
> information in this case (all variables have precision GLSL_PRECISION_NONE).
>
> Fixes the following 5 dEQP tests:
> dEQP-GLES3.functional.shaders.linkage.uniform.struct.precision_conflict_1
> dEQP-GLES3.functional.shaders.linkage.uniform.struct.precision_conflict_2
> dEQP-GLES3.functional.shaders.linkage.uniform.struct.precision_conflict_3
> dEQP-GLES3.functional.shaders.linkage.uniform.struct.precision_conflict_4
> dEQP-GLES3.functional.shaders.linkage.uniform.block.precision_mismatch
> ---
> src/glsl/linker.cpp | 34 +++++++++++++++++++++++++++++++++-
> 1 file changed, 33 insertions(+), 1 deletion(-)
>
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index 12b7780..fd68f43 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -958,13 +958,22 @@ cross_validate_globals(struct gl_shader_program *prog,
> if (var->type->is_record() && existing->type->is_record()
> && existing->type->record_compare(var->type)) {
> existing->type = var->type;
> - } else {
> + } else if (strcmp(var->type->name, existing->type->name)) {
> linker_error(prog, "%s `%s' declared as type "
> "`%s' and type `%s'\n",
> mode_string(var),
> var->name, var->type->name,
> existing->type->name);
> return;
> + } else {
> + /* The global is declared with the same type name but the type
> + * declarations mismatch (e.g. the same struct type name, but
> + * the actual struct declarations mismatch).
> + */
> + linker_error(prog, "%s `%s' declared with mismatching definitions "
> + "of type `%s'\n",
> + mode_string(var), var->name, var->type->name);
> + return;
> }
> }
> }
> @@ -1121,6 +1130,29 @@ cross_validate_globals(struct gl_shader_program *prog,
> mode_string(var), var->name);
> return;
> }
> + /* From the GLSL ES3 spec, 4.5.3 Precision qualifiers:
> + *
> + * "The same uniform declared in different shaders that are linked
> + * together must have the same precision qualification."
> + *
> + * In the GLSL ES2 spec this was resolved in the issue amendments
> + * (10.3 Precision Qualifiers). The GLSL ES1 spec overlooked this,
> + * but seems like an obvious error since we can only have one
> + * consistent definition of a global.
> + *
> + * The desktop GLSL spec does not include this reference
> + * because precision qualifiers are ignored. We will never
> + * hit this scenario in desktop GLSL though because we always set
> + * the precision of variables to GLSL_PRECISION_NONE.
> + */
> + if (var->data.mode == ir_var_uniform) {
> + if (existing->data.precision != var->data.precision) {
> + linker_error(prog, "declarations for %s `%s` have "
> + "mismatching precision qualifiers\n",
> + mode_string(var), var->name);
> + return;
> + }
> + }
> } else
> variables.add_variable(var);
> }
>
More information about the mesa-dev
mailing list