diff --git a/internal/shaderir/glsl/glsl.go b/internal/shaderir/glsl/glsl.go index 85fa1e9d9..8a0d2eb87 100644 --- a/internal/shaderir/glsl/glsl.go +++ b/internal/shaderir/glsl/glsl.go @@ -504,9 +504,9 @@ func (c *compileContext) block(p *shaderir.Program, topBlock, block *shaderir.Bl var op string switch e.Op { case shaderir.Add, shaderir.Sub, shaderir.NotOp: - op = string(e.Op) + op = opString(e.Op) default: - op = fmt.Sprintf("?(unexpected op: %s)", string(e.Op)) + op = fmt.Sprintf("?(unexpected op: %d)", e.Op) } return fmt.Sprintf("%s(%s)", op, expr(&e.Exprs[0])) case shaderir.Binary: @@ -514,7 +514,7 @@ func (c *compileContext) block(p *shaderir.Program, topBlock, block *shaderir.Bl // '%' is not defined. return fmt.Sprintf("modInt((%s), (%s))", expr(&e.Exprs[0]), expr(&e.Exprs[1])) } - return fmt.Sprintf("(%s) %s (%s)", expr(&e.Exprs[0]), e.Op, expr(&e.Exprs[1])) + return fmt.Sprintf("(%s) %s (%s)", expr(&e.Exprs[0]), opString(e.Op), expr(&e.Exprs[1])) case shaderir.Selection: return fmt.Sprintf("(%s) ? (%s) : (%s)", expr(&e.Exprs[0]), expr(&e.Exprs[1]), expr(&e.Exprs[2])) case shaderir.Call: @@ -594,9 +594,9 @@ func (c *compileContext) block(p *shaderir.Program, topBlock, block *shaderir.Bl var op string switch s.ForOp { case shaderir.LessThanOp, shaderir.LessThanEqualOp, shaderir.GreaterThanOp, shaderir.GreaterThanEqualOp, shaderir.EqualOp, shaderir.NotEqualOp: - op = string(s.ForOp) + op = opString(s.ForOp) default: - op = fmt.Sprintf("?(unexpected op: %s)", string(s.ForOp)) + op = fmt.Sprintf("?(unexpected op: %d)", s.ForOp) } t := s.ForVarType diff --git a/internal/shaderir/glsl/type.go b/internal/shaderir/glsl/type.go index f8e35f540..bd1f71c4e 100644 --- a/internal/shaderir/glsl/type.go +++ b/internal/shaderir/glsl/type.go @@ -20,6 +20,50 @@ import ( "github.com/hajimehoshi/ebiten/v2/internal/shaderir" ) +func opString(op shaderir.Op) string { + switch op { + case shaderir.Add: + return "+" + case shaderir.Sub: + return "-" + case shaderir.NotOp: + return "!" + case shaderir.Mul: + return "*" + case shaderir.Div: + return "/" + case shaderir.ModOp: + return "%" + case shaderir.LeftShift: + return "<<" + case shaderir.RightShift: + return ">>" + case shaderir.LessThanOp: + return "<" + case shaderir.LessThanEqualOp: + return "<=" + case shaderir.GreaterThanOp: + return ">" + case shaderir.GreaterThanEqualOp: + return ">=" + case shaderir.EqualOp: + return "==" + case shaderir.NotEqualOp: + return "!=" + case shaderir.And: + return "&" + case shaderir.Xor: + return "^" + case shaderir.Or: + return "|" + case shaderir.AndAnd: + return "&&" + case shaderir.OrOr: + return "||" + } + return fmt.Sprintf("!(unexpected operator: %d)", op) +} + func typeString(t *shaderir.Type) (string, string) { switch t.Main { case shaderir.Array: diff --git a/internal/shaderir/msl/msl.go b/internal/shaderir/msl/msl.go index 0ecf0c92f..b763cbe8f 100644 --- a/internal/shaderir/msl/msl.go +++ b/internal/shaderir/msl/msl.go @@ -371,13 +371,13 @@ func (c *compileContext) block(p *shaderir.Program, topBlock, block *shaderir.Bl var op string switch e.Op { case shaderir.Add, shaderir.Sub, shaderir.NotOp: - op = string(e.Op) + op = opString(e.Op) default: - op = fmt.Sprintf("?(unexpected op: %s)", string(e.Op)) + op = fmt.Sprintf("?(unexpected op: %d)", e.Op) } return fmt.Sprintf("%s(%s)", op, expr(&e.Exprs[0])) case shaderir.Binary: - return fmt.Sprintf("(%s) %s (%s)", expr(&e.Exprs[0]), e.Op, expr(&e.Exprs[1])) + return fmt.Sprintf("(%s) %s (%s)", expr(&e.Exprs[0]), opString(e.Op), expr(&e.Exprs[1])) case shaderir.Selection: return fmt.Sprintf("(%s) ? (%s) : (%s)", expr(&e.Exprs[0]), expr(&e.Exprs[1]), expr(&e.Exprs[2])) case shaderir.Call: @@ -469,9 +469,9 @@ func (c *compileContext) block(p *shaderir.Program, topBlock, block *shaderir.Bl var op string switch s.ForOp { case shaderir.LessThanOp, shaderir.LessThanEqualOp, shaderir.GreaterThanOp, shaderir.GreaterThanEqualOp, shaderir.EqualOp, shaderir.NotEqualOp: - op = string(s.ForOp) + op = opString(s.ForOp) default: - op = fmt.Sprintf("?(unexpected op: %s)", string(s.ForOp)) + op = fmt.Sprintf("?(unexpected op: %d)", s.ForOp) } t := s.ForVarType diff --git a/internal/shaderir/msl/type.go b/internal/shaderir/msl/type.go index 9bcae79aa..6484cc31d 100644 --- a/internal/shaderir/msl/type.go +++ b/internal/shaderir/msl/type.go @@ -20,6 +20,50 @@ import ( "github.com/hajimehoshi/ebiten/v2/internal/shaderir" ) +func opString(op shaderir.Op) string { + switch op { + case shaderir.Add: + return "+" + case shaderir.Sub: + return "-" + case shaderir.NotOp: + return "!" + case shaderir.Mul: + return "*" + case shaderir.Div: + return "/" + case shaderir.ModOp: + return "%" + case shaderir.LeftShift: + return "<<" + case shaderir.RightShift: + return ">>" + case shaderir.LessThanOp: + return "<" + case shaderir.LessThanEqualOp: + return "<=" + case shaderir.GreaterThanOp: + return ">" + case shaderir.GreaterThanEqualOp: + return ">=" + case shaderir.EqualOp: + return "==" + case shaderir.NotEqualOp: + return "!=" + case shaderir.And: + return "&" + case shaderir.Xor: + return "^" + case shaderir.Or: + return "|" + case shaderir.AndAnd: + return "&&" + case shaderir.OrOr: + return "||" + } + return fmt.Sprintf("!(unexpected operator: %d)", op) +} + func typeString(t *shaderir.Type, packed bool, ref bool) string { switch t.Main { case shaderir.Array: diff --git a/internal/shaderir/program.go b/internal/shaderir/program.go index 21ad87d67..2ae6d59f3 100644 --- a/internal/shaderir/program.go +++ b/internal/shaderir/program.go @@ -131,28 +131,28 @@ const ( Index ) -type Op string +type Op int const ( - Add Op = "+" - Sub Op = "-" - NotOp Op = "!" - Mul Op = "*" - Div Op = "/" - ModOp Op = "%" - LeftShift Op = "<<" - RightShift Op = ">>" - LessThanOp Op = "<" - LessThanEqualOp Op = "<=" - GreaterThanOp Op = ">" - GreaterThanEqualOp Op = ">=" - EqualOp Op = "==" - NotEqualOp Op = "!=" - And Op = "&" - Xor Op = "^" - Or Op = "|" - AndAnd Op = "&&" - OrOr Op = "||" + Add Op = iota + Sub + NotOp + Mul // TODO: Separate Hadamard-product and Matrix-product + Div + ModOp + LeftShift + RightShift + LessThanOp + LessThanEqualOp + GreaterThanOp + GreaterThanEqualOp + EqualOp + NotEqualOp + And + Xor + Or + AndAnd + OrOr ) func OpFromToken(t token.Token) (Op, bool) { @@ -196,7 +196,7 @@ func OpFromToken(t token.Token) (Op, bool) { case token.LOR: return OrOr, true } - return "", false + return 0, false } type BuiltinFunc string