shaderir: Add a test for nested function calls

This commit is contained in:
Hajime Hoshi 2020-06-08 02:19:37 +09:00
parent 399bb93044
commit acba49952c
2 changed files with 40 additions and 0 deletions

View File

@ -616,6 +616,20 @@ func (cs *compileState) parseBlock(outer *block, b *ast.BlockStmt, inParams, out
block.ir.Stmts = append(block.ir.Stmts, shaderir.Stmt{
Type: shaderir.Return,
})
case *ast.ExprStmt:
exprs, stmts := cs.parseExpr(block, l.X)
block.ir.Stmts = append(block.ir.Stmts, stmts...)
for _, expr := range exprs {
if expr.Type != shaderir.Call {
continue
}
block.ir.Stmts = append(block.ir.Stmts, shaderir.Stmt{
Type: shaderir.ExprStmt,
Exprs: []shaderir.Expr{expr},
})
}
default:
cs.addError(l.Pos(), fmt.Sprintf("unexpected statement: %#v", l))
}
}

View File

@ -236,6 +236,32 @@ void F1(in float l0, out float l1, out float l2) {
l1 = l0;
l2 = l0;
return;
}`,
},
{
Name: "call multiple out params nested",
Src: `package main
func Foo(x vec2) {
Bar(Bar(x.x, x.y))
}
func Bar(x, y float) (float, float) {
return x, y
}`,
VS: `void F0(in vec2 l0) {
float l1 = 0.0;
float l2 = 0.0;
float l3 = 0.0;
float l4 = 0.0;
F1((l0).x, (l0).y, l1, l2);
F1(l1, l2, l3, l4);
}
void F1(in float l0, in float l1, out float l2, out float l3) {
l2 = l0;
l3 = l1;
return;
}`,
},
{