diff options
author | Alan Hourihane <[email protected]> | 2009-03-18 21:16:35 +0000 |
---|---|---|
committer | Alan Hourihane <[email protected]> | 2009-03-18 21:17:35 +0000 |
commit | 752296b8f311c5e3844f3ce89d17ba57224ce5ba (patch) | |
tree | 23f377f24a3cd3930842e4738bff016aed6ce34e /src | |
parent | 08d44512e973f1388f8b1d4436cc2aa888c6060e (diff) |
slang: if we detect an if/break or if/continue within a loop and we're
trying to unroll, bail, and fallback to doing the real loop.
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/shader/slang/slang_codegen.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 753e5c45c44..d5d0c2d45f1 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -719,6 +719,23 @@ new_var(slang_assemble_ctx *A, slang_variable *var) /** + * Determine if the given operation is of a specific type. + */ +static GLboolean +is_operation_type(const slang_operation *oper, slang_operation_type type) +{ + if (oper->type == type) + return GL_TRUE; + else if ((oper->type == SLANG_OPER_BLOCK_NEW_SCOPE || + oper->type == SLANG_OPER_BLOCK_NO_NEW_SCOPE) && + oper->num_children == 1) + return is_operation_type(&oper->children[0], type); + else + return GL_FALSE; +} + + +/** * Check if the given function is really just a wrapper for a * basic assembly instruction. */ @@ -2619,6 +2636,17 @@ _slang_unroll_for_loop(slang_assemble_ctx * A, const slang_operation *oper) if (!slang_operation_copy(body, &oper->children[3])) return NULL; + /* + * If we detect an if/break or if/continue lets do the real loop + * and forget unrolling. + */ + if (body->children[1].type == SLANG_OPER_IF) { + if (is_operation_type(&body->children[1].children[1], SLANG_OPER_BREAK)) + return NULL; + if (is_operation_type(&body->children[1].children[1], SLANG_OPER_CONTINUE)) + return NULL; + } + /* in body, replace instances of 'varId' with literal 'iter' */ { slang_variable *oldVar; @@ -2719,23 +2747,6 @@ _slang_gen_continue(slang_assemble_ctx * A, const slang_operation *oper) /** - * Determine if the given operation is of a specific type. - */ -static GLboolean -is_operation_type(const slang_operation *oper, slang_operation_type type) -{ - if (oper->type == type) - return GL_TRUE; - else if ((oper->type == SLANG_OPER_BLOCK_NEW_SCOPE || - oper->type == SLANG_OPER_BLOCK_NO_NEW_SCOPE) && - oper->num_children == 1) - return is_operation_type(&oper->children[0], type); - else - return GL_FALSE; -} - - -/** * Generate IR tree for an if/then/else conditional using high-level * IR_IF instruction. */ |