From ec698034d1a7cc390ce8eda8a28732fa40ff80ec Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 14 Jul 2008 15:58:57 -0600 Subject: mesa: assemble main() after all other functions Before, main() had to come after any functions it called. --- src/mesa/shader/slang/slang_compile.c | 36 +++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c index ccb04494bf..29c5ca2f4b 100644 --- a/src/mesa/shader/slang/slang_compile.c +++ b/src/mesa/shader/slang/slang_compile.c @@ -1788,20 +1788,6 @@ parse_function(slang_parse_ctx * C, slang_output_ctx * O, int definition, *parsed_func_ret = found_func; } - /* assemble the parsed function */ - { - slang_assemble_ctx A; - - A.atoms = C->atoms; - A.space.funcs = O->funs; - A.space.structs = O->structs; - A.space.vars = O->vars; - A.program = O->program; - A.vartable = O->vartable; - A.log = C->L; - - _slang_codegen_function(&A, *parsed_func_ret); - } return GL_TRUE; } @@ -1844,6 +1830,7 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit, slang_output_ctx o; GLboolean success; GLuint maxRegs; + slang_function *mainFunc = NULL; if (unit->type == SLANG_UNIT_FRAGMENT_BUILTIN || unit->type == SLANG_UNIT_FRAGMENT_SHADER) { @@ -1871,6 +1858,11 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit, { slang_function *func; success = parse_function(C, &o, 1, &func); + if (success && + _mesa_strcmp((char *) func->header.a_name, "main") == 0) { + /* found main() */ + mainFunc = func; + } } break; case EXTERNAL_DECLARATION: @@ -1888,6 +1880,22 @@ parse_code_unit(slang_parse_ctx * C, slang_code_unit * unit, } C->I++; + if (mainFunc) { + /* assemble (generate code) for main() */ + slang_assemble_ctx A; + + A.atoms = C->atoms; + A.space.funcs = o.funs; + A.space.structs = o.structs; + A.space.vars = o.vars; + A.program = o.program; + A.vartable = o.vartable; + A.log = C->L; + + _slang_codegen_function(&A, mainFunc); + + } + _slang_pop_var_table(o.vartable); _slang_delete_var_table(o.vartable); -- cgit v1.2.3