<p dir="ltr"><br>
On Aug 30, 2015 3:44 AM, "Timothy Arceri" <<a href="mailto:t_arceri@yahoo.com.au">t_arceri@yahoo.com.au</a>> wrote:<br>
><br>
> This will allow us to access the uniform later on without resorting to<br>
> building a name string and looking it up in UniformHash.<br>
> ---<br>
>  src/glsl/ir.h              |  2 ++<br>
>  src/glsl/link_uniforms.cpp | 21 ++++++++++++++++++---<br>
>  src/glsl/nir/nir.h         |  2 ++<br>
>  3 files changed, 22 insertions(+), 3 deletions(-)<br>
><br>
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h<br>
> index ede8caa..9bcaf28 100644<br>
> --- a/src/glsl/ir.h<br>
> +++ b/src/glsl/ir.h<br>
> @@ -819,6 +819,8 @@ public:<br>
>         *   - Fragment shader output: one of the values from \c gl_frag_result.<br>
>         *   - Uniforms: Per-stage uniform slot number for default uniform block.<br>
>         *   - Uniforms: Index within the uniform block definition for UBO members.<br>
> +       *   - Opaque Uniforms: explicit binding until linking then reused to<br>
> +       *     store uniform slot number.<br>
>         *   - Other: This field is not currently used.<br>
>         *<br>
>         * If the variable is a uniform, shader input, or shader output, and the<br>
> diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp<br>
> index 8bf5ef9..c28f13d 100644<br>
> --- a/src/glsl/link_uniforms.cpp<br>
> +++ b/src/glsl/link_uniforms.cpp<br>
> @@ -458,6 +458,7 @@ public:<br>
>     {<br>
>        current_var = var;<br>
>        field_counter = 0;<br>
> +      this->explicit_binding = current_var->data.location;<br>
>        this->record_next_sampler = new string_to_uint_map;<br>
><br>
>        ubo_block_index = -1;<br>
> @@ -510,12 +511,18 @@ public:<br>
>                      var->get_interface_type()->name);<br>
>           else<br>
>              process(var);<br>
> -      } else<br>
> +      } else {<br>
> +         /* Reset data location so we can reuse this variable for storing the<br>
> +          * uniform slot of opaque types.<br>
> +          */<br>
> +         current_var->data.location = -1;<br>
> +</p>
<p dir="ltr">Why are we doing this in the else case and not where we save off the value? It seems like it will be easier to read if either a) only use the save and use the saved value for opaque things or b) always save and use the saved copy.  In particular, it looks like we wipe this for non-opaque non-UBO uniforms without ever setting it back.  I guess that may be OK because IIRC, you can't set locations on them.  However, it would still be good to make the logic match up better.  Am I making any sense?</p>
<p dir="ltr">>           process(var);<br>
>        }<br>
>        delete this->record_next_sampler;<br>
>     }<br>
><br>
> +</p>
<p dir="ltr">Unneeded whitespace change.</p>
<p dir="ltr">>     int ubo_block_index;<br>
>     int ubo_byte_offset;<br>
>     gl_shader_stage shader_type;<br>
> @@ -697,16 +704,23 @@ private:<br>
>           return;<br>
>        }<br>
><br>
> +      /* For array of arrays or struct arrays the base location may have<br>
> +       * already been set so dont set it again.<br>
> +       */<br>
> +      if (base_type->contains_opaque() && current_var->data.location == -1) {<br>
> +          current_var->data.location = id;<br>
> +      }<br>
> +<br>
>        /* Assign explicit locations. */<br>
>        if (current_var->data.explicit_location) {<br>
>           /* Set sequential locations for struct fields. */<br>
>           if (record_type != NULL) {<br>
>              const unsigned entries = MAX2(1, this->uniforms[id].array_elements);<br>
>              this->uniforms[id].remap_location =<br>
> -               current_var->data.location + field_counter;<br>
> +               this->explicit_binding + field_counter;<br>
>              field_counter += entries;<br>
>           } else {<br>
> -            this->uniforms[id].remap_location = current_var->data.location;<br>
> +            this->uniforms[id].remap_location = this->explicit_binding;<br>
>           }<br>
>        } else {<br>
>           /* Initialize to to indicate that no location is set */<br>
> @@ -771,6 +785,7 @@ private:<br>
>     unsigned next_sampler;<br>
>     unsigned next_image;<br>
>     unsigned next_subroutine;<br>
> +   int explicit_binding;</p>
<p dir="ltr">Please put this after current_var in the private section and document that it applies to the current_var.</p>
<p dir="ltr">><br>
>     /* Stores total struct array elements including nested structs */<br>
>     unsigned sampler_count;<br>
> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h<br>
> index 9703372..a051af1 100644<br>
> --- a/src/glsl/nir/nir.h<br>
> +++ b/src/glsl/nir/nir.h<br>
> @@ -278,6 +278,8 @@ typedef struct {<br>
>         *   - Fragment shader output: one of the values from \c gl_frag_result.<br>
>         *   - Uniforms: Per-stage uniform slot number for default uniform block.<br>
>         *   - Uniforms: Index within the uniform block definition for UBO members.<br>
> +       *   - Opaque Uniforms: explicit binding until linking then reused to<br>
> +       *     store uniform slot number.</p>
<p dir="ltr">No need to mention linking here. We don't do linking in NIR at this point and there's no guarantee that we'll do it the same way if/when we do.</p>
<p dir="ltr">>         *   - Other: This field is not currently used.<br>
>         *<br>
>         * If the variable is a uniform, shader input, or shader output, and the<br>
> --<br>
> 2.4.3<br>
><br>
> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</p>