فهرست منبع

fixed __init__vertex/fragment with several exprs

ncannasse 10 سال پیش
والد
کامیت
e214e3d8e8
2فایلهای تغییر یافته به همراه23 افزوده شده و 15 حذف شده
  1. 3 3
      hxsl/Checker.hx
  2. 20 12
      hxsl/Linker.hx

+ 3 - 3
hxsl/Checker.hx

@@ -146,9 +146,9 @@ class Checker {
 				{ id : Tools.allocVarId(), name : a.name, kind : Local, type : a.type };
 			}];
 			var kind = switch( f.name ) {
-			case "vertex", "__init__vertex":  Vertex;
-			case "fragment", "__init__fragment": Fragment;
-			case "__init__": Init;
+			case "vertex":  Vertex;
+			case "fragment": Fragment;
+			case "__init__", "__init__vertex", "__init__fragment": Init;
 			default: Helper;
 			}
 			if( args.length != 0 && kind != Helper )

+ 20 - 12
hxsl/Linker.hx

@@ -45,12 +45,13 @@ class Linker {
 	var varIdMap : Map<Int,Int>;
 	var locals : Map<Int,Bool>;
 	var curInstance : Int;
+	var debugDepth = 0;
 
 	public function new() {
 	}
 
 	inline function debug( msg : String, ?pos : haxe.PosInfos ) {
-		//haxe.Log.trace(msg, pos);
+		//for( i in 0...debugDepth ) msg = "    " + msg; haxe.Log.trace(msg, pos);
 	}
 
 	function error( msg : String, p : Position ) : Dynamic {
@@ -225,26 +226,28 @@ class Linker {
 		return s2.priority - s1.priority;
 	}
 
-	function buildDependency( parent : ShaderInfos, v : AllocatedVar, isWritten : Bool ) {
+	function buildDependency( s : ShaderInfos, v : AllocatedVar, isWritten : Bool ) {
 		var found = !isWritten;
-		for( s in shaders ) {
+		for( parent in shaders ) {
 			if( parent == s ) {
 				found = true;
 				continue;
 			} else if( !found )
 				continue;
-			if( !s.write.exists(v.id) )
+			if( !parent.write.exists(v.id) )
 				continue;
-			if( parent.vertex && s.vertex == false )
+			if( s.vertex && parent.vertex == false )
 				continue;
-			debug(parent.name + " => " + s.name + " (" + v.path + ")");
-			parent.deps.set(s, true);
-			initDependencies(s);
-			if( !s.read.exists(v.id) )
+			debug(s.name + " => " + parent.name + " (" + v.path + ")");
+			s.deps.set(parent, true);
+			debugDepth++;
+			initDependencies(parent);
+			debugDepth--;
+			if( !parent.read.exists(v.id) )
 				return;
 		}
 		if( v.v.kind == Var )
-			error("Variable " + v.path + " required by " + parent.name + " is missing initializer", null);
+			error("Variable " + v.path + " required by " + s.name + " is missing initializer", null);
 	}
 
 	function initDependencies( s : ShaderInfos ) {
@@ -344,14 +347,19 @@ class Linker {
 					addShader(s.name + "." + (v.kind == Vertex ? "vertex" : "fragment"), v.kind == Vertex, f.expr, priority);
 
 				case Init:
+					var status : Null<Bool> = switch( f.ref.name ) {
+					case "__init__vertex": true;
+					case "__init__fragment": false;
+					default: null;
+					}
 					switch( f.expr.e ) {
 					case TBlock(el):
 						var index = 0;
 						var priority = -el.length;
 						for( e in el )
-							addShader(s.name+".__init__"+(index++),null,e, priority++);
+							addShader(s.name+"."+f.ref.name+(index++),status,e, priority++);
 					default:
-						addShader(s.name+".__init__",null,f.expr, -1);
+						addShader(s.name+"."+f.ref.name,status,f.expr, -1);
 					}
 				case Helper:
 					throw "Unexpected helper function in linker "+v.v.name;