Browse Source

bugfix for __init__, don't inline helper functions in GL

ncannasse 10 years ago
parent
commit
edc665bb13
2 changed files with 16 additions and 5 deletions
  1. 12 5
      hxsl/Eval.hx
  2. 4 0
      hxsl/SharedShader.hx

+ 12 - 5
hxsl/Eval.hx

@@ -9,8 +9,11 @@ using hxsl.Ast;
 class Eval {
 
 	public var varMap : Map<TVar,TVar>;
+	public var inlineCalls : Bool;
+	public var unrollLoops : Bool;
 	var constants : Map<TVar,TExprDef>;
 	var funMap : Map<TVar,TFunction>;
+	var curFun : TFunction;
 
 	public function new() {
 		varMap = new Map();
@@ -75,12 +78,14 @@ class Eval {
 				ret : f.ret,
 				expr : f.expr,
 			};
-			if( f.kind != Helper )
+			if( !inlineCalls || f.kind != Helper )
 				funs.push(f2);
 			funMap.set(f2.ref, f);
 		}
-		for( i in 0...funs.length )
-			funs[i].expr = evalExpr(funs[i].expr,false);
+		for( i in 0...funs.length ) {
+			curFun = funs[i];
+			curFun.expr = evalExpr(curFun.expr,false);
+		}
 		return {
 			name : s.name,
 			vars : [for( v in s.vars ) mapVar(v)],
@@ -186,6 +191,8 @@ class Eval {
 			case TGlobal(g):
 				var v = evalCall(g, args);
 				if( v != null ) v else TCall(c, args);
+			case TVar(_) if( !inlineCalls ):
+				TCall(c, args);
 			case TVar(v) if( funMap.exists(v) ):
 				// inline the function call
 				var f = funMap.get(v);
@@ -235,7 +242,7 @@ class Eval {
 					out.push(e);
 				}
 			}
-			if( out.length == 1 )
+			if( out.length == 1 && curFun.kind != Init )
 				out[0].e
 			else
 				TBlock(out);
@@ -361,7 +368,7 @@ class Eval {
 			var v2 = mapVar(v);
 			var it = evalExpr(it);
 			var e = switch( it.e ) {
-			case TBinop(OpInterval, { e : TConst(CInt(start)) }, { e : TConst(CInt(len)) } ):
+			case TBinop(OpInterval, { e : TConst(CInt(start)) }, { e : TConst(CInt(len)) } ) if( unrollLoops ):
 				var out = [];
 				for( i in start...len ) {
 					constants.set(v, TConst(CInt(i)));

+ 4 - 0
hxsl/SharedShader.hx

@@ -68,6 +68,10 @@ class SharedShader {
 			});
 			c = c.next;
 		}
+		#if flash
+		eval.inlineCalls = true;
+		eval.unrollLoops = true;
+		#end
 		var i = new ShaderInstance(eval.eval(data));
 		#if debug
 		Printer.check(i.shader, [data]);