diff options
author | Kenneth Graunke <[email protected]> | 2010-09-04 01:55:55 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2010-09-04 02:19:38 -0700 |
commit | 2809d707231fba0e91abe1dd32e9f2d3284b9d3a (patch) | |
tree | fd52c7b685a6c5efe94eb9c3560a85b418416356 /src | |
parent | b758de16e3e6e27e9ead24aa6241b5d4db0d8836 (diff) |
ir_reader: Emit global variables at the top of the instruction list.
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).
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/ir_reader.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/glsl/ir_reader.cpp b/src/glsl/ir_reader.cpp index 1b081572725..408c20e88c9 100644 --- a/src/glsl/ir_reader.cpp +++ b/src/glsl/ir_reader.cpp @@ -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); + } } } |