d3dcompiler: Add a helper to initialize the hlsl_ir_node structure.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
1028a5c15f
commit
2dc666c9df
|
@ -1077,6 +1077,14 @@ static inline struct hlsl_ir_node *node_from_list(struct list *list)
|
|||
return LIST_ENTRY(list_tail(list), struct hlsl_ir_node, entry);
|
||||
}
|
||||
|
||||
static inline void init_node(struct hlsl_ir_node *node, enum hlsl_ir_node_type type,
|
||||
struct hlsl_type *data_type, struct source_location loc)
|
||||
{
|
||||
node->type = type;
|
||||
node->data_type = data_type;
|
||||
node->loc = loc;
|
||||
}
|
||||
|
||||
BOOL add_declaration(struct hlsl_scope *scope, struct hlsl_ir_var *decl, BOOL local_var) DECLSPEC_HIDDEN;
|
||||
struct hlsl_ir_var *get_variable(struct hlsl_scope *scope, const char *name) DECLSPEC_HIDDEN;
|
||||
void free_declaration(struct hlsl_ir_var *decl) DECLSPEC_HIDDEN;
|
||||
|
@ -1096,8 +1104,6 @@ struct hlsl_ir_expr *new_cast(struct hlsl_ir_node *node, struct hlsl_type *type,
|
|||
struct source_location *loc) DECLSPEC_HIDDEN;
|
||||
struct hlsl_ir_node *implicit_conversion(struct hlsl_ir_node *node, struct hlsl_type *type,
|
||||
struct source_location *loc) DECLSPEC_HIDDEN;
|
||||
struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var) DECLSPEC_HIDDEN;
|
||||
struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_node *record, struct hlsl_struct_field *field) DECLSPEC_HIDDEN;
|
||||
struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *left, enum parse_assign_op assign_op,
|
||||
struct hlsl_ir_node *right) DECLSPEC_HIDDEN;
|
||||
void push_scope(struct hlsl_parse_ctx *ctx) DECLSPEC_HIDDEN;
|
||||
|
|
|
@ -277,7 +277,7 @@ static BOOL append_conditional_break(struct list *cond_list)
|
|||
ERR("Out of memory.\n");
|
||||
return FALSE;
|
||||
}
|
||||
iff->node.type = HLSL_IR_IF;
|
||||
init_node(&iff->node, HLSL_IR_IF, NULL, condition->loc);
|
||||
iff->condition = not;
|
||||
list_add_tail(cond_list, &iff->node.entry);
|
||||
|
||||
|
@ -293,7 +293,7 @@ static BOOL append_conditional_break(struct list *cond_list)
|
|||
ERR("Out of memory.\n");
|
||||
return FALSE;
|
||||
}
|
||||
jump->node.type = HLSL_IR_JUMP;
|
||||
init_node(&jump->node, HLSL_IR_JUMP, NULL, condition->loc);
|
||||
jump->type = HLSL_IR_JUMP_BREAK;
|
||||
list_add_head(iff->then_instrs, &jump->node.entry);
|
||||
return TRUE;
|
||||
|
@ -324,8 +324,7 @@ static struct list *create_loop(enum loop_type type, struct list *init, struct l
|
|||
loop = d3dcompiler_alloc(sizeof(*loop));
|
||||
if (!loop)
|
||||
goto oom;
|
||||
loop->node.type = HLSL_IR_LOOP;
|
||||
loop->node.loc = loc;
|
||||
init_node(&loop->node, HLSL_IR_LOOP, NULL, loc);
|
||||
list_add_tail(list, &loop->node.entry);
|
||||
loop->body = d3dcompiler_alloc(sizeof(*loop->body));
|
||||
if (!loop->body)
|
||||
|
@ -390,9 +389,8 @@ static struct hlsl_ir_swizzle *new_swizzle(DWORD s, unsigned int components,
|
|||
|
||||
if (!swizzle)
|
||||
return NULL;
|
||||
swizzle->node.type = HLSL_IR_SWIZZLE;
|
||||
swizzle->node.loc = *loc;
|
||||
swizzle->node.data_type = new_hlsl_type(NULL, HLSL_CLASS_VECTOR, val->data_type->base_type, components, 1);
|
||||
init_node(&swizzle->node, HLSL_IR_SWIZZLE,
|
||||
new_hlsl_type(NULL, HLSL_CLASS_VECTOR, val->data_type->base_type, components, 1), *loc);
|
||||
swizzle->val = val;
|
||||
swizzle->swizzle = s;
|
||||
return swizzle;
|
||||
|
@ -489,8 +487,7 @@ static struct hlsl_ir_jump *new_return(struct hlsl_ir_node *value, struct source
|
|||
ERR("Out of memory\n");
|
||||
return NULL;
|
||||
}
|
||||
jump->node.type = HLSL_IR_JUMP;
|
||||
jump->node.loc = loc;
|
||||
init_node(&jump->node, HLSL_IR_JUMP, NULL, loc);
|
||||
jump->type = HLSL_IR_JUMP_RETURN;
|
||||
if (value)
|
||||
{
|
||||
|
@ -510,6 +507,38 @@ static struct hlsl_ir_jump *new_return(struct hlsl_ir_node *value, struct source
|
|||
return jump;
|
||||
}
|
||||
|
||||
static struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var, const struct source_location loc)
|
||||
{
|
||||
struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));
|
||||
|
||||
if (!deref)
|
||||
{
|
||||
ERR("Out of memory.\n");
|
||||
return NULL;
|
||||
}
|
||||
init_node(&deref->node, HLSL_IR_DEREF, var->data_type, loc);
|
||||
deref->src.type = HLSL_IR_DEREF_VAR;
|
||||
deref->src.v.var = var;
|
||||
return deref;
|
||||
}
|
||||
|
||||
static struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_node *record,
|
||||
struct hlsl_struct_field *field, const struct source_location loc)
|
||||
{
|
||||
struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));
|
||||
|
||||
if (!deref)
|
||||
{
|
||||
ERR("Out of memory.\n");
|
||||
return NULL;
|
||||
}
|
||||
init_node(&deref->node, HLSL_IR_DEREF, field->type, loc);
|
||||
deref->src.type = HLSL_IR_DEREF_RECORD;
|
||||
deref->src.v.record.record = record;
|
||||
deref->src.v.record.field = field;
|
||||
return deref;
|
||||
}
|
||||
|
||||
static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var,
|
||||
struct parse_initializer *initializer)
|
||||
{
|
||||
|
@ -540,13 +569,12 @@ static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var,
|
|||
}
|
||||
if (components_count_type(field->type) == components_count_type(node->data_type))
|
||||
{
|
||||
deref = new_record_deref(&new_var_deref(var)->node, field);
|
||||
deref = new_record_deref(&new_var_deref(var, var->loc)->node, field, node->loc);
|
||||
if (!deref)
|
||||
{
|
||||
ERR("Out of memory.\n");
|
||||
break;
|
||||
}
|
||||
deref->node.loc = node->loc;
|
||||
list_add_tail(list, &deref->node.entry);
|
||||
assignment = make_assignment(&deref->node, ASSIGN_OP_ASSIGN, node);
|
||||
list_add_tail(list, &assignment->entry);
|
||||
|
@ -695,7 +723,7 @@ static struct list *declare_vars(struct hlsl_type *basic_type, DWORD modifiers,
|
|||
list_move_tail(statements_list, v->initializer.instrs);
|
||||
d3dcompiler_free(v->initializer.instrs);
|
||||
|
||||
deref = new_var_deref(var);
|
||||
deref = new_var_deref(var, var->loc);
|
||||
list_add_tail(statements_list, &deref->node.entry);
|
||||
assignment = make_assignment(&deref->node, ASSIGN_OP_ASSIGN, v->initializer.args[0]);
|
||||
d3dcompiler_free(v->initializer.args);
|
||||
|
@ -1982,8 +2010,7 @@ selection_statement: KW_IF '(' expr ')' if_body
|
|||
ERR("Out of memory\n");
|
||||
YYABORT;
|
||||
}
|
||||
instr->node.type = HLSL_IR_IF;
|
||||
instr->node.loc = get_location(&@1);
|
||||
init_node(&instr->node, HLSL_IR_IF, NULL, get_location(&@1));
|
||||
instr->condition = node_from_list($3);
|
||||
instr->then_instrs = $5.then_instrs;
|
||||
instr->else_instrs = $5.else_instrs;
|
||||
|
@ -2047,9 +2074,8 @@ primary_expr: C_FLOAT
|
|||
ERR("Out of memory.\n");
|
||||
YYABORT;
|
||||
}
|
||||
c->node.type = HLSL_IR_CONSTANT;
|
||||
c->node.loc = get_location(&@1);
|
||||
c->node.data_type = new_hlsl_type(d3dcompiler_strdup("float"), HLSL_CLASS_SCALAR, HLSL_TYPE_FLOAT, 1, 1);
|
||||
init_node(&c->node, HLSL_IR_CONSTANT, new_hlsl_type(d3dcompiler_strdup("float"),
|
||||
HLSL_CLASS_SCALAR, HLSL_TYPE_FLOAT, 1, 1), get_location(&@1));
|
||||
c->v.value.f[0] = $1;
|
||||
if (!($$ = make_list(&c->node)))
|
||||
YYABORT;
|
||||
|
@ -2062,9 +2088,8 @@ primary_expr: C_FLOAT
|
|||
ERR("Out of memory.\n");
|
||||
YYABORT;
|
||||
}
|
||||
c->node.type = HLSL_IR_CONSTANT;
|
||||
c->node.loc = get_location(&@1);
|
||||
c->node.data_type = new_hlsl_type(d3dcompiler_strdup("int"), HLSL_CLASS_SCALAR, HLSL_TYPE_INT, 1, 1);
|
||||
init_node(&c->node, HLSL_IR_CONSTANT, new_hlsl_type(d3dcompiler_strdup("int"),
|
||||
HLSL_CLASS_SCALAR, HLSL_TYPE_INT, 1, 1), get_location(&@1));
|
||||
c->v.value.i[0] = $1;
|
||||
if (!($$ = make_list(&c->node)))
|
||||
YYABORT;
|
||||
|
@ -2077,9 +2102,8 @@ primary_expr: C_FLOAT
|
|||
ERR("Out of memory.\n");
|
||||
YYABORT;
|
||||
}
|
||||
c->node.type = HLSL_IR_CONSTANT;
|
||||
c->node.loc = get_location(&@1);
|
||||
c->node.data_type = new_hlsl_type(d3dcompiler_strdup("bool"), HLSL_CLASS_SCALAR, HLSL_TYPE_BOOL, 1, 1);
|
||||
init_node(&c->node, HLSL_IR_CONSTANT, new_hlsl_type(d3dcompiler_strdup("bool"),
|
||||
HLSL_CLASS_SCALAR, HLSL_TYPE_BOOL, 1, 1), get_location(&@1));
|
||||
c->v.value.b[0] = $1;
|
||||
if (!($$ = make_list(&c->node)))
|
||||
YYABORT;
|
||||
|
@ -2096,9 +2120,8 @@ primary_expr: C_FLOAT
|
|||
set_parse_status(&hlsl_ctx.status, PARSE_ERR);
|
||||
YYABORT;
|
||||
}
|
||||
if ((deref = new_var_deref(var)))
|
||||
if ((deref = new_var_deref(var, get_location(&@1))))
|
||||
{
|
||||
deref->node.loc = get_location(&@1);
|
||||
if (!($$ = make_list(&deref->node)))
|
||||
YYABORT;
|
||||
}
|
||||
|
@ -2164,14 +2187,13 @@ postfix_expr: primary_expr
|
|||
{
|
||||
if (!strcmp($3, field->name))
|
||||
{
|
||||
struct hlsl_ir_deref *deref = new_record_deref(node, field);
|
||||
struct hlsl_ir_deref *deref = new_record_deref(node, field, loc);
|
||||
|
||||
if (!deref)
|
||||
{
|
||||
ERR("Out of memory\n");
|
||||
YYABORT;
|
||||
}
|
||||
deref->node.loc = loc;
|
||||
$$ = append_unop($1, &deref->node);
|
||||
break;
|
||||
}
|
||||
|
@ -2208,28 +2230,23 @@ postfix_expr: primary_expr
|
|||
/* This may be an array dereference or a vector/matrix
|
||||
* subcomponent access.
|
||||
* We store it as an array dereference in any case. */
|
||||
struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));
|
||||
struct hlsl_type *expr_type = node_from_list($1)->data_type;
|
||||
const struct hlsl_type *expr_type = node_from_list($1)->data_type;
|
||||
struct hlsl_ir_deref *deref;
|
||||
struct hlsl_type *data_type;
|
||||
|
||||
TRACE("Array dereference from type %s\n", debug_hlsl_type(expr_type));
|
||||
if (!deref)
|
||||
{
|
||||
ERR("Out of memory\n");
|
||||
YYABORT;
|
||||
}
|
||||
deref->node.type = HLSL_IR_DEREF;
|
||||
deref->node.loc = get_location(&@2);
|
||||
|
||||
if (expr_type->type == HLSL_CLASS_ARRAY)
|
||||
{
|
||||
deref->node.data_type = expr_type->e.array.type;
|
||||
data_type = expr_type->e.array.type;
|
||||
}
|
||||
else if (expr_type->type == HLSL_CLASS_MATRIX)
|
||||
{
|
||||
deref->node.data_type = new_hlsl_type(NULL, HLSL_CLASS_VECTOR, expr_type->base_type, expr_type->dimx, 1);
|
||||
data_type = new_hlsl_type(NULL, HLSL_CLASS_VECTOR, expr_type->base_type, expr_type->dimx, 1);
|
||||
}
|
||||
else if (expr_type->type == HLSL_CLASS_VECTOR)
|
||||
{
|
||||
deref->node.data_type = new_hlsl_type(NULL, HLSL_CLASS_SCALAR, expr_type->base_type, 1, 1);
|
||||
data_type = new_hlsl_type(NULL, HLSL_CLASS_SCALAR, expr_type->base_type, 1, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2237,19 +2254,26 @@ postfix_expr: primary_expr
|
|||
hlsl_report_message(get_location(&@2), HLSL_LEVEL_ERROR, "array-indexed expression is scalar");
|
||||
else
|
||||
hlsl_report_message(get_location(&@2), HLSL_LEVEL_ERROR, "expression is not array-indexable");
|
||||
d3dcompiler_free(deref);
|
||||
free_instr_list($1);
|
||||
free_instr_list($3);
|
||||
YYABORT;
|
||||
}
|
||||
|
||||
if (node_from_list($3)->data_type->type != HLSL_CLASS_SCALAR)
|
||||
{
|
||||
hlsl_report_message(get_location(&@3), HLSL_LEVEL_ERROR, "array index is not scalar");
|
||||
d3dcompiler_free(deref);
|
||||
free_instr_list($1);
|
||||
free_instr_list($3);
|
||||
YYABORT;
|
||||
}
|
||||
|
||||
if (!(deref = d3dcompiler_alloc(sizeof(*deref))))
|
||||
{
|
||||
free_instr_list($1);
|
||||
free_instr_list($3);
|
||||
YYABORT;
|
||||
}
|
||||
init_node(&deref->node, HLSL_IR_DEREF, data_type, get_location(&@2));
|
||||
deref->src.type = HLSL_IR_DEREF_ARRAY;
|
||||
deref->src.v.array.array = node_from_list($1);
|
||||
deref->src.v.array.index = node_from_list($3);
|
||||
|
@ -2287,9 +2311,7 @@ postfix_expr: primary_expr
|
|||
assert($4.args_count <= ARRAY_SIZE(constructor->args));
|
||||
|
||||
constructor = d3dcompiler_alloc(sizeof(*constructor));
|
||||
constructor->node.type = HLSL_IR_CONSTRUCTOR;
|
||||
constructor->node.loc = get_location(&@3);
|
||||
constructor->node.data_type = $2;
|
||||
init_node(&constructor->node, HLSL_IR_CONSTRUCTOR, $2, get_location(&@3));
|
||||
constructor->args_count = $4.args_count;
|
||||
memcpy(constructor->args, $4.args, $4.args_count * sizeof(*$4.args));
|
||||
d3dcompiler_free($4.args);
|
||||
|
|
|
@ -1327,17 +1327,10 @@ struct hlsl_ir_node *implicit_conversion(struct hlsl_ir_node *node, struct hlsl_
|
|||
struct hlsl_ir_expr *new_expr(enum hlsl_ir_expr_op op, struct hlsl_ir_node **operands,
|
||||
struct source_location *loc)
|
||||
{
|
||||
struct hlsl_ir_expr *expr = d3dcompiler_alloc(sizeof(*expr));
|
||||
struct hlsl_ir_expr *expr;
|
||||
struct hlsl_type *type;
|
||||
unsigned int i;
|
||||
|
||||
if (!expr)
|
||||
{
|
||||
ERR("Out of memory\n");
|
||||
return NULL;
|
||||
}
|
||||
expr->node.type = HLSL_IR_EXPR;
|
||||
expr->node.loc = *loc;
|
||||
type = operands[0]->data_type;
|
||||
for (i = 1; i <= 2; ++i)
|
||||
{
|
||||
|
@ -1345,11 +1338,8 @@ struct hlsl_ir_expr *new_expr(enum hlsl_ir_expr_op op, struct hlsl_ir_node **ope
|
|||
break;
|
||||
type = expr_common_type(type, operands[i]->data_type, loc);
|
||||
if (!type)
|
||||
{
|
||||
d3dcompiler_free(expr);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
for (i = 0; i <= 2; ++i)
|
||||
{
|
||||
struct hlsl_ir_expr *cast;
|
||||
|
@ -1366,14 +1356,14 @@ struct hlsl_ir_expr *new_expr(enum hlsl_ir_expr_op op, struct hlsl_ir_node **ope
|
|||
}
|
||||
|
||||
if (!(cast = new_cast(operands[i], type, &operands[i]->loc)))
|
||||
{
|
||||
d3dcompiler_free(expr);
|
||||
return NULL;
|
||||
}
|
||||
list_add_after(&operands[i]->entry, &cast->node.entry);
|
||||
operands[i] = &cast->node;
|
||||
}
|
||||
expr->node.data_type = type;
|
||||
|
||||
if (!(expr = d3dcompiler_alloc(sizeof(*expr))))
|
||||
return NULL;
|
||||
init_node(&expr->node, HLSL_IR_EXPR, type, *loc);
|
||||
expr->op = op;
|
||||
expr->operands[0] = operands[0];
|
||||
expr->operands[1] = operands[1];
|
||||
|
@ -1393,39 +1383,6 @@ struct hlsl_ir_expr *new_cast(struct hlsl_ir_node *node, struct hlsl_type *type,
|
|||
return expr_from_node(cast);
|
||||
}
|
||||
|
||||
struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var)
|
||||
{
|
||||
struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));
|
||||
|
||||
if (!deref)
|
||||
{
|
||||
ERR("Out of memory.\n");
|
||||
return NULL;
|
||||
}
|
||||
deref->node.type = HLSL_IR_DEREF;
|
||||
deref->node.data_type = var->data_type;
|
||||
deref->src.type = HLSL_IR_DEREF_VAR;
|
||||
deref->src.v.var = var;
|
||||
return deref;
|
||||
}
|
||||
|
||||
struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_node *record, struct hlsl_struct_field *field)
|
||||
{
|
||||
struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));
|
||||
|
||||
if (!deref)
|
||||
{
|
||||
ERR("Out of memory.\n");
|
||||
return NULL;
|
||||
}
|
||||
deref->node.type = HLSL_IR_DEREF;
|
||||
deref->node.data_type = field->type;
|
||||
deref->src.type = HLSL_IR_DEREF_RECORD;
|
||||
deref->src.v.record.record = record;
|
||||
deref->src.v.record.field = field;
|
||||
return deref;
|
||||
}
|
||||
|
||||
static enum hlsl_ir_expr_op op_from_assignment(enum parse_assign_op op)
|
||||
{
|
||||
static const enum hlsl_ir_expr_op ops[] =
|
||||
|
@ -1593,9 +1550,8 @@ struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *lhs, enum parse_assign
|
|||
type_class = lhs->data_type->type;
|
||||
type = new_hlsl_type(NULL, type_class, lhs->data_type->base_type, dimx, 1);
|
||||
}
|
||||
assign->node.type = HLSL_IR_ASSIGNMENT;
|
||||
assign->node.loc = lhs->loc;
|
||||
assign->node.data_type = type;
|
||||
|
||||
init_node(&assign->node, HLSL_IR_ASSIGNMENT, type, lhs->loc);
|
||||
assign->writemask = writemask;
|
||||
|
||||
rhs = implicit_conversion(rhs, type, &rhs->loc);
|
||||
|
|
Loading…
Reference in New Issue