summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2011-07-25 18:33:40 -0700
committerIan Romanick <ian.d.romanick@intel.com>2011-07-25 18:45:46 -0700
commitc1e591eed41b45c0fcf1dcac8b1b8aaeb6237a38 (patch)
tree9cae74ae8285bb2d64689294ab33e3de9956ef63
parent99fba503b112a69a2fc14b7dd40684d9a6a1972a (diff)
glsl: Correctly return progress from lower_variable_index_to_cond_assign
lower_variable_index_to_cond_assign runs until it can't make any more progress. It then returns the result of the last pass which will always be false. This caused the lowering loop in _mesa_ir_link_shader to end before doing one last round of lower_if_to_cond_assign. This caused several if-statements (resulting from lower_variable_index_to_cond_assign) to be left in the IR. In addition to this change, lower_variable_index_to_cond_assign should take a flag indicating whether or not it should even generate if-statements. This is easily controlled by switch_generator::linear_sequence_max_length. This would generate much better code on architectures without any flow contol. Fixes i915 piglit regressions glsl-texcoord-array and glsl-fs-vec4-indexing-temp-src. Reviewed-by: Eric Anholt <eric@anholt.net>
-rw-r--r--src/glsl/lower_variable_index_to_cond_assign.cpp4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/glsl/lower_variable_index_to_cond_assign.cpp b/src/glsl/lower_variable_index_to_cond_assign.cpp
index 7792e6e624..f8e4a1de42 100644
--- a/src/glsl/lower_variable_index_to_cond_assign.cpp
+++ b/src/glsl/lower_variable_index_to_cond_assign.cpp
@@ -525,10 +525,12 @@ lower_variable_index_to_cond_assign(exec_list *instructions,
* matrix columns of an array of matrix), each pass will only lower one
* level of indirection.
*/
+ bool progress_ever = false;
do {
v.progress = false;
visit_list_elements(&v, instructions);
+ progress_ever = v.progress || progress_ever;
} while (v.progress);
- return v.progress;
+ return progress_ever;
}