summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
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);