Mesa (glsl2): linker: Do post-link lowering and optimization
Ian Romanick
idr at kemper.freedesktop.org
Wed Jul 21 00:52:48 UTC 2010
Module: Mesa
Branch: glsl2
Commit: a7ba9a7919110fd619b0e792368aa1f3534080fe
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a7ba9a7919110fd619b0e792368aa1f3534080fe
Author: Ian Romanick <ian.d.romanick at intel.com>
Date: Tue Jul 20 13:36:32 2010 -0700
linker: Do post-link lowering and optimization
The lowering code should probably be moved elsewhere.
---
src/glsl/linker.cpp | 38 ++++++++++++++++++++++++++++++++++++++
1 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index eb4eb9d..640e6ee 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -80,6 +80,7 @@ extern "C" {
#include "hash_table.h"
#include "shader_api.h"
#include "linker.h"
+#include "ir_optimization.h"
/**
* Visitor that determines whether or not a variable is ever written.
@@ -1223,6 +1224,43 @@ link_shaders(struct gl_shader_program *prog)
}
/* FINISHME: Perform whole-program optimization here. */
+ 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 {
+ progress = false;
+
+ progress = do_function_inlining(ir) || progress;
+ progress = do_if_simplification(ir) || progress;
+ progress = do_copy_propagation(ir) || progress;
+ progress = do_dead_code_local(ir) || progress;
+#if 0
+ progress = do_dead_code_unlinked(state, ir) || progress;
+#endif
+ progress = do_constant_variable_unlinked(ir) || progress;
+ progress = do_constant_folding(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);
+ }
assign_uniform_locations(prog);
More information about the mesa-commit
mailing list