diff --git a/internal/shaderir/glsl.go b/internal/shaderir/glsl.go index d7f5e8d52..740c788c3 100644 --- a/internal/shaderir/glsl.go +++ b/internal/shaderir/glsl.go @@ -99,8 +99,25 @@ func (p *Program) glslFunc(f *Func) []string { argsstr = strings.Join(args, ", ") } - return []string{ - fmt.Sprintf(`void %s(%s) {`, f.Name, argsstr), - `}`, - } + var lines []string + lines = append(lines, fmt.Sprintf("void %s(%s) {", f.Name, argsstr)) + lines = append(lines, p.glslBlock(&f.Block, f, 0)...) + lines = append(lines, "}") + + return lines +} + +func (p *Program) glslBlock(b *Block, f *Func, level int) []string { + idt := strings.Repeat("\t", level+1) + + var lines []string + var idx int + if level == 0 { + idx = len(f.InParams) + len(f.InOutParams) + len(f.OutParams) + } + for _, t := range b.LocalVars { + lines = append(lines, fmt.Sprintf("%s%s;", idt, p.glslVarDecl(&t, fmt.Sprintf("l%d", idx)))) + idx++ + } + return lines } diff --git a/internal/shaderir/ir_test.go b/internal/shaderir/ir_test.go index 479817d41..825a88f44 100644 --- a/internal/shaderir/ir_test.go +++ b/internal/shaderir/ir_test.go @@ -122,6 +122,35 @@ varying vec3 V0;`, }, }, Glsl: `void F0(in float l0, in vec2 l1, in vec4 l2, inout mat2 l3, out mat4 l4) { +}`, + }, + { + Name: "FuncLocals", + Program: Program{ + Funcs: []Func{ + { + Name: "F0", + InParams: []Type{ + {Main: Float}, + }, + InOutParams: []Type{ + {Main: Float}, + }, + OutParams: []Type{ + {Main: Float}, + }, + Block: Block{ + LocalVars: []Type{ + {Main: Mat4}, + {Main: Mat4}, + }, + }, + }, + }, + }, + Glsl: `void F0(in float l0, inout float l1, out float l2) { + mat4 l3; + mat4 l4; }`, }, }