glsl: Factor out code which emits a new function into the IR stream.
A future commit will use the newly created function in a second place.
This commit is contained in:
@@ -714,4 +714,8 @@ _mesa_ast_field_selection_to_hir(const ast_expression *expr,
|
|||||||
exec_list *instructions,
|
exec_list *instructions,
|
||||||
struct _mesa_glsl_parse_state *state);
|
struct _mesa_glsl_parse_state *state);
|
||||||
|
|
||||||
|
void
|
||||||
|
emit_function(_mesa_glsl_parse_state *state, exec_list *instructions,
|
||||||
|
ir_function *f);
|
||||||
|
|
||||||
#endif /* AST_H */
|
#endif /* AST_H */
|
||||||
|
@@ -2477,6 +2477,27 @@ ast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
emit_function(_mesa_glsl_parse_state *state, exec_list *instructions,
|
||||||
|
ir_function *f)
|
||||||
|
{
|
||||||
|
/* Emit the new function header */
|
||||||
|
if (state->current_function == NULL) {
|
||||||
|
instructions->push_tail(f);
|
||||||
|
} else {
|
||||||
|
/* IR invariants disallow function declarations or definitions nested
|
||||||
|
* within other function definitions. Insert the new ir_function
|
||||||
|
* block in the instruction sequence before the ir_function block
|
||||||
|
* containing the current ir_function_signature.
|
||||||
|
*/
|
||||||
|
ir_function *const curr =
|
||||||
|
const_cast<ir_function *>(state->current_function->function());
|
||||||
|
|
||||||
|
curr->insert_before(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ir_rvalue *
|
ir_rvalue *
|
||||||
ast_function::hir(exec_list *instructions,
|
ast_function::hir(exec_list *instructions,
|
||||||
struct _mesa_glsl_parse_state *state)
|
struct _mesa_glsl_parse_state *state)
|
||||||
@@ -2588,24 +2609,7 @@ ast_function::hir(exec_list *instructions,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emit the new function header */
|
emit_function(state, instructions, f);
|
||||||
if (state->current_function == NULL)
|
|
||||||
instructions->push_tail(f);
|
|
||||||
else {
|
|
||||||
/* IR invariants disallow function declarations or definitions nested
|
|
||||||
* within other function definitions. Insert the new ir_function
|
|
||||||
* block in the instruction sequence before the ir_function block
|
|
||||||
* containing the current ir_function_signature.
|
|
||||||
*
|
|
||||||
* This can only happen in a GLSL 1.10 shader. In all other GLSL
|
|
||||||
* versions this nesting is disallowed. There is a check for this at
|
|
||||||
* the top of this function.
|
|
||||||
*/
|
|
||||||
ir_function *const curr =
|
|
||||||
const_cast<ir_function *>(state->current_function->function());
|
|
||||||
|
|
||||||
curr->insert_before(f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify the return type of main() */
|
/* Verify the return type of main() */
|
||||||
|
Reference in New Issue
Block a user