mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 11:30:11 +01:00
ir_reader: Combine the three dereference reading functions into one.
These used to be more complicated, but now are so simple there's no real point in keeping them separate.
This commit is contained in:
parent
e486fca2d3
commit
ec7e4f0ec5
1 changed files with 35 additions and 82 deletions
|
|
@ -62,12 +62,6 @@ static ir_texture *read_texture(_mesa_glsl_parse_state *, s_expression *);
|
||||||
|
|
||||||
static ir_dereference *read_dereference(_mesa_glsl_parse_state *,
|
static ir_dereference *read_dereference(_mesa_glsl_parse_state *,
|
||||||
s_expression *);
|
s_expression *);
|
||||||
static ir_dereference_variable *
|
|
||||||
read_var_ref(_mesa_glsl_parse_state *, s_expression *);
|
|
||||||
static ir_dereference_array *
|
|
||||||
read_array_ref(_mesa_glsl_parse_state *, s_expression *);
|
|
||||||
static ir_dereference_record *
|
|
||||||
read_record_ref(_mesa_glsl_parse_state *, s_expression *);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
_mesa_glsl_read_ir(_mesa_glsl_parse_state *state, exec_list *instructions,
|
_mesa_glsl_read_ir(_mesa_glsl_parse_state *state, exec_list *instructions,
|
||||||
|
|
@ -827,87 +821,46 @@ read_constant(_mesa_glsl_parse_state *st, s_expression *expr)
|
||||||
static ir_dereference *
|
static ir_dereference *
|
||||||
read_dereference(_mesa_glsl_parse_state *st, s_expression *expr)
|
read_dereference(_mesa_glsl_parse_state *st, s_expression *expr)
|
||||||
{
|
{
|
||||||
s_list *list = SX_AS_LIST(expr);
|
s_symbol *s_var;
|
||||||
if (list == NULL || list->subexpressions.is_empty())
|
s_expression *s_subject;
|
||||||
return NULL;
|
s_expression *s_index;
|
||||||
|
s_symbol *s_field;
|
||||||
|
|
||||||
s_symbol *tag = SX_AS_SYMBOL(list->subexpressions.head);
|
s_pattern var_pat[] = { "var_ref", s_var };
|
||||||
assert(tag != NULL);
|
s_pattern array_pat[] = { "array_ref", s_subject, s_index };
|
||||||
|
s_pattern record_pat[] = { "record_ref", s_subject, s_field };
|
||||||
|
|
||||||
if (strcmp(tag->value(), "var_ref") == 0)
|
if (MATCH(expr, var_pat)) {
|
||||||
return read_var_ref(st, list);
|
ir_variable *var = st->symbols->get_variable(s_var->value());
|
||||||
if (strcmp(tag->value(), "array_ref") == 0)
|
if (var == NULL) {
|
||||||
return read_array_ref(st, list);
|
ir_read_error(st, expr, "undeclared variable: %s", s_var->value());
|
||||||
if (strcmp(tag->value(), "record_ref") == 0)
|
return NULL;
|
||||||
return read_record_ref(st, list);
|
}
|
||||||
|
return new(st) ir_dereference_variable(var);
|
||||||
|
} else if (MATCH(expr, array_pat)) {
|
||||||
|
ir_rvalue *subject = read_rvalue(st, s_subject);
|
||||||
|
if (subject == NULL) {
|
||||||
|
ir_read_error(st, NULL, "when reading the subject of an array_ref");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ir_rvalue *idx = read_rvalue(st, s_index);
|
||||||
|
if (subject == NULL) {
|
||||||
|
ir_read_error(st, NULL, "when reading the index of an array_ref");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return new(st) ir_dereference_array(subject, idx);
|
||||||
|
} else if (MATCH(expr, record_pat)) {
|
||||||
|
ir_rvalue *subject = read_rvalue(st, s_subject);
|
||||||
|
if (subject == NULL) {
|
||||||
|
ir_read_error(st, NULL, "when reading the subject of a record_ref");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return new(st) ir_dereference_record(subject, s_field->value());
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ir_dereference_variable *
|
|
||||||
read_var_ref(_mesa_glsl_parse_state *st, s_expression *expr)
|
|
||||||
{
|
|
||||||
void *ctx = st;
|
|
||||||
s_symbol *var_name;
|
|
||||||
|
|
||||||
s_pattern pat[] = { "var_ref", var_name };
|
|
||||||
if (!MATCH(expr, pat)) {
|
|
||||||
ir_read_error(st, expr, "expected (var_ref <variable name>)");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ir_variable *var = st->symbols->get_variable(var_name->value());
|
|
||||||
if (var == NULL) {
|
|
||||||
ir_read_error(st, expr, "undeclared variable: %s", var_name->value());
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new(ctx) ir_dereference_variable(var);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ir_dereference_array *
|
|
||||||
read_array_ref(_mesa_glsl_parse_state *st, s_expression *expr)
|
|
||||||
{
|
|
||||||
void *ctx = st;
|
|
||||||
s_expression *subj_expr;
|
|
||||||
s_expression *idx_expr;
|
|
||||||
|
|
||||||
s_pattern pat[] = { "array_ref", subj_expr, idx_expr };
|
|
||||||
if (!MATCH(expr, pat)) {
|
|
||||||
ir_read_error(st, expr, "expected (array_ref <rvalue> <index>)");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ir_rvalue *subject = read_rvalue(st, subj_expr);
|
|
||||||
if (subject == NULL) {
|
|
||||||
ir_read_error(st, NULL, "when reading the subject of an array_ref");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ir_rvalue *idx = read_rvalue(st, idx_expr);
|
|
||||||
return new(ctx) ir_dereference_array(subject, idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ir_dereference_record *
|
|
||||||
read_record_ref(_mesa_glsl_parse_state *st, s_expression *expr)
|
|
||||||
{
|
|
||||||
void *ctx = st;
|
|
||||||
s_expression *subj_expr;
|
|
||||||
s_symbol *field;
|
|
||||||
|
|
||||||
s_pattern pat[] = { "record_ref", subj_expr, field };
|
|
||||||
if (!MATCH(expr, pat)) {
|
|
||||||
ir_read_error(st, expr, "expected (record_ref <rvalue> <field>)");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ir_rvalue *subject = read_rvalue(st, subj_expr);
|
|
||||||
if (subject == NULL) {
|
|
||||||
ir_read_error(st, NULL, "when reading the subject of a record_ref");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return new(ctx) ir_dereference_record(subject, field->value());
|
|
||||||
}
|
|
||||||
|
|
||||||
static ir_texture *
|
static ir_texture *
|
||||||
read_texture(_mesa_glsl_parse_state *st, s_expression *expr)
|
read_texture(_mesa_glsl_parse_state *st, s_expression *expr)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue