mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
shader: Bug fix: Wrong local variable index in a block
This commit is contained in:
parent
eacc9fac6a
commit
a0494210c3
@ -240,7 +240,7 @@ func (cs *compileState) parseExpr(block *block, expr ast.Expr) ([]shaderir.Expr,
|
|||||||
|
|
||||||
var outParams []int
|
var outParams []int
|
||||||
for _, p := range f.ir.OutParams {
|
for _, p := range f.ir.OutParams {
|
||||||
idx := len(block.vars)
|
idx := block.totalLocalVariableNum()
|
||||||
block.vars = append(block.vars, variable{
|
block.vars = append(block.vars, variable{
|
||||||
typ: p,
|
typ: p,
|
||||||
})
|
})
|
||||||
@ -257,7 +257,7 @@ func (cs *compileState) parseExpr(block *block, expr ast.Expr) ([]shaderir.Expr,
|
|||||||
return nil, nil, nil, false
|
return nil, nil, nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
idx := len(block.vars)
|
idx := block.totalLocalVariableNum()
|
||||||
block.vars = append(block.vars, variable{
|
block.vars = append(block.vars, variable{
|
||||||
typ: t,
|
typ: t,
|
||||||
})
|
})
|
||||||
@ -453,7 +453,7 @@ func (cs *compileState) parseExpr(block *block, expr ast.Expr) ([]shaderir.Expr,
|
|||||||
return nil, nil, nil, false
|
return nil, nil, nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
idx := len(block.vars)
|
idx := block.totalLocalVariableNum()
|
||||||
block.vars = append(block.vars, variable{
|
block.vars = append(block.vars, variable{
|
||||||
typ: t,
|
typ: t,
|
||||||
})
|
})
|
||||||
|
@ -95,6 +95,14 @@ type block struct {
|
|||||||
ir *shaderir.Block
|
ir *shaderir.Block
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *block) totalLocalVariableNum() int {
|
||||||
|
c := len(b.vars)
|
||||||
|
if b.outer != nil {
|
||||||
|
c += b.outer.totalLocalVariableNum()
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
func (b *block) findLocalVariable(name string) (int, shaderir.Type, bool) {
|
func (b *block) findLocalVariable(name string) (int, shaderir.Type, bool) {
|
||||||
idx := 0
|
idx := 0
|
||||||
for outer := b.outer; outer != nil; outer = outer.outer {
|
for outer := b.outer; outer != nil; outer = outer.outer {
|
||||||
|
21
internal/shader/testdata/for4.expected.vs
vendored
Normal file
21
internal/shader/testdata/for4.expected.vs
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
void F0(in int l0, out int l1);
|
||||||
|
void F1(out int l0);
|
||||||
|
|
||||||
|
void F0(in int l0, out int l1) {
|
||||||
|
l1 = l0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void F1(out int l0) {
|
||||||
|
int l1 = 0;
|
||||||
|
l1 = 0;
|
||||||
|
for (int l2 = 0; l2 < 10; l2++) {
|
||||||
|
int l3 = 0;
|
||||||
|
int l4 = 0;
|
||||||
|
F0(l2, l3);
|
||||||
|
l4 = l3;
|
||||||
|
l1 = (l1) + (l4);
|
||||||
|
}
|
||||||
|
l0 = l1;
|
||||||
|
return;
|
||||||
|
}
|
14
internal/shader/testdata/for4.go
vendored
Normal file
14
internal/shader/testdata/for4.go
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func Ident(x int) int {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
func Foo() int {
|
||||||
|
sum := 0
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
x := Ident(i)
|
||||||
|
sum += x
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user