summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2010-08-10 13:06:49 -0700
committerEric Anholt <[email protected]>2010-08-13 17:47:00 -0700
commit2f4fe151681a6f6afe1d452eece6cf4144f44e49 (patch)
tree89fa7ab114f76786b6a84b83b77c8f603486457d /src/glsl
parentc55aa4292f35a6d08b0660e23f248a37988a5f99 (diff)
glsl2: Move the common optimization passes to a helper function.
These are passes that we expect all codegen to be happy with. The other lowering passes for Mesa IR are moved to the Mesa IR generator.
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/glsl_parser_extras.cpp35
-rw-r--r--src/glsl/ir_optimization.h2
-rw-r--r--src/glsl/linker.cpp47
3 files changed, 43 insertions, 41 deletions
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index dbf6f531569..2ed3905abc9 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -33,6 +33,7 @@ extern "C" {
#include "ast.h"
#include "glsl_parser_extras.h"
#include "glsl_parser.h"
+#include "ir_optimization.h"
_mesa_glsl_parse_state::_mesa_glsl_parse_state(struct __GLcontextRec *ctx,
GLenum target, void *mem_ctx)
@@ -705,3 +706,37 @@ ast_struct_specifier::ast_struct_specifier(char *identifier,
name = identifier;
this->declarations.push_degenerate_list_at_head(&declarator_list->link);
}
+
+bool
+do_common_optimization(exec_list *ir, bool linked)
+{
+ GLboolean progress = GL_FALSE;
+
+ progress = do_sub_to_add_neg(ir) || progress;
+
+ if (linked) {
+ progress = do_function_inlining(ir) || progress;
+ progress = do_dead_functions(ir) || progress;
+ }
+ progress = do_structure_splitting(ir) || progress;
+ progress = do_if_simplification(ir) || progress;
+ progress = do_copy_propagation(ir) || progress;
+ if (linked)
+ progress = do_dead_code(ir) || progress;
+ else
+ progress = do_dead_code_unlinked(ir) || progress;
+ progress = do_dead_code_local(ir) || progress;
+ progress = do_tree_grafting(ir) || progress;
+ progress = do_constant_propagation(ir) || progress;
+ if (linked)
+ progress = do_constant_variable(ir) || progress;
+ else
+ progress = do_constant_variable_unlinked(ir) || progress;
+ progress = do_constant_folding(ir) || progress;
+ progress = do_algebraic(ir) || progress;
+ progress = do_if_return(ir) || progress;
+ progress = do_vec_index_to_swizzle(ir) || progress;
+ progress = do_swizzle_swizzle(ir) || progress;
+
+ return progress;
+}
diff --git a/src/glsl/ir_optimization.h b/src/glsl/ir_optimization.h
index 5997a30eab3..0c4e548e44c 100644
--- a/src/glsl/ir_optimization.h
+++ b/src/glsl/ir_optimization.h
@@ -28,6 +28,8 @@
* Prototypes for optimization passes to be called by the compiler and drivers.
*/
+bool do_common_optimization(exec_list *ir, bool linked);
+
bool do_algebraic(exec_list *instructions);
bool do_constant_folding(exec_list *instructions);
bool do_constant_variable(exec_list *instructions);
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 7bff859d554..9931251f404 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -1308,48 +1308,13 @@ link_shaders(struct gl_shader_program *prog)
prog->LinkStatus = true;
}
- /* FINISHME: Perform whole-program optimization here. */
+ /* Do common optimization before assigning storage for attributes,
+ * uniforms, and varyings. Later optimization could possibly make
+ * some of that unused.
+ */
for (unsigned i = 0; i < prog->_NumLinkedShaders; i++) {
- /* Optimization passes */
- bool progress;
- exec_list *ir = prog->_LinkedShaders[i]->ir;
-
- /* Lowering */
- do_mat_op_to_vec(ir);
- do_mod_to_fract(ir);
- do_div_to_mul_rcp(ir);
- do_explog_to_explog2(ir);
- do_sub_to_add_neg(ir);
-
- do {
- progress = false;
-
- progress = do_function_inlining(ir) || progress;
- progress = do_dead_functions(ir) || progress;
- progress = do_structure_splitting(ir) || progress;
- progress = do_if_simplification(ir) || progress;
- progress = do_copy_propagation(ir) || progress;
- progress = do_dead_code_local(ir) || progress;
- progress = do_dead_code(ir) || progress;
- progress = do_tree_grafting(ir) || progress;
- progress = do_constant_propagation(ir) || progress;
- progress = do_constant_variable(ir) || progress;
- progress = do_constant_folding(ir) || progress;
- progress = do_algebraic(ir) || progress;
- progress = do_if_return(ir) || progress;
-#if 0
- if (ctx->Shader.EmitNoIfs)
- progress = do_if_to_cond_assign(ir) || progress;
-#endif
-
- progress = do_vec_index_to_swizzle(ir) || progress;
- /* Do this one after the previous to let the easier pass handle
- * constant vector indexing.
- */
- progress = do_vec_index_to_cond_assign(ir) || progress;
-
- progress = do_swizzle_swizzle(ir) || progress;
- } while (progress);
+ while (do_common_optimization(prog->_LinkedShaders[i]->ir, true))
+ ;
}
assign_uniform_locations(prog);