[Mesa-dev] [PATCH] arb_shader_subroutine: fix lowering reusing actual parmaters
Ian Romanick
idr at freedesktop.org
Tue Jan 19 11:37:45 PST 2016
On 01/16/2016 08:23 PM, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> One of the oglconform tests was crashing here, and it was
> due to not cloning the actual parameters before creating the
> new call. This makes a call clone function that does the right
> things to make sure we clone all the needed info, and points
> the callee at it. (It differs from ->clone due to this).
>
> this may fix https://bugs.freedesktop.org/show_bug.cgi?id=93722, I had this
> patch in my cts fixes tree, but hadn't had time to make sure I liked it.
I also sent this as a reply on the piglit list... but then realized you
had probably already sent the patch out. :)
For the sake of avoiding code duplication, I think it's better to make a
new overload of ir_call::clone that takes the callee parameter. Then
implement the existing clone() as this->clone(mem_ctx, ht, this->callee).
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/glsl/lower_subroutine.cpp | 24 +++++++++++++++++++-----
> 1 file changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/src/glsl/lower_subroutine.cpp b/src/glsl/lower_subroutine.cpp
> index a0df5e1..ac8ade1 100644
> --- a/src/glsl/lower_subroutine.cpp
> +++ b/src/glsl/lower_subroutine.cpp
> @@ -44,6 +44,7 @@ public:
> }
>
> ir_visitor_status visit_leave(ir_call *);
> + ir_call *call_clone(ir_call *call, ir_function_signature *callee);
> bool progress;
> struct _mesa_glsl_parse_state *state;
> };
> @@ -58,6 +59,23 @@ lower_subroutine(exec_list *instructions, struct _mesa_glsl_parse_state *state)
> return v.progress;
> }
>
> +ir_call *
> +lower_subroutine_visitor::call_clone(ir_call *call, ir_function_signature *callee)
> +{
> + void *mem_ctx = ralloc_parent(call);
> + ir_dereference_variable *new_return_ref = NULL;
> + if (call->return_deref != NULL)
> + new_return_ref = call->return_deref->clone(mem_ctx, NULL);
> +
> + exec_list new_parameters;
> +
> + foreach_in_list(ir_instruction, ir, &call->actual_parameters) {
> + new_parameters.push_tail(ir->clone(mem_ctx, NULL));
> + }
> +
> + return new(mem_ctx) ir_call(callee, new_return_ref, &new_parameters);
> +}
> +
> ir_visitor_status
> lower_subroutine_visitor::visit_leave(ir_call *ir)
> {
> @@ -66,7 +84,6 @@ lower_subroutine_visitor::visit_leave(ir_call *ir)
>
> void *mem_ctx = ralloc_parent(ir);
> ir_if *last_branch = NULL;
> - ir_dereference_variable *return_deref = ir->return_deref;
>
> for (int s = this->state->num_subroutines - 1; s >= 0; s--) {
> ir_rvalue *var;
> @@ -92,14 +109,11 @@ lower_subroutine_visitor::visit_leave(ir_call *ir)
> fn->exact_matching_signature(this->state,
> &ir->actual_parameters);
>
> - ir_call *new_call = new(mem_ctx) ir_call(sub_sig, return_deref, &ir->actual_parameters);
> + ir_call *new_call = call_clone(ir, sub_sig);
> if (!last_branch)
> last_branch = if_tree(equal(subr_to_int(var), lc), new_call);
> else
> last_branch = if_tree(equal(subr_to_int(var), lc), new_call, last_branch);
> -
> - if (return_deref && s > 0)
> - return_deref = return_deref->clone(mem_ctx, NULL);
> }
> if (last_branch)
> ir->insert_before(last_branch);
>
More information about the mesa-dev
mailing list