[Mesa-dev] [PATCH] glsl: propagate max_array_access through function calls

Dominik Behr dbehr at chromium.org
Wed Sep 4 14:48:53 PDT 2013


Updated patch. Previous one would reference NULL pointer if the list of
formal parameters was empty.


On Wed, Sep 4, 2013 at 2:40 PM, Dominik Behr <dbehr at chromium.org> wrote:

> Fixes a bug where if an uniform array is passed to a function the accesses
> to the array are not propagated so later all but the first vector of the
> uniform array are removed in parcel_out_uniform_storage resulting in
> broken shaders and out of bounds access to arrays in
> brw::vec4_visitor::pack_uniform_registers.
>
> Signed-off-by: Dominik Behr <dbehr at chromium.org>
> ---
>  src/glsl/link_functions.cpp | 31 +++++++++++++++++++++++++++++++
>  1 file changed, 31 insertions(+)
>
> diff --git a/src/glsl/link_functions.cpp b/src/glsl/link_functions.cpp
> index 6b3e154..547a963 100644
> --- a/src/glsl/link_functions.cpp
> +++ b/src/glsl/link_functions.cpp
> @@ -173,6 +173,37 @@ public:
>        return visit_continue;
>     }
>
> +   virtual ir_visitor_status visit_leave(ir_call *ir)
> +   {
> +      /* Traverse list of function parameters, and for array parameters
> +         propagate max_array_access, Otherwise arrays that are only
> referenced
> +         from inside functions via function parameters will be incorrectly
> +         optimized. This will lead to incorrect code being generated (or
> worse).
> +         Do it when leaving the node so the childen would propagate their
> +         array accesses first */
> +
> +      const exec_node *formal_param_node =
> ir->callee->parameters.get_head();
> +      if (formal_param_node) {
> +         const exec_node *actual_param_node =
> ir->actual_parameters.get_head();
> +         while (!actual_param_node->is_tail_sentinel()) {
> +            ir_variable *formal_param = (ir_variable *) formal_param_node;
> +            ir_rvalue *actual_param = (ir_rvalue *) actual_param_node;
> +
> +            formal_param_node = formal_param_node->get_next();
> +            actual_param_node = actual_param_node->get_next();
> +
> +            if (formal_param->type->is_array()) {
> +               ir_dereference_variable *deref =
> actual_param->as_dereference_variable();
> +               if (deref && deref->var && deref->var->type->is_array()) {
> +                  deref->var->max_array_access =
> +                     MAX2(formal_param->max_array_access,
> deref->var->max_array_access);
> +               }
> +            }
> +         }
> +      }
> +      return visit_continue;
> +   }
> +
>     virtual ir_visitor_status visit(ir_dereference_variable *ir)
>     {
>        if (hash_table_find(locals, ir->var) == NULL) {
> --
> 1.8.4
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130904/3a037f30/attachment.html>


More information about the mesa-dev mailing list