summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2010-08-05 14:41:09 -0700
committerEric Anholt <[email protected]>2010-08-05 14:41:09 -0700
commit8048226b7b1bbe8fd89f9c32fa4fadca4b8760c4 (patch)
tree55b73abdfee86352226cfe52c87e769f070b6917 /src/glsl
parent0a0ab121f87a3b00e29c20a38fdd28e2fc31bae7 (diff)
glsl2: Insert global declarations at the top of the instruction stream.
Fixes use-before-decl in glslparsertest shaders. Fixes: CorrectFull.frag CorrectModule.frag
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/ast_to_hir.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 292c7be6217..f14341c8f72 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -1951,7 +1951,14 @@ ast_declarator_list::hir(exec_list *instructions,
decl->identifier);
}
- instructions->push_tail(var);
+ /* Push the variable declaration to the top. It means that all
+ * the variable declarations will appear in a funny
+ * last-to-first order, but otherwise we run into trouble if a
+ * function is prototyped, a global var is decled, then the
+ * function is defined with usage of the global var. See
+ * glslparsertest's CorrectModule.frag.
+ */
+ instructions->push_head(var);
instructions->append_list(&initializer_instructions);
/* Add the variable to the symbol table after processing the initializer.