From a0549820fd86ad7355d61ae31e64a0452166d779 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Wed, 29 Jul 2020 23:25:16 +0900 Subject: [PATCH] shadeir: Add array composite literals Updates #1235 --- internal/shader/expr.go | 53 ++++++++++++++++++++++ internal/shader/testdata/array.expected.vs | 10 ++++ internal/shader/testdata/array.go | 5 ++ 3 files changed, 68 insertions(+) diff --git a/internal/shader/expr.go b/internal/shader/expr.go index b0f781ee9..484769b06 100644 --- a/internal/shader/expr.go +++ b/internal/shader/expr.go @@ -446,6 +446,59 @@ func (cs *compileState) parseExpr(block *block, expr ast.Expr) ([]shaderir.Expr, Exprs: exprs, }, }, t, stmts, true + + case *ast.CompositeLit: + t, ok := cs.parseType(block, e.Type) + if !ok { + return nil, nil, nil, false + } + fmt.Println(t) + + idx := len(block.vars) + block.vars = append(block.vars, variable{ + typ: t, + }) + + var stmts []shaderir.Stmt + for i, e := range e.Elts { + exprs, _, ss, ok := cs.parseExpr(block, e) + if !ok { + return nil, nil, nil, false + } + if len(exprs) != 1 { + cs.addError(e.Pos(), fmt.Sprintf("multiple-value context is not available at a composite literal")) + return nil, nil, nil, false + } + stmts = append(stmts, ss...) + stmts = append(stmts, shaderir.Stmt{ + Type: shaderir.Assign, + Exprs: []shaderir.Expr{ + { + Type: shaderir.Index, + Exprs: []shaderir.Expr{ + { + Type: shaderir.LocalVariable, + Index: idx, + }, + { + Type: shaderir.NumberExpr, + Const: gconstant.MakeInt64(int64(i)), + ConstType: shaderir.ConstTypeInt, + }, + }, + }, + exprs[0], + }, + }) + } + + return []shaderir.Expr{ + { + Type: shaderir.LocalVariable, + Index: idx, + }, + }, []shaderir.Type{t}, stmts, true + default: cs.addError(e.Pos(), fmt.Sprintf("expression not implemented: %#v", e)) } diff --git a/internal/shader/testdata/array.expected.vs b/internal/shader/testdata/array.expected.vs index 6f15a3a04..1cc55a604 100644 --- a/internal/shader/testdata/array.expected.vs +++ b/internal/shader/testdata/array.expected.vs @@ -1,9 +1,19 @@ uniform vec2[4] U0; void F0(out vec2[2] l0); +void F1(out vec2[2] l0); void F0(out vec2[2] l0) { vec2[2] l1 = vec2[2](vec2(0), vec2(0)); l0 = l1; return; } + +void F1(out vec2[2] l0) { + vec2[2] l1 = vec2[2](vec2(0), vec2(0)); + vec2[2] l2 = vec2[2](vec2(0), vec2(0)); + (l1)[0] = vec2(1.0); + l2 = l1; + l0 = l2; + return; +} diff --git a/internal/shader/testdata/array.go b/internal/shader/testdata/array.go index c9d411e5b..76ef502ed 100644 --- a/internal/shader/testdata/array.go +++ b/internal/shader/testdata/array.go @@ -6,3 +6,8 @@ func Foo() [2]vec2 { var x [2]vec2 return x } + +func Bar() [2]vec2 { + x := [2]vec2{vec2(1)} + return x +}