[qfcc] Implement incop for SPIR-V

I think I got it right, but it's hard to tell because my shaders use ++
only for the iterator of loops so the result is thrown away.
This commit is contained in:
Bill Currie 2025-01-11 14:39:43 +09:00
parent 270c57e46e
commit e9eae1c75f
2 changed files with 25 additions and 0 deletions

View file

@ -2203,6 +2203,7 @@ expr_incop (sblock_t *sblock, const expr_t *e, operand_t **op)
sblock = statement_single (sblock, assign);
sblock = statement_subexpr (sblock, tmp, op);
}
// binary_expr will take care of pointers
auto one = new_int_expr (1, false);
auto type = get_type (e->incop.expr);
if (is_scalar (type)) {

View file

@ -1669,6 +1669,29 @@ spirv_extend (const expr_t *e, spirvctx_t *ctx)
return id;
}
static unsigned
spirv_incop (const expr_t *e, spirvctx_t *ctx)
{
scoped_src_loc (e);
// binary_expr will take care of pointers (FIXME is this correct for
// spir-v?)
auto one = new_int_expr (1, false);
auto type = get_type (e->incop.expr);
if (is_scalar (type)) {
one = cast_expr (type, one);
}
auto dst = new_expr ();
*dst = *e->incop.expr;
dst->id = 0;
auto incop = binary_expr (e->incop.op, e->incop.expr, one);
unsigned inc_id = spirv_emit_expr (incop, ctx);
unsigned src_id = incop->expr.e1->id;
auto assign = assign_expr (dst, incop);
spirv_emit_expr (assign, ctx);
return e->incop.postop ? src_id : inc_id;
}
static unsigned
spirv_cond (const expr_t *e, spirvctx_t *ctx)
{
@ -1827,6 +1850,7 @@ spirv_emit_expr (const expr_t *e, spirvctx_t *ctx)
[ex_return] = spirv_return,
[ex_swizzle] = spirv_swizzle,
[ex_extend] = spirv_extend,
[ex_incop] = spirv_incop,
[ex_cond] = spirv_cond,
[ex_field] = spirv_field_array,
[ex_array] = spirv_field_array,