mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 19:40:10 +01:00
glsl2: When a "continue" happens in a "for" loop, run the loop expression.
Fixes: glsl1-for-loop with continue Bug #29097
This commit is contained in:
parent
748c343f8b
commit
2d1ed7b1b1
2 changed files with 15 additions and 0 deletions
|
|
@ -2308,6 +2308,16 @@ ast_jump_statement::hir(exec_list *instructions,
|
|||
} else {
|
||||
ir_loop *const loop = state->loop_or_switch_nesting->as_loop();
|
||||
|
||||
/* Inline the for loop expression again, since we don't know
|
||||
* where near the end of the loop body the normal copy of it
|
||||
* is going to be placed.
|
||||
*/
|
||||
if (mode == ast_continue &&
|
||||
state->loop_or_switch_nesting_ast->rest_expression) {
|
||||
state->loop_or_switch_nesting_ast->rest_expression->hir(instructions,
|
||||
state);
|
||||
}
|
||||
|
||||
if (loop != NULL) {
|
||||
ir_loop_jump *const jump =
|
||||
new(ctx) ir_loop_jump((mode == ast_break)
|
||||
|
|
@ -2422,7 +2432,10 @@ ast_iteration_statement::hir(exec_list *instructions,
|
|||
/* Track the current loop and / or switch-statement nesting.
|
||||
*/
|
||||
ir_instruction *const nesting = state->loop_or_switch_nesting;
|
||||
ast_iteration_statement *nesting_ast = state->loop_or_switch_nesting_ast;
|
||||
|
||||
state->loop_or_switch_nesting = stmt;
|
||||
state->loop_or_switch_nesting_ast = this;
|
||||
|
||||
if (mode != ast_do_while)
|
||||
condition_to_hir(stmt, state);
|
||||
|
|
@ -2442,6 +2455,7 @@ ast_iteration_statement::hir(exec_list *instructions,
|
|||
/* Restore previous nesting before returning.
|
||||
*/
|
||||
state->loop_or_switch_nesting = nesting;
|
||||
state->loop_or_switch_nesting_ast = nesting_ast;
|
||||
|
||||
/* Loops do not have r-values.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ struct _mesa_glsl_parse_state {
|
|||
|
||||
/** Loop or switch statement containing the current instructions. */
|
||||
class ir_instruction *loop_or_switch_nesting;
|
||||
class ast_iteration_statement *loop_or_switch_nesting_ast;
|
||||
|
||||
/** List of structures defined in user code. */
|
||||
const glsl_type **user_structures;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue