[Mesa-dev] [PATCH] glsl: look for frag data bindings with [0] tacked onto the end for arrays
Corentin Wallez
corentin at wallez.net
Fri Jul 8 19:39:29 UTC 2016
Not sure how reviews work in Mesa, but this patch LGTM. I also tested that
it fixes the relevant tests failures it is supposed to address.
On Wed, Jul 6, 2016 at 7:40 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> The GL spec is very unclear on this point. Apparently this is discussed
> without resolution in the closed Khronos bugtracker at
> https://cvs.khronos.org/bugzilla/show_bug.cgi?id=7829 . The
> recommendation is to allow dropping the [0] for looking up the bindings.
>
> The approach taken in this patch is to instead tack on [0]'s for each
> arrayness level of the output's type, and doing the lookup again. That
> way, for
>
> out vec4 foo[2][2][2]
>
> we will end up looking for bindings for foo, foo[0], foo[0][0], and
> foo[0][0][0], in that order of preference.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96765
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> src/compiler/glsl/linker.cpp | 39 ++++++++++++++++++++++++++++-----------
> 1 file changed, 28 insertions(+), 11 deletions(-)
>
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index d963f54..9d54c2f 100644
> --- a/src/compiler/glsl/linker.cpp
> +++ b/src/compiler/glsl/linker.cpp
> @@ -2566,6 +2566,7 @@ find_available_slots(unsigned used_mask, unsigned
> needed_count)
> /**
> * Assign locations for either VS inputs or FS outputs
> *
> + * \param mem_ctx Temporary ralloc context used for linking
> * \param prog Shader program whose variables need locations
> assigned
> * \param constants Driver specific constant values for the program.
> * \param target_index Selector for the program target to receive
> location
> @@ -2577,7 +2578,8 @@ find_available_slots(unsigned used_mask, unsigned
> needed_count)
> * error is emitted to the shader link log and false is returned.
> */
> bool
> -assign_attribute_or_color_locations(gl_shader_program *prog,
> +assign_attribute_or_color_locations(void *mem_ctx,
> + gl_shader_program *prog,
> struct gl_constants *constants,
> unsigned target_index)
> {
> @@ -2680,16 +2682,31 @@
> assign_attribute_or_color_locations(gl_shader_program *prog,
> } else if (target_index == MESA_SHADER_FRAGMENT) {
> unsigned binding;
> unsigned index;
> + const char *name = var->name;
> + const glsl_type *type = var->type;
> +
> + while (type) {
> + /* Check if there's a binding for the variable name */
> + if (prog->FragDataBindings->get(binding, name)) {
> + assert(binding >= FRAG_RESULT_DATA0);
> + var->data.location = binding;
> + var->data.is_unmatched_generic_inout = 0;
> +
> + if (prog->FragDataIndexBindings->get(index, name)) {
> + var->data.index = index;
> + }
> + break;
> + }
>
> - if (prog->FragDataBindings->get(binding, var->name)) {
> - assert(binding >= FRAG_RESULT_DATA0);
> - var->data.location = binding;
> - var->data.is_unmatched_generic_inout = 0;
> + /* If not, but it's an array type, look for name[0] */
> + if (type->is_array()) {
> + name = ralloc_asprintf(mem_ctx, "%s[0]", name);
> + type = type->fields.array;
> + continue;
> + }
>
> - if (prog->FragDataIndexBindings->get(index, var->name)) {
> - var->data.index = index;
> - }
> - }
> + break;
> + }
> }
>
> /* From GL4.5 core spec, section 15.2 (Shader Execution):
> @@ -4816,12 +4833,12 @@ link_shaders(struct gl_context *ctx, struct
> gl_shader_program *prog)
> prev = i;
> }
>
> - if (!assign_attribute_or_color_locations(prog, &ctx->Const,
> + if (!assign_attribute_or_color_locations(mem_ctx, prog, &ctx->Const,
> MESA_SHADER_VERTEX)) {
> goto done;
> }
>
> - if (!assign_attribute_or_color_locations(prog, &ctx->Const,
> + if (!assign_attribute_or_color_locations(mem_ctx, prog, &ctx->Const,
> MESA_SHADER_FRAGMENT)) {
> goto done;
> }
> --
> 2.7.3
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160708/1390b3ba/attachment.html>
More information about the mesa-dev
mailing list