mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 18:58:54 +01:00
internal/shader: refactoring
This commit is contained in:
parent
a4b9d3c241
commit
f63b87f675
@ -115,7 +115,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
stmts = append(stmts, ss...)
|
||||
rhst := ts[0]
|
||||
|
||||
if lhs[0].Type == shaderir.NumberExpr && rhs[0].Type == shaderir.NumberExpr {
|
||||
if lhs[0].Const != nil && rhs[0].Const != nil {
|
||||
op := e.Op
|
||||
// https://golang.org/pkg/go/constant/#BinaryOp
|
||||
// "To force integer division of Int operands, use op == token.QUO_ASSIGN instead of
|
||||
@ -175,7 +175,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
case op == shaderir.LessThanOp || op == shaderir.LessThanEqualOp || op == shaderir.GreaterThanOp || op == shaderir.GreaterThanEqualOp || op == shaderir.EqualOp || op == shaderir.NotEqualOp || op == shaderir.VectorEqualOp || op == shaderir.VectorNotEqualOp || op == shaderir.AndAnd || op == shaderir.OrOr:
|
||||
// TODO: Check types of the operands.
|
||||
t = shaderir.Type{Main: shaderir.Bool}
|
||||
case lhs[0].Type == shaderir.NumberExpr && rhs[0].Type != shaderir.NumberExpr:
|
||||
case lhs[0].Const != nil && rhs[0].Const == nil:
|
||||
switch rhst.Main {
|
||||
case shaderir.Mat2, shaderir.Mat3, shaderir.Mat4:
|
||||
if op != shaderir.MatrixMul {
|
||||
@ -196,7 +196,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
lhs[0].ConstType = shaderir.ConstTypeInt
|
||||
}
|
||||
t = rhst
|
||||
case lhs[0].Type != shaderir.NumberExpr && rhs[0].Type == shaderir.NumberExpr:
|
||||
case lhs[0].Const == nil && rhs[0].Const != nil:
|
||||
switch lhst.Main {
|
||||
case shaderir.Mat2, shaderir.Mat3, shaderir.Mat4:
|
||||
if op != shaderir.MatrixMul && op != shaderir.Div {
|
||||
@ -346,7 +346,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
},
|
||||
}, []shaderir.Type{{Main: shaderir.Int}}, stmts, true
|
||||
case shaderir.IntF:
|
||||
if len(args) == 1 && args[0].Type == shaderir.NumberExpr {
|
||||
if len(args) == 1 && args[0].Const != nil {
|
||||
if !canTruncateToInteger(args[0].Const) {
|
||||
cs.addError(e.Pos(), fmt.Sprintf("cannot convert %s to type int", args[0].Const.String()))
|
||||
return nil, nil, nil, false
|
||||
@ -360,7 +360,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
}, []shaderir.Type{{Main: shaderir.Int}}, stmts, true
|
||||
}
|
||||
case shaderir.FloatF:
|
||||
if len(args) == 1 && args[0].Type == shaderir.NumberExpr {
|
||||
if len(args) == 1 && args[0].Const != nil {
|
||||
if gconstant.ToFloat(args[0].Const).Kind() != gconstant.Unknown {
|
||||
return []shaderir.Expr{
|
||||
{
|
||||
@ -466,7 +466,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
}
|
||||
for i := range args {
|
||||
// If the argument is a non-typed constant value, treat this as a float value (#1874).
|
||||
if args[i].Type == shaderir.NumberExpr && args[i].ConstType == shaderir.ConstTypeNone && gconstant.ToFloat(args[i].Const).Kind() != gconstant.Unknown {
|
||||
if args[i].Const != nil && args[i].ConstType == shaderir.ConstTypeNone && gconstant.ToFloat(args[i].Const).Kind() != gconstant.Unknown {
|
||||
args[i].Const = gconstant.ToFloat(args[i].Const)
|
||||
args[i].ConstType = shaderir.ConstTypeFloat
|
||||
argts[i] = shaderir.Type{Main: shaderir.Float}
|
||||
@ -527,7 +527,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
}
|
||||
for i := range args {
|
||||
// If the argument is a non-typed constant value, treat this as a float value (#1874).
|
||||
if args[i].Type == shaderir.NumberExpr && args[i].ConstType == shaderir.ConstTypeNone && gconstant.ToFloat(args[i].Const).Kind() != gconstant.Unknown {
|
||||
if args[i].Const != nil && args[i].ConstType == shaderir.ConstTypeNone && gconstant.ToFloat(args[i].Const).Kind() != gconstant.Unknown {
|
||||
args[i].Const = gconstant.ToFloat(args[i].Const)
|
||||
args[i].ConstType = shaderir.ConstTypeFloat
|
||||
argts[i] = shaderir.Type{Main: shaderir.Float}
|
||||
@ -578,7 +578,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
// If the argument is a non-typed constant value, treat this as a float value (#1874).
|
||||
if args[0].Type == shaderir.NumberExpr && args[0].ConstType == shaderir.ConstTypeNone && gconstant.ToFloat(args[0].Const).Kind() != gconstant.Unknown {
|
||||
if args[0].Const != nil && args[0].ConstType == shaderir.ConstTypeNone && gconstant.ToFloat(args[0].Const).Kind() != gconstant.Unknown {
|
||||
args[0].Const = gconstant.ToFloat(args[0].Const)
|
||||
args[0].ConstType = shaderir.ConstTypeFloat
|
||||
argts[0] = shaderir.Type{Main: shaderir.Float}
|
||||
@ -626,7 +626,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
}
|
||||
|
||||
for i, p := range f.ir.InParams {
|
||||
if args[i].Type == shaderir.NumberExpr && p.Main == shaderir.Int {
|
||||
if args[i].Const != nil && p.Main == shaderir.Int {
|
||||
if !cs.forceToInt(e, &args[i]) {
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
@ -816,7 +816,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
|
||||
if exprs[0].Type == shaderir.NumberExpr {
|
||||
if exprs[0].Const != nil {
|
||||
v := gconstant.UnaryOp(e.Op, exprs[0].Const, 0)
|
||||
t := shaderir.Type{Main: shaderir.Int}
|
||||
if v.Kind() == gconstant.Float {
|
||||
@ -919,7 +919,7 @@ func (cs *compileState) parseExpr(block *block, fname string, expr ast.Expr, mar
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
idx := exprs[0]
|
||||
if idx.Type == shaderir.NumberExpr {
|
||||
if idx.Const != nil {
|
||||
if !canTruncateToInteger(idx.Const) {
|
||||
cs.addError(e.Pos(), fmt.Sprintf("constant %s truncated to integer", idx.Const.String()))
|
||||
return nil, nil, nil, false
|
||||
|
@ -220,7 +220,7 @@ func (cs *compileState) parseStmt(block *block, fname string, stmt ast.Stmt, inP
|
||||
return nil, false
|
||||
}
|
||||
varidx := ss[0].Exprs[0].Index
|
||||
if ss[0].Exprs[1].Type != shaderir.NumberExpr {
|
||||
if ss[0].Exprs[1].Const == nil {
|
||||
cs.addError(stmt.Pos(), msg)
|
||||
return nil, false
|
||||
}
|
||||
@ -261,7 +261,7 @@ func (cs *compileState) parseStmt(block *block, fname string, stmt ast.Stmt, inP
|
||||
cs.addError(stmt.Pos(), msg)
|
||||
return nil, false
|
||||
}
|
||||
if exprs[0].Exprs[1].Type != shaderir.NumberExpr {
|
||||
if exprs[0].Exprs[1].Const == nil {
|
||||
cs.addError(stmt.Pos(), msg)
|
||||
return nil, false
|
||||
}
|
||||
@ -299,7 +299,7 @@ func (cs *compileState) parseStmt(block *block, fname string, stmt ast.Stmt, inP
|
||||
cs.addError(stmt.Pos(), msg)
|
||||
return nil, false
|
||||
}
|
||||
if postSs[0].Exprs[1].Exprs[1].Type != shaderir.NumberExpr {
|
||||
if postSs[0].Exprs[1].Exprs[1].Const == nil {
|
||||
cs.addError(stmt.Pos(), msg)
|
||||
return nil, false
|
||||
}
|
||||
@ -479,7 +479,7 @@ func (cs *compileState) parseStmt(block *block, fname string, stmt ast.Stmt, inP
|
||||
} else {
|
||||
outT = outParams[i].typ
|
||||
}
|
||||
if expr.Type == shaderir.NumberExpr {
|
||||
if expr.Const != nil {
|
||||
switch outT.Main {
|
||||
case shaderir.Int:
|
||||
if !cs.forceToInt(stmt, &expr) {
|
||||
@ -652,7 +652,7 @@ func (cs *compileState) assign(block *block, fname string, pos token.Pos, lhs, r
|
||||
}
|
||||
allblank = false
|
||||
|
||||
if r[0].Type == shaderir.NumberExpr {
|
||||
if r[0].Const != nil {
|
||||
t, ok := block.findLocalVariableByIndex(l[0].Index)
|
||||
if !ok {
|
||||
cs.addError(pos, fmt.Sprintf("unexpected local variable index: %d", l[0].Index))
|
||||
@ -793,7 +793,7 @@ func canAssign(re *shaderir.Expr, lt *shaderir.Type, rt *shaderir.Type) bool {
|
||||
if lt.Equal(rt) {
|
||||
return true
|
||||
}
|
||||
if re.Type == shaderir.NumberExpr {
|
||||
if re.Const != nil {
|
||||
switch lt.Main {
|
||||
case shaderir.Bool:
|
||||
return re.Const.Kind() == gconstant.Bool
|
||||
|
Loading…
Reference in New Issue
Block a user