linker: Do post-link lowering and optimization
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 20 Jul 2010 20:36:32 +0000 (13:36 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 21 Jul 2010 00:48:24 +0000 (17:48 -0700)
The lowering code should probably be moved elsewhere.

src/glsl/linker.cpp

index eb4eb9d20e12249da2b26de8a7b3fa59fc58d369..640e6eee8e09d7fc42a07e7f33c519fc2b6ef29c 100644 (file)
@@ -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);