[Mesa-dev] [PATCH 1/4] glsl: Refactor a bunch of the code out of cross_validate_outputs_to_inputs
Ian Romanick
idr at freedesktop.org
Wed Sep 4 08:17:11 PDT 2013
On 09/03/2013 09:41 AM, Paul Berry wrote:
> On 30 August 2013 16:07, Ian Romanick <idr at freedesktop.org
> <mailto:idr at freedesktop.org>> wrote:
>
> From: Ian Romanick <ian.d.romanick at intel.com
> <mailto:ian.d.romanick at intel.com>>
>
> The new function, cross_validate_types_and_qualifiers, will have
> multiple callers from this file in future commits.
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com
> <mailto:ian.d.romanick at intel.com>>
> ---
> src/glsl/link_varyings.cpp | 171
> +++++++++++++++++++++++++--------------------
> 1 file changed, 94 insertions(+), 77 deletions(-)
>
> diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
> index 4ceb1d3..a1899f7 100644
> --- a/src/glsl/link_varyings.cpp
> +++ b/src/glsl/link_varyings.cpp
> @@ -41,6 +41,97 @@
>
>
> /**
> + * Validate the types and qualifiers of an output from one stage
> against the
> + * matching input to another stage.
> + */
> +static void
> +cross_validate_types_and_qualifiers(struct gl_shader_program *prog,
> + const ir_variable *input,
> + const ir_variable *output,
> + GLenum consumer_type,
> + const char *consumer_stage,
> + const char *producer_stage)
>
>
> It seems redundant to pass both consumer_type and consumer_stage as
> arguments, since the latter is just
> _mesa_glsl_shader_target_name(consumer_type). You might want to just
> pass consumer_type and producer_type, and use
> _mesa_glsl_shader_target_name() to convert them to strings in the event
> of an error.
I thought about doing that. I decided against it for a couple
reasons... but now that I've looked at it again, I like it. :) I've
changed the signature to
static void
cross_validate_types_and_qualifiers(struct gl_shader_program *prog,
const ir_variable *input,
const ir_variable *output,
GLenum consumer_type,
GLenum producer_type);
And I just call _mesa_glsl_shader_target_name in the linker_error calls.
I pushed this to master of my repo on fdo. Does that look good to you?
> However, it's extra bookkeeping work to do that, so I'm ambivalent about
> it. Either way,
>
> Reviewed-by: Paul Berry <stereotype441 at gmail.com
> <mailto:stereotype441 at gmail.com>>
>
>
> +{
> + /* Check that the types match between stages.
> + */
> + const glsl_type *type_to_match = input->type;
> + if (consumer_type == GL_GEOMETRY_SHADER) {
> + assert(type_to_match->is_array()); /* Enforced by ast_to_hir */
> + type_to_match = type_to_match->element_type();
> + }
> + if (type_to_match != output->type) {
> + /* There is a bit of a special case for gl_TexCoord. This
> + * built-in is unsized by default. Applications that variable
> + * access it must redeclare it with a size. There is some
> + * language in the GLSL spec that implies the fragment shader
> + * and vertex shader do not have to agree on this size. Other
> + * driver behave this way, and one or two applications seem to
> + * rely on it.
> + *
> + * Neither declaration needs to be modified here because the
> array
> + * sizes are fixed later when update_array_sizes is called.
> + *
> + * From page 48 (page 54 of the PDF) of the GLSL 1.10 spec:
> + *
> + * "Unlike user-defined varying variables, the built-in
> + * varying variables don't have a strict one-to-one
> + * correspondence between the vertex language and the
> + * fragment language."
> + */
> + if (!output->type->is_array()
> + || (strncmp("gl_", output->name, 3) != 0)) {
> + linker_error(prog,
> + "%s shader output `%s' declared as type `%s', "
> + "but %s shader input declared as type `%s'\n",
> + producer_stage, output->name,
> + output->type->name,
> + consumer_stage, input->type->name);
> + return;
> + }
> + }
> +
> + /* Check that all of the qualifiers match between stages.
> + */
> + if (input->centroid != output->centroid) {
> + linker_error(prog,
> + "%s shader output `%s' %s centroid qualifier, "
> + "but %s shader input %s centroid qualifier\n",
> + producer_stage,
> + output->name,
> + (output->centroid) ? "has" : "lacks",
> + consumer_stage,
> + (input->centroid) ? "has" : "lacks");
> + return;
> + }
> +
> + if (input->invariant != output->invariant) {
> + linker_error(prog,
> + "%s shader output `%s' %s invariant qualifier, "
> + "but %s shader input %s invariant qualifier\n",
> + producer_stage,
> + output->name,
> + (output->invariant) ? "has" : "lacks",
> + consumer_stage,
> + (input->invariant) ? "has" : "lacks");
> + return;
> + }
> +
> + if (input->interpolation != output->interpolation) {
> + linker_error(prog,
> + "%s shader output `%s' specifies %s "
> + "interpolation qualifier, "
> + "but %s shader input specifies %s "
> + "interpolation qualifier\n",
> + producer_stage,
> + output->name,
> + output->interpolation_string(),
> + consumer_stage,
> + input->interpolation_string());
> + return;
> + }
> +}
> +
> +/**
> * Validate that outputs from one stage match inputs of another
> */
> void
> @@ -81,83 +172,9 @@ cross_validate_outputs_to_inputs(struct
> gl_shader_program *prog,
>
> ir_variable *const output = parameters.get_variable(input->name);
> if (output != NULL) {
> - /* Check that the types match between stages.
> - */
> - const glsl_type *type_to_match = input->type;
> - if (consumer->Type == GL_GEOMETRY_SHADER) {
> - assert(type_to_match->is_array()); /* Enforced by
> ast_to_hir */
> - type_to_match = type_to_match->element_type();
> - }
> - if (type_to_match != output->type) {
> - /* There is a bit of a special case for gl_TexCoord. This
> - * built-in is unsized by default. Applications that
> variable
> - * access it must redeclare it with a size. There is some
> - * language in the GLSL spec that implies the fragment
> shader
> - * and vertex shader do not have to agree on this size.
> Other
> - * driver behave this way, and one or two applications
> seem to
> - * rely on it.
> - *
> - * Neither declaration needs to be modified here because
> the array
> - * sizes are fixed later when update_array_sizes is called.
> - *
> - * From page 48 (page 54 of the PDF) of the GLSL 1.10 spec:
> - *
> - * "Unlike user-defined varying variables, the built-in
> - * varying variables don't have a strict one-to-one
> - * correspondence between the vertex language and the
> - * fragment language."
> - */
> - if (!output->type->is_array()
> - || (strncmp("gl_", output->name, 3) != 0)) {
> - linker_error(prog,
> - "%s shader output `%s' declared as type
> `%s', "
> - "but %s shader input declared as type
> `%s'\n",
> - producer_stage, output->name,
> - output->type->name,
> - consumer_stage, input->type->name);
> - return;
> - }
> - }
> -
> - /* Check that all of the qualifiers match between stages.
> - */
> - if (input->centroid != output->centroid) {
> - linker_error(prog,
> - "%s shader output `%s' %s centroid qualifier, "
> - "but %s shader input %s centroid qualifier\n",
> - producer_stage,
> - output->name,
> - (output->centroid) ? "has" : "lacks",
> - consumer_stage,
> - (input->centroid) ? "has" : "lacks");
> - return;
> - }
> -
> - if (input->invariant != output->invariant) {
> - linker_error(prog,
> - "%s shader output `%s' %s invariant
> qualifier, "
> - "but %s shader input %s invariant qualifier\n",
> - producer_stage,
> - output->name,
> - (output->invariant) ? "has" : "lacks",
> - consumer_stage,
> - (input->invariant) ? "has" : "lacks");
> - return;
> - }
> -
> - if (input->interpolation != output->interpolation) {
> - linker_error(prog,
> - "%s shader output `%s' specifies %s "
> - "interpolation qualifier, "
> - "but %s shader input specifies %s "
> - "interpolation qualifier\n",
> - producer_stage,
> - output->name,
> - output->interpolation_string(),
> - consumer_stage,
> - input->interpolation_string());
> - return;
> - }
> + cross_validate_types_and_qualifiers(prog, input, output,
> + consumer->Type,
> consumer_stage,
> + producer_stage);
> }
> }
> }
> --
> 1.8.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list