mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 02:40:11 +01:00
glsl: move process_qualifier_constant() to ast_type.cpp
We will make use of this function being here in the following patch. Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
52caeee7e7
commit
13f6c788eb
3 changed files with 47 additions and 41 deletions
|
|
@ -1205,4 +1205,10 @@ extern void _mesa_ast_process_interface_block(YYLTYPE *locp,
|
||||||
ast_interface_block *const block,
|
ast_interface_block *const block,
|
||||||
const struct ast_type_qualifier &q);
|
const struct ast_type_qualifier &q);
|
||||||
|
|
||||||
|
extern bool
|
||||||
|
process_qualifier_constant(struct _mesa_glsl_parse_state *state,
|
||||||
|
YYLTYPE *loc,
|
||||||
|
const char *qual_indentifier,
|
||||||
|
ast_expression *const_expression,
|
||||||
|
unsigned *value);
|
||||||
#endif /* AST_H */
|
#endif /* AST_H */
|
||||||
|
|
|
||||||
|
|
@ -2584,47 +2584,6 @@ validate_matrix_layout_for_type(struct _mesa_glsl_parse_state *state,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
process_qualifier_constant(struct _mesa_glsl_parse_state *state,
|
|
||||||
YYLTYPE *loc,
|
|
||||||
const char *qual_indentifier,
|
|
||||||
ast_expression *const_expression,
|
|
||||||
unsigned *value)
|
|
||||||
{
|
|
||||||
exec_list dummy_instructions;
|
|
||||||
|
|
||||||
if (const_expression == NULL) {
|
|
||||||
*value = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ir_rvalue *const ir = const_expression->hir(&dummy_instructions, state);
|
|
||||||
|
|
||||||
ir_constant *const const_int = ir->constant_expression_value();
|
|
||||||
if (const_int == NULL || !const_int->type->is_integer()) {
|
|
||||||
_mesa_glsl_error(loc, state, "%s must be an integral constant "
|
|
||||||
"expression", qual_indentifier);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (const_int->value.i[0] < 0) {
|
|
||||||
_mesa_glsl_error(loc, state, "%s layout qualifier is invalid (%d < 0)",
|
|
||||||
qual_indentifier, const_int->value.u[0]);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the location is const (and we've verified that
|
|
||||||
* it is) then no instructions should have been emitted
|
|
||||||
* when we converted it to HIR. If they were emitted,
|
|
||||||
* then either the location isn't const after all, or
|
|
||||||
* we are emitting unnecessary instructions.
|
|
||||||
*/
|
|
||||||
assert(dummy_instructions.is_empty());
|
|
||||||
|
|
||||||
*value = const_int->value.u[0];
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
validate_stream_qualifier(YYLTYPE *loc, struct _mesa_glsl_parse_state *state,
|
validate_stream_qualifier(YYLTYPE *loc, struct _mesa_glsl_parse_state *state,
|
||||||
unsigned stream)
|
unsigned stream)
|
||||||
|
|
|
||||||
|
|
@ -566,3 +566,44 @@ ast_layout_expression::process_qualifier_constant(struct _mesa_glsl_parse_state
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
process_qualifier_constant(struct _mesa_glsl_parse_state *state,
|
||||||
|
YYLTYPE *loc,
|
||||||
|
const char *qual_indentifier,
|
||||||
|
ast_expression *const_expression,
|
||||||
|
unsigned *value)
|
||||||
|
{
|
||||||
|
exec_list dummy_instructions;
|
||||||
|
|
||||||
|
if (const_expression == NULL) {
|
||||||
|
*value = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ir_rvalue *const ir = const_expression->hir(&dummy_instructions, state);
|
||||||
|
|
||||||
|
ir_constant *const const_int = ir->constant_expression_value();
|
||||||
|
if (const_int == NULL || !const_int->type->is_integer()) {
|
||||||
|
_mesa_glsl_error(loc, state, "%s must be an integral constant "
|
||||||
|
"expression", qual_indentifier);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (const_int->value.i[0] < 0) {
|
||||||
|
_mesa_glsl_error(loc, state, "%s layout qualifier is invalid (%d < 0)",
|
||||||
|
qual_indentifier, const_int->value.u[0]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the location is const (and we've verified that
|
||||||
|
* it is) then no instructions should have been emitted
|
||||||
|
* when we converted it to HIR. If they were emitted,
|
||||||
|
* then either the location isn't const after all, or
|
||||||
|
* we are emitting unnecessary instructions.
|
||||||
|
*/
|
||||||
|
assert(dummy_instructions.is_empty());
|
||||||
|
|
||||||
|
*value = const_int->value.u[0];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue