shaderir: Implement 'if'

This commit is contained in:
Hajime Hoshi 2020-05-15 02:10:07 +09:00
parent 71ee622997
commit e6d78abd11
3 changed files with 84 additions and 10 deletions

View File

@ -119,8 +119,8 @@ func (p *Program) glslBlock(b *Block, f *Func, level int, localVarIndex int) []s
var glslExpr func(e *Expr) string
glslExpr = func(e *Expr) string {
switch e.Type {
case Literal:
return e.Value
case Numeric:
return fmt.Sprintf("%.9e", e.Num)
case VarName:
switch e.Variable.Type {
case Uniform:
@ -135,7 +135,7 @@ func (p *Program) glslBlock(b *Block, f *Func, level int, localVarIndex int) []s
return fmt.Sprintf("?(unexpected variable type: %d)", e.Variable.Type)
}
case Ident:
return e.Value
return e.Ident
case Unary:
return fmt.Sprintf("%s(%s)", e.Op, glslExpr(&e.Exprs[0]))
case Binary:
@ -163,7 +163,13 @@ func (p *Program) glslBlock(b *Block, f *Func, level int, localVarIndex int) []s
case Assign:
lines = append(lines, fmt.Sprintf("%s%s = %s;", idt, glslExpr(&s.Exprs[0]), glslExpr(&s.Exprs[1])))
case If:
panic("not implemented")
lines = append(lines, fmt.Sprintf("%sif (%s) {", idt, glslExpr(&s.Exprs[0])))
lines = append(lines, p.glslBlock(s.Block, f, level+1, localVarIndex)...)
if s.ElseBlock != nil {
lines = append(lines, fmt.Sprintf("%s} else {", idt))
lines = append(lines, p.glslBlock(s.ElseBlock, f, level+1, localVarIndex)...)
}
lines = append(lines, fmt.Sprintf("%s}", idt))
case For:
panic("not implemented")
case Continue:

View File

@ -27,6 +27,22 @@ func assignStmt(lhs Expr, rhs Expr) Stmt {
}
}
func ifStmt(cond Expr, block *Block, elseBlock *Block) Stmt {
return Stmt{
Type: If,
Exprs: []Expr{cond},
Block: block,
ElseBlock: elseBlock,
}
}
func numericExpr(value float64) Expr {
return Expr{
Type: Numeric,
Num: value,
}
}
func varNameExpr(vt VariableType, index int) Expr {
return Expr{
Type: VarName,
@ -224,7 +240,8 @@ varying vec3 V0;`,
Stmts: []Stmt{
assignStmt(
varNameExpr(Local, 2),
binaryExpr(Add,
binaryExpr(
Add,
varNameExpr(Local, 0),
varNameExpr(Local, 1),
),
@ -236,6 +253,57 @@ varying vec3 V0;`,
},
Glsl: `void F0(in float l0, in float l1, out float l2) {
l2 = (l0) + (l1);
}`,
},
{
Name: "FuncIf",
Program: Program{
Funcs: []Func{
{
Name: "F0",
InParams: []Type{
{Main: Float},
{Main: Float},
},
OutParams: []Type{
{Main: Float},
},
Block: Block{
Stmts: []Stmt{
ifStmt(
binaryExpr(
Eq,
varNameExpr(Local, 0),
numericExpr(0),
),
&Block{
Stmts: []Stmt{
assignStmt(
varNameExpr(Local, 2),
varNameExpr(Local, 0),
),
},
},
&Block{
Stmts: []Stmt{
assignStmt(
varNameExpr(Local, 2),
varNameExpr(Local, 1),
),
},
},
),
},
},
},
},
},
Glsl: `void F0(in float l0, in float l1, out float l2) {
if ((l0) == (0.000000000e+00)) {
l2 = l0;
} else {
l2 = l1;
}
}`,
},
}

View File

@ -42,11 +42,10 @@ type Block struct {
type Stmt struct {
Type StmtType
Exprs []Expr
Condition Expr
ElseExprs []Expr
Block *Block
ElseBlock *Block
ForInit Expr
ForRest Expr
Block *Block
}
type StmtType int
@ -67,14 +66,15 @@ type Expr struct {
Type ExprType
Exprs []Expr
Variable Variable
Value string
Num float64
Ident string
Op Op
}
type ExprType int
const (
Literal ExprType = iota
Numeric ExprType = iota
VarName
Ident
Unary