mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
shader: Reduce the calls of parseExpr so that unneeded variables are reduced
This commit is contained in:
parent
ac9bb92885
commit
afc39a100c
@ -365,44 +365,70 @@ func (s *compileState) parseVariable(block *block, vs *ast.ValueSpec) ([]variabl
|
|||||||
stmts []shaderir.Stmt
|
stmts []shaderir.Stmt
|
||||||
)
|
)
|
||||||
|
|
||||||
for i, n := range vs.Names {
|
// These variables are used only in multiple-value context.
|
||||||
// TODO: Reduce calls of parseExpr
|
var inittypes []shaderir.Type
|
||||||
|
var initexprs []shaderir.Expr
|
||||||
|
|
||||||
var init ast.Expr
|
for i, n := range vs.Names {
|
||||||
t := declt
|
t := declt
|
||||||
switch len(vs.Values) {
|
switch {
|
||||||
case 0:
|
case len(vs.Values) == 0:
|
||||||
case 1:
|
// No initialization
|
||||||
init = vs.Values[0]
|
|
||||||
if t.Main == shaderir.None {
|
case len(vs.Names) == len(vs.Values):
|
||||||
ts, ok := s.functionReturnTypes(block, init)
|
// Single-value context
|
||||||
if !ok {
|
|
||||||
_, ts, _, ok = s.parseExpr(block, init)
|
init := vs.Values[i]
|
||||||
|
|
||||||
|
es, origts, ss, ok := s.parseExpr(block, init)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, nil, nil, false
|
return nil, nil, nil, false
|
||||||
}
|
}
|
||||||
}
|
inits = append(inits, es...)
|
||||||
if len(ts) != len(vs.Names) {
|
stmts = append(stmts, ss...)
|
||||||
s.addError(vs.Pos(), fmt.Sprintf("the numbers of lhs and rhs don't match"))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
t = ts[i]
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
init = vs.Values[i]
|
|
||||||
if t.Main == shaderir.None {
|
if t.Main == shaderir.None {
|
||||||
ts, ok := s.functionReturnTypes(block, init)
|
ts, ok := s.functionReturnTypes(block, init)
|
||||||
if !ok {
|
if !ok {
|
||||||
_, ts, _, ok = s.parseExpr(block, init)
|
ts = origts
|
||||||
if !ok {
|
|
||||||
return nil, nil, nil, false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if len(ts) > 1 {
|
if len(ts) > 1 {
|
||||||
s.addError(vs.Pos(), fmt.Sprintf("the numbers of lhs and rhs don't match"))
|
s.addError(vs.Pos(), fmt.Sprintf("the numbers of lhs and rhs don't match"))
|
||||||
}
|
}
|
||||||
t = ts[0]
|
t = ts[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Multiple-value context
|
||||||
|
|
||||||
|
if i == 0 {
|
||||||
|
init := vs.Values[0]
|
||||||
|
|
||||||
|
var ss []shaderir.Stmt
|
||||||
|
var ok bool
|
||||||
|
initexprs, inittypes, ss, ok = s.parseExpr(block, init)
|
||||||
|
if !ok {
|
||||||
|
return nil, nil, nil, false
|
||||||
|
}
|
||||||
|
stmts = append(stmts, ss...)
|
||||||
|
|
||||||
|
if t.Main == shaderir.None {
|
||||||
|
ts, ok := s.functionReturnTypes(block, init)
|
||||||
|
if ok {
|
||||||
|
inittypes = ts
|
||||||
|
}
|
||||||
|
if len(ts) != len(vs.Names) {
|
||||||
|
s.addError(vs.Pos(), fmt.Sprintf("the numbers of lhs and rhs don't match"))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(inittypes) > 0 {
|
||||||
|
t = inittypes[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the same initexprs for each variable.
|
||||||
|
inits = append(inits, initexprs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
name := n.Name
|
name := n.Name
|
||||||
@ -410,20 +436,6 @@ func (s *compileState) parseVariable(block *block, vs *ast.ValueSpec) ([]variabl
|
|||||||
name: name,
|
name: name,
|
||||||
typ: t,
|
typ: t,
|
||||||
})
|
})
|
||||||
|
|
||||||
if len(vs.Values) > 1 || (len(vs.Values) == 1 && len(inits) == 0) {
|
|
||||||
es, _, ss, ok := s.parseExpr(block, init)
|
|
||||||
if !ok {
|
|
||||||
return nil, nil, nil, false
|
|
||||||
}
|
|
||||||
inits = append(inits, es...)
|
|
||||||
stmts = append(stmts, ss...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(inits) > 0 && len(vars) != len(inits) {
|
|
||||||
s.addError(vs.Pos(), fmt.Sprintf("single-value context and multiple-value context cannot be mixed"))
|
|
||||||
return nil, nil, nil, false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return vars, inits, stmts, true
|
return vars, inits, stmts, true
|
||||||
|
43
internal/shader/testdata/number.expected.vs
vendored
Normal file
43
internal/shader/testdata/number.expected.vs
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
void F0(out vec2 l0) {
|
||||||
|
float l1 = float(0);
|
||||||
|
int l2 = 0;
|
||||||
|
float l3 = float(0);
|
||||||
|
int l4 = 0;
|
||||||
|
float l5 = float(0);
|
||||||
|
float l6 = float(0);
|
||||||
|
F2(l1);
|
||||||
|
F3(l2);
|
||||||
|
l3 = (l1) * (l2);
|
||||||
|
F3(l4);
|
||||||
|
F2(l5);
|
||||||
|
l6 = (l4) * (l5);
|
||||||
|
l0 = vec2(l3, l6);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void F1(out vec2 l0) {
|
||||||
|
float l1 = float(0);
|
||||||
|
int l2 = 0;
|
||||||
|
float l3 = float(0);
|
||||||
|
int l4 = 0;
|
||||||
|
float l5 = float(0);
|
||||||
|
float l6 = float(0);
|
||||||
|
F2(l1);
|
||||||
|
F3(l2);
|
||||||
|
l3 = (l1) * (l2);
|
||||||
|
F3(l4);
|
||||||
|
F2(l5);
|
||||||
|
l6 = (l4) * (l5);
|
||||||
|
l0 = vec2(l3, l6);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void F2(out float l0) {
|
||||||
|
l0 = 1.0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void F3(out int l0) {
|
||||||
|
l0 = 1.0;
|
||||||
|
return;
|
||||||
|
}
|
21
internal/shader/testdata/number.go
vendored
Normal file
21
internal/shader/testdata/number.go
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func Foo() vec2 {
|
||||||
|
x := Float() * Int()
|
||||||
|
y := Int() * Float()
|
||||||
|
return vec2(x, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Foo2() vec2 {
|
||||||
|
var x = Float() * Int()
|
||||||
|
var y = Int() * Float()
|
||||||
|
return vec2(x, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Float() float {
|
||||||
|
return 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
func Int() int {
|
||||||
|
return 1
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user