For the sake of simplicity and clarity, especially in the interest of allowing us to have expressions with larger numbers of terms.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- In specific, it is my plan to encode e.g. SampleGrad as HLSL_OP6_SAMPLE_GRAD.
libs/vkd3d-shader/hlsl.c | 92 ++++++++++++++-------------- libs/vkd3d-shader/hlsl.h | 101 ++++++++++++++----------------- libs/vkd3d-shader/hlsl.y | 55 +++++++++-------- libs/vkd3d-shader/hlsl_codegen.c | 20 +++--- libs/vkd3d-shader/hlsl_sm1.c | 20 +++--- 5 files changed, 138 insertions(+), 150 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index 9f50d2fc..62dc535d 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -439,7 +439,7 @@ struct hlsl_ir_expr *hlsl_new_cast(struct hlsl_ctx *ctx, struct hlsl_ir_node *no { struct hlsl_ir_node *cast;
- cast = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_CAST, node, *loc); + cast = hlsl_new_unary_expr(ctx, HLSL_OP1_CAST, node, *loc); if (cast) cast->data_type = type; return hlsl_ir_expr(cast); @@ -1035,51 +1035,51 @@ static const char *debug_expr_op(const struct hlsl_ir_expr *expr) { static const char *const op_names[] = { - [HLSL_IR_UNOP_ABS] = "abs", - [HLSL_IR_UNOP_BIT_NOT] = "~", - [HLSL_IR_UNOP_CAST] = "cast", - [HLSL_IR_UNOP_COS] = "cos", - [HLSL_IR_UNOP_COS_REDUCED] = "cos_reduced", - [HLSL_IR_UNOP_DSX] = "dsx", - [HLSL_IR_UNOP_DSY] = "dsy", - [HLSL_IR_UNOP_EXP2] = "exp2", - [HLSL_IR_UNOP_FRACT] = "fract", - [HLSL_IR_UNOP_LOG2] = "log2", - [HLSL_IR_UNOP_LOGIC_NOT] = "!", - [HLSL_IR_UNOP_NEG] = "-", - [HLSL_IR_UNOP_NRM] = "nrm", - [HLSL_IR_UNOP_RCP] = "rcp", - [HLSL_IR_UNOP_RSQ] = "rsq", - [HLSL_IR_UNOP_SAT] = "sat", - [HLSL_IR_UNOP_SIGN] = "sign", - [HLSL_IR_UNOP_SIN] = "sin", - [HLSL_IR_UNOP_SIN_REDUCED] = "sin_reduced", - [HLSL_IR_UNOP_SQRT] = "sqrt", - - [HLSL_IR_BINOP_ADD] = "+", - [HLSL_IR_BINOP_BIT_AND] = "&", - [HLSL_IR_BINOP_BIT_OR] = "|", - [HLSL_IR_BINOP_BIT_XOR] = "^", - [HLSL_IR_BINOP_CRS] = "crs", - [HLSL_IR_BINOP_DIV] = "/", - [HLSL_IR_BINOP_DOT] = "dot", - [HLSL_IR_BINOP_EQUAL] = "==", - [HLSL_IR_BINOP_GEQUAL] = ">=", - [HLSL_IR_BINOP_GREATER] = ">", - [HLSL_IR_BINOP_LEQUAL] = "<=", - [HLSL_IR_BINOP_LESS] = "<", - [HLSL_IR_BINOP_LOGIC_AND] = "&&", - [HLSL_IR_BINOP_LOGIC_OR] = "||", - [HLSL_IR_BINOP_LSHIFT] = "<<", - [HLSL_IR_BINOP_MAX] = "max", - [HLSL_IR_BINOP_MIN] = "min", - [HLSL_IR_BINOP_MOD] = "%", - [HLSL_IR_BINOP_MUL] = "*", - [HLSL_IR_BINOP_NEQUAL] = "!=", - [HLSL_IR_BINOP_POW] = "pow", - [HLSL_IR_BINOP_RSHIFT] = ">>", - - [HLSL_IR_TEROP_LERP] = "lerp", + [HLSL_OP1_ABS] = "abs", + [HLSL_OP1_BIT_NOT] = "~", + [HLSL_OP1_CAST] = "cast", + [HLSL_OP1_COS] = "cos", + [HLSL_OP1_COS_REDUCED] = "cos_reduced", + [HLSL_OP1_DSX] = "dsx", + [HLSL_OP1_DSY] = "dsy", + [HLSL_OP1_EXP2] = "exp2", + [HLSL_OP1_FRACT] = "fract", + [HLSL_OP1_LOG2] = "log2", + [HLSL_OP1_LOGIC_NOT] = "!", + [HLSL_OP1_NEG] = "-", + [HLSL_OP1_NRM] = "nrm", + [HLSL_OP1_RCP] = "rcp", + [HLSL_OP1_RSQ] = "rsq", + [HLSL_OP1_SAT] = "sat", + [HLSL_OP1_SIGN] = "sign", + [HLSL_OP1_SIN] = "sin", + [HLSL_OP1_SIN_REDUCED] = "sin_reduced", + [HLSL_OP1_SQRT] = "sqrt", + + [HLSL_OP2_ADD] = "+", + [HLSL_OP2_BIT_AND] = "&", + [HLSL_OP2_BIT_OR] = "|", + [HLSL_OP2_BIT_XOR] = "^", + [HLSL_OP2_CRS] = "crs", + [HLSL_OP2_DIV] = "/", + [HLSL_OP2_DOT] = "dot", + [HLSL_OP2_EQUAL] = "==", + [HLSL_OP2_GEQUAL] = ">=", + [HLSL_OP2_GREATER] = ">", + [HLSL_OP2_LEQUAL] = "<=", + [HLSL_OP2_LESS] = "<", + [HLSL_OP2_LOGIC_AND] = "&&", + [HLSL_OP2_LOGIC_OR] = "||", + [HLSL_OP2_LSHIFT] = "<<", + [HLSL_OP2_MAX] = "max", + [HLSL_OP2_MIN] = "min", + [HLSL_OP2_MOD] = "%", + [HLSL_OP2_MUL] = "*", + [HLSL_OP2_NEQUAL] = "!=", + [HLSL_OP2_POW] = "pow", + [HLSL_OP2_RSHIFT] = ">>", + + [HLSL_OP3_LERP] = "lerp", };
return op_names[expr->op]; diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index 3b0e5207..4a4af5d1 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -275,62 +275,51 @@ struct hlsl_ir_loop
enum hlsl_ir_expr_op { - HLSL_IR_UNOP_BIT_NOT = 0, - HLSL_IR_UNOP_LOGIC_NOT, - HLSL_IR_UNOP_NEG, - HLSL_IR_UNOP_ABS, - HLSL_IR_UNOP_SIGN, - HLSL_IR_UNOP_RCP, - HLSL_IR_UNOP_RSQ, - HLSL_IR_UNOP_SQRT, - HLSL_IR_UNOP_NRM, - HLSL_IR_UNOP_EXP2, - HLSL_IR_UNOP_LOG2, - - HLSL_IR_UNOP_CAST, - - HLSL_IR_UNOP_FRACT, - - HLSL_IR_UNOP_SIN, - HLSL_IR_UNOP_COS, - HLSL_IR_UNOP_SIN_REDUCED, /* Reduced range [-pi, pi] */ - HLSL_IR_UNOP_COS_REDUCED, /* Reduced range [-pi, pi] */ - - HLSL_IR_UNOP_DSX, - HLSL_IR_UNOP_DSY, - - HLSL_IR_UNOP_SAT, - - HLSL_IR_BINOP_ADD, - HLSL_IR_BINOP_MUL, - HLSL_IR_BINOP_DIV, - - HLSL_IR_BINOP_MOD, - - HLSL_IR_BINOP_LESS, - HLSL_IR_BINOP_GREATER, - HLSL_IR_BINOP_LEQUAL, - HLSL_IR_BINOP_GEQUAL, - HLSL_IR_BINOP_EQUAL, - HLSL_IR_BINOP_NEQUAL, - - HLSL_IR_BINOP_LOGIC_AND, - HLSL_IR_BINOP_LOGIC_OR, - - HLSL_IR_BINOP_LSHIFT, - HLSL_IR_BINOP_RSHIFT, - HLSL_IR_BINOP_BIT_AND, - HLSL_IR_BINOP_BIT_OR, - HLSL_IR_BINOP_BIT_XOR, - - HLSL_IR_BINOP_DOT, - HLSL_IR_BINOP_CRS, - HLSL_IR_BINOP_MIN, - HLSL_IR_BINOP_MAX, - - HLSL_IR_BINOP_POW, - - HLSL_IR_TEROP_LERP, + HLSL_OP1_ABS, + HLSL_OP1_BIT_NOT, + HLSL_OP1_CAST, + HLSL_OP1_COS, + HLSL_OP1_COS_REDUCED, /* Reduced range [-pi, pi] */ + HLSL_OP1_DSX, + HLSL_OP1_DSY, + HLSL_OP1_EXP2, + HLSL_OP1_FRACT, + HLSL_OP1_LOG2, + HLSL_OP1_LOGIC_NOT, + HLSL_OP1_NEG, + HLSL_OP1_NRM, + HLSL_OP1_RCP, + HLSL_OP1_RSQ, + HLSL_OP1_SAT, + HLSL_OP1_SIGN, + HLSL_OP1_SIN, + HLSL_OP1_SIN_REDUCED, /* Reduced range [-pi, pi] */ + HLSL_OP1_SQRT, + + HLSL_OP2_ADD, + HLSL_OP2_BIT_AND, + HLSL_OP2_BIT_OR, + HLSL_OP2_BIT_XOR, + HLSL_OP2_CRS, + HLSL_OP2_DIV, + HLSL_OP2_DOT, + HLSL_OP2_EQUAL, + HLSL_OP2_GEQUAL, + HLSL_OP2_GREATER, + HLSL_OP2_LEQUAL, + HLSL_OP2_LESS, + HLSL_OP2_LOGIC_AND, + HLSL_OP2_LOGIC_OR, + HLSL_OP2_LSHIFT, + HLSL_OP2_MAX, + HLSL_OP2_MIN, + HLSL_OP2_MOD, + HLSL_OP2_MUL, + HLSL_OP2_NEQUAL, + HLSL_OP2_POW, + HLSL_OP2_RSHIFT, + + HLSL_OP3_LERP, };
struct hlsl_ir_expr diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 2754514d..ade78da6 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -324,7 +324,7 @@ static bool append_conditional_break(struct hlsl_ctx *ctx, struct list *cond_lis return true;
condition = node_from_list(cond_list); - if (!(not = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_LOGIC_NOT, condition, condition->loc))) + if (!(not = hlsl_new_unary_expr(ctx, HLSL_OP1_LOGIC_NOT, condition, condition->loc))) return false; list_add_tail(cond_list, ¬->entry);
@@ -535,7 +535,7 @@ static struct hlsl_ir_load *add_load(struct hlsl_ctx *ctx, struct list *instrs, var = src->var; if (src->offset.node) { - if (!(add = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_ADD, src->offset.node, offset))) + if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, src->offset.node, offset))) return NULL; list_add_tail(instrs, &add->entry); offset = add; @@ -604,7 +604,7 @@ static struct hlsl_ir_load *add_array_load(struct hlsl_ctx *ctx, struct list *in if (!(c = hlsl_new_uint_constant(ctx, data_type->reg_size, loc))) return NULL; list_add_tail(instrs, &c->node.entry); - if (!(mul = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_MUL, index, &c->node))) + if (!(mul = hlsl_new_binary_expr(ctx, HLSL_OP2_MUL, index, &c->node))) return NULL; list_add_tail(instrs, &mul->entry); index = mul; @@ -1117,16 +1117,16 @@ static enum hlsl_ir_expr_op op_from_assignment(enum parse_assign_op op) static const enum hlsl_ir_expr_op ops[] = { 0, - HLSL_IR_BINOP_ADD, + HLSL_OP2_ADD, 0, - HLSL_IR_BINOP_MUL, - HLSL_IR_BINOP_DIV, - HLSL_IR_BINOP_MOD, - HLSL_IR_BINOP_LSHIFT, - HLSL_IR_BINOP_RSHIFT, - HLSL_IR_BINOP_BIT_AND, - HLSL_IR_BINOP_BIT_OR, - HLSL_IR_BINOP_BIT_XOR, + HLSL_OP2_MUL, + HLSL_OP2_DIV, + HLSL_OP2_MOD, + HLSL_OP2_LSHIFT, + HLSL_OP2_RSHIFT, + HLSL_OP2_BIT_AND, + HLSL_OP2_BIT_OR, + HLSL_OP2_BIT_XOR, };
return ops[op]; @@ -1181,7 +1181,7 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in struct hlsl_ir_node *args[3] = {rhs}; struct hlsl_ir_expr *expr;
- if (!(expr = add_expr(ctx, instrs, HLSL_IR_UNOP_NEG, args, &rhs->loc))) + if (!(expr = add_expr(ctx, instrs, HLSL_OP1_NEG, args, &rhs->loc))) return NULL; rhs = &expr->node; assign_op = ASSIGN_OP_ADD; @@ -1211,7 +1211,7 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in
while (lhs->type != HLSL_IR_LOAD) { - if (lhs->type == HLSL_IR_EXPR && hlsl_ir_expr(lhs)->op == HLSL_IR_UNOP_CAST) + if (lhs->type == HLSL_IR_EXPR && hlsl_ir_expr(lhs)->op == HLSL_OP1_CAST) { FIXME("Cast on the lhs.\n"); vkd3d_free(store); @@ -2835,8 +2835,7 @@ unary_expr: } | unary_op unary_expr { - enum hlsl_ir_expr_op ops[] = {0, HLSL_IR_UNOP_NEG, - HLSL_IR_UNOP_LOGIC_NOT, HLSL_IR_UNOP_BIT_NOT}; + static const enum hlsl_ir_expr_op ops[] = {0, HLSL_OP1_NEG, HLSL_OP1_LOGIC_NOT, HLSL_OP1_BIT_NOT};
if ($1 == UNARY_OP_PLUS) $$ = $2; @@ -2901,31 +2900,31 @@ mul_expr: unary_expr | mul_expr '*' unary_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_MUL, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_MUL, @2); } | mul_expr '/' unary_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_DIV, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_DIV, @2); } | mul_expr '%' unary_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_MOD, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_MOD, @2); }
add_expr: mul_expr | add_expr '+' mul_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_ADD, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_ADD, @2); } | add_expr '-' mul_expr { struct hlsl_ir_node *neg;
- if (!(neg = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_NEG, node_from_list($3), @2))) + if (!(neg = hlsl_new_unary_expr(ctx, HLSL_OP1_NEG, node_from_list($3), @2))) YYABORT; list_add_tail($3, &neg->entry); - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_ADD, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_ADD, @2); }
shift_expr: @@ -2943,30 +2942,30 @@ relational_expr: shift_expr | relational_expr '<' shift_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_LESS, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_LESS, @2); } | relational_expr '>' shift_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_GREATER, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_GREATER, @2); } | relational_expr OP_LE shift_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_LEQUAL, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_LEQUAL, @2); } | relational_expr OP_GE shift_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_GEQUAL, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_GEQUAL, @2); }
equality_expr: relational_expr | equality_expr OP_EQ relational_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_EQUAL, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_EQUAL, @2); } | equality_expr OP_NE relational_expr { - $$ = add_binary_expr(ctx, $1, $3, HLSL_IR_BINOP_NEQUAL, @2); + $$ = add_binary_expr(ctx, $1, $3, HLSL_OP2_NEQUAL, @2); }
bitand_expr: diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 549636ca..5f23f345 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -250,7 +250,7 @@ static bool fold_redundant_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *inst const struct hlsl_type *src_type = expr->operands[0].node->data_type; const struct hlsl_type *dst_type = expr->node.data_type;
- if (expr->op != HLSL_IR_UNOP_CAST) + if (expr->op != HLSL_OP1_CAST) return false;
if (hlsl_types_are_equal(src_type, dst_type) @@ -297,7 +297,7 @@ static bool split_struct_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr offset = &c->node; if (rhs_load->src.offset.node) { - if (!(add = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_ADD, rhs_load->src.offset.node, &c->node))) + if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, rhs_load->src.offset.node, &c->node))) return false; list_add_before(&instr->entry, &add->entry); offset = add; @@ -309,7 +309,7 @@ static bool split_struct_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr offset = &c->node; if (store->lhs.offset.node) { - if (!(add = hlsl_new_binary_expr(ctx, HLSL_IR_BINOP_ADD, store->lhs.offset.node, &c->node))) + if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, store->lhs.offset.node, &c->node))) return false; list_add_before(&instr->entry, &add->entry); offset = add; @@ -358,7 +358,7 @@ static bool fold_constants(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi { switch (expr->op) { - case HLSL_IR_UNOP_CAST: + case HLSL_OP1_CAST: if (instr->data_type->dimx != arg1->node.data_type->dimx || instr->data_type->dimy != arg1->node.data_type->dimy) { @@ -400,17 +400,17 @@ static bool fold_constants(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi { switch (expr->op) { - case HLSL_IR_UNOP_NEG: + case HLSL_OP1_NEG: for (i = 0; i < instr->data_type->dimx; ++i) res->value.u[i] = -arg1->value.u[i]; break;
- case HLSL_IR_BINOP_ADD: + case HLSL_OP2_ADD: for (i = 0; i < instr->data_type->dimx; ++i) res->value.u[i] = arg1->value.u[i] + arg2->value.u[i]; break;
- case HLSL_IR_BINOP_MUL: + case HLSL_OP2_MUL: for (i = 0; i < instr->data_type->dimx; ++i) res->value.u[i] = arg1->value.u[i] * arg2->value.u[i]; break; @@ -443,13 +443,13 @@ static bool lower_division(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi if (instr->type != HLSL_IR_EXPR) return false; expr = hlsl_ir_expr(instr); - if (expr->op != HLSL_IR_BINOP_DIV) + if (expr->op != HLSL_OP2_DIV) return false;
- if (!(rcp = hlsl_new_unary_expr(ctx, HLSL_IR_UNOP_RCP, expr->operands[1].node, instr->loc))) + if (!(rcp = hlsl_new_unary_expr(ctx, HLSL_OP1_RCP, expr->operands[1].node, instr->loc))) return false; list_add_before(&expr->node.entry, &rcp->entry); - expr->op = HLSL_IR_BINOP_MUL; + expr->op = HLSL_OP2_MUL; hlsl_src_remove(&expr->operands[1]); hlsl_src_from_node(&expr->operands[1], rcp); return true; diff --git a/libs/vkd3d-shader/hlsl_sm1.c b/libs/vkd3d-shader/hlsl_sm1.c index 8ea663dc..85d54ac2 100644 --- a/libs/vkd3d-shader/hlsl_sm1.c +++ b/libs/vkd3d-shader/hlsl_sm1.c @@ -612,19 +612,11 @@ static void write_sm1_expr(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b
switch (expr->op) { - case HLSL_IR_BINOP_ADD: - write_sm1_binary_op(ctx, buffer, D3DSIO_ADD, &instr->reg, &arg1->reg, &arg2->reg); - break; - - case HLSL_IR_BINOP_MUL: - write_sm1_binary_op(ctx, buffer, D3DSIO_MUL, &instr->reg, &arg1->reg, &arg2->reg); - break; - - case HLSL_IR_UNOP_NEG: + case HLSL_OP1_NEG: write_sm1_unary_op(ctx, buffer, D3DSIO_MOV, &instr->reg, &arg1->reg, D3DSPSM_NEG); break;
- case HLSL_IR_UNOP_RCP: + case HLSL_OP1_RCP: for (i = 0; i < instr->data_type->dimx; ++i) { struct hlsl_reg src = arg1->reg, dst = instr->reg; @@ -635,6 +627,14 @@ static void write_sm1_expr(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b } break;
+ case HLSL_OP2_ADD: + write_sm1_binary_op(ctx, buffer, D3DSIO_ADD, &instr->reg, &arg1->reg, &arg2->reg); + break; + + case HLSL_OP2_MUL: + write_sm1_binary_op(ctx, buffer, D3DSIO_MUL, &instr->reg, &arg1->reg, &arg2->reg); + break; + default: FIXME("Unhandled op %u.\n", expr->op); break;