glsl: Don't copy propagate or tree graft precise values.
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 3 Apr 2016 09:02:12 +0000 (02:02 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 12 Apr 2016 22:57:48 +0000 (15:57 -0700)
This is kind of a hack.  We currently track precise requirements
by decorating ir_variables.  Propagating or grafting the RHS of an
assignment to a precise value into some other expression tree can
lose those decorations.

In the long run, it might be better to replace these ir_variable
decorations with an "exact" decoration on ir_expression nodes,
similar to what NIR does.

In the short run, this is probably good enough.  It preserves
enough information for glsl_to_nir to generate "exact" decorations,
and NIR will then handle optimizing these expressions reasonably.

Fixes ES31-CTS.gpu_shader5.precise_qualifier.

v2: Drop invariant handling, as it shouldn't be necessary (caught
    by Jason Ekstrand).

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/glsl/opt_copy_propagation.cpp
src/compiler/glsl/opt_copy_propagation_elements.cpp
src/compiler/glsl/opt_tree_grafting.cpp

index 310708db868acde5a8e5d433005757f4c6e1a8bc..ae62921a0dfd72064b38b643714cbda4cd11ec09 100644 (file)
@@ -331,7 +331,8 @@ ir_copy_propagation_visitor::add_copy(ir_assignment *ir)
         ir->condition = new(ralloc_parent(ir)) ir_constant(false);
         this->progress = true;
       } else if (lhs_var->data.mode != ir_var_shader_storage &&
-                 lhs_var->data.mode != ir_var_shader_shared) {
+                 lhs_var->data.mode != ir_var_shader_shared &&
+                 lhs_var->data.precise == rhs_var->data.precise) {
         entry = new(this->acp) acp_entry(lhs_var, rhs_var);
         this->acp->push_tail(entry);
       }
index a6791801943fab0b39b44df4ad02e8f1eeb74065..e9e7c53505ccd00499aff7cf0a574db10ef87a74 100644 (file)
@@ -493,6 +493,9 @@ ir_copy_propagation_elements_visitor::add_copy(ir_assignment *ir)
       }
    }
 
+   if (lhs->var->data.precise != rhs->var->data.precise)
+      return;
+
    entry = new(this->mem_ctx) acp_entry(lhs->var, rhs->var, write_mask,
                                        swizzle);
    this->acp->push_tail(entry);
index 812f996fb813197b18a8a1ed001e35b7d47f946f..a40e5f716098b8c8964739addc2ee50bae2f894d 100644 (file)
@@ -368,6 +368,9 @@ tree_grafting_basic_block(ir_instruction *bb_first,
           lhs_var->data.mode == ir_var_shader_shared)
          continue;
 
+      if (lhs_var->data.precise)
+         continue;
+
       ir_variable_refcount_entry *entry = info->refs->get_variable_entry(lhs_var);
 
       if (!entry->declaration ||