glsl/lower_output_reads: fix geometry shader output handling with conditional emit
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 17 Nov 2016 20:55:38 +0000 (21:55 +0100)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 21 Nov 2016 07:21:31 +0000 (08:21 +0100)
Consider a geometry shader that contains code like this:

   some_out = expr;

   if (cond) {
      ...
      EmitVertex();
   } else {
      ...
      EmitVertex();
   }

Both branches should see the correct value of some_out.

Since this is a rather subtle and rare case, I'm submitting a piglit test
for this as well.

GLSL says that the values of output variables are undefined after
EmitVertex(). With this change, the values will now be defined and
unmodified. This may reduce optimization opportunities in the probably
quite rare case where subsequent compiler passes cannot prove that the
value of the output variable is overwritten.

Cc: 13.0 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/compiler/glsl/lower_output_reads.cpp

index 732f4d3d8496cd9459c99669d48ade9dc88b4482..8a375ac0ad55b0d5d9996dbb6f92d1b84e4a4d64 100644 (file)
@@ -157,7 +157,6 @@ ir_visitor_status
 output_read_remover::visit_leave(ir_emit_vertex *ir)
 {
    hash_table_call_foreach(replacements, emit_return_copy, ir);
-   _mesa_hash_table_clear(replacements, NULL);
    return visit_continue;
 }