ir_reader: Emit global variables at the top of the instruction list.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 4 Sep 2010 08:55:55 +0000 (01:55 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Sat, 4 Sep 2010 09:19:38 +0000 (02:19 -0700)
Since functions are emitted when scanning for prototypes, functions
always come first, even if the original IR listed the variable
declarations first.

Fixes an ir_validate error (to be turned on in the next commit).

src/glsl/ir_reader.cpp

index 1b0815727253a66a8b1427c95c24efd749b7ffc2..408c20e88c9e65b51f845f862a1f1013194d94e2 100644 (file)
@@ -337,8 +337,17 @@ read_instructions(_mesa_glsl_parse_state *st, exec_list *instructions,
    foreach_iter(exec_list_iterator, it, list->subexpressions) {
       s_expression *sub = (s_expression*) it.get();
       ir_instruction *ir = read_instruction(st, sub, loop_ctx);
-      if (ir != NULL)
-        instructions->push_tail(ir);
+      if (ir != NULL) {
+        /* Global variable declarations should be moved to the top, before
+         * any functions that might use them.  Functions are added to the
+         * instruction stream when scanning for prototypes, so without this
+         * hack, they always appear before variable declarations.
+         */
+        if (st->current_function == NULL && ir->as_variable() != NULL)
+           instructions->push_head(ir);
+        else
+           instructions->push_tail(ir);
+      }
    }
 }