Browse Source

ensure no linking difference depending on var id

Nicolas Cannasse 1 year ago
parent
commit
fbceca6496
1 changed files with 26 additions and 17 deletions
  1. 26 17
      hxsl/Linker.hx

+ 26 - 17
hxsl/Linker.hx

@@ -22,8 +22,10 @@ private class ShaderInfos {
 	public var body : TExpr;
 	public var usedFunctions : Array<TFunction>;
 	public var deps : Map<ShaderInfos, Bool>;
-	public var read : Map<Int,AllocatedVar>;
-	public var write : Map<Int,AllocatedVar>;
+	public var readMap : Map<Int,AllocatedVar>;
+	public var readVars : Array<AllocatedVar>;
+	public var writeMap : Map<Int,AllocatedVar>;
+	public var writeVars : Array<AllocatedVar>;
 	public var processed : Map<Int, Bool>;
 	public var vertex : Null<Bool>;
 	public var onStack : Bool;
@@ -36,8 +38,10 @@ private class ShaderInfos {
 		this.vertex = v;
 		processed = new Map();
 		usedFunctions = [];
-		read = new Map();
-		write = new Map();
+		readMap = new Map();
+		readVars = [];
+		writeMap = new Map();
+		writeVars = [];
 	}
 }
 
@@ -187,9 +191,12 @@ class Linker {
 		switch( e.e ) {
 		case TVar(v) if( !locals.exists(v.id) ):
 			var v = allocVar(v, e.p);
-			if( curShader != null && !curShader.write.exists(v.id) ) {
+			if( curShader != null && !curShader.writeMap.exists(v.id) ) {
 				debug(curShader.name + " read " + v.path);
-				curShader.read.set(v.id, v);
+				if( !curShader.readMap.exists(v.id) ) {
+					curShader.readMap.set(v.id, v);
+					curShader.readVars.push(v);
+				}
 				// if we read a varying, force into fragment
 				if( curShader.vertex == null && v.v.kind == Var ) {
 					debug("Force " + curShader.name+" into fragment (use varying)");
@@ -202,9 +209,10 @@ class Linker {
 			case [OpAssign, TVar(v)] if( !locals.exists(v.id) ):
 				var e2 = mapExprVar(e2);
 				var v = allocVar(v, e1.p);
-				if( curShader != null ) {
+				if( curShader != null && !curShader.writeMap.exists(v.id) ) {
 					debug(curShader.name + " write " + v.path);
-					curShader.write.set(v.id, v);
+					curShader.writeMap.set(v.id, v);
+					curShader.writeVars.push(v);
 				}
 				// don't read the var
 				return { e : TBinop(op, { e : TVar(v.v), t : v.v.type, p : e.p }, e2), t : e.t, p : e.p };
@@ -214,10 +222,11 @@ class Linker {
 				var e2 = mapExprVar(e2);
 
 				var v = allocVar(v, e1.p);
-				if( curShader != null ) {
+				if( curShader != null && !curShader.writeMap.exists(v.id) ) {
 					// TODO : mark as partial write if SWIZ
 					debug(curShader.name + " write " + v.path);
-					curShader.write.set(v.id, v);
+					curShader.writeMap.set(v.id, v);
+					curShader.writeVars.push(v);
 				}
 				return { e : TBinop(op, e1, e2), t : e.t, p : e.p };
 			default:
@@ -261,7 +270,7 @@ class Linker {
 				continue;
 			} else if( !found )
 				continue;
-			if( !parent.write.exists(v.id) )
+			if( !parent.writeMap.exists(v.id) )
 				continue;
 			if( s.vertex ) {
 				if( parent.vertex == false )
@@ -274,7 +283,7 @@ class Linker {
 			debugDepth++;
 			initDependencies(parent);
 			debugDepth--;
-			if( !parent.read.exists(v.id) )
+			if( !parent.readMap.exists(v.id) )
 				return;
 		}
 		if( v.v.kind == Var )
@@ -285,8 +294,8 @@ class Linker {
 		if( s.deps != null )
 			return;
 		s.deps = new Map();
-		for( r in s.read )
-			buildDependency(s, r, s.write.exists(r.id));
+		for( r in s.readVars )
+			buildDependency(s, r, s.writeMap.exists(r.id));
 		// propagate fragment flag
 		if( s.vertex == null )
 			for( d in s.deps.keys() )
@@ -433,7 +442,7 @@ class Linker {
 		for( s in shaders ) {
 			if( s.vertex != null ) continue;
 			var onlyParams = true;
-			for( r in s.read )
+			for( r in s.readVars )
 				if( r.v.kind != Param ) {
 					onlyParams = false;
 					break;
@@ -473,9 +482,9 @@ class Linker {
 				outVars.push(v.v);
 		}
 		for( s in v.concat(f) ) {
-			for( v in s.read )
+			for( v in s.readVars )
 				addVar(v);
-			for( v in s.write )
+			for( v in s.writeVars )
 				addVar(v);
 		}
 		// cleanup unused structure vars