Переглянути джерело

if we fully write a variable, don't consider it read afterwards

ncannasse 11 роки тому
батько
коміт
54bbf425f6
1 змінених файлів з 17 додано та 7 видалено
  1. 17 7
      hxsl/Linker.hx

+ 17 - 7
hxsl/Linker.hx

@@ -161,7 +161,7 @@ class Linker {
 		switch( e.e ) {
 		case TVar(v) if( !locals.exists(v.id) ):
 			var v = allocVar(v, e.p);
-			if( curShader != null ) {
+			if( curShader != null && !curShader.write.exists(v.id) ) {
 				debug(curShader.name + " read " + v.path);
 				curShader.read.set(v.id, v);
 				// if we read a varying, force into fragment
@@ -172,18 +172,28 @@ class Linker {
 			}
 			return { e : TVar(v.v), t : v.v.type, p : e.p };
 		case TBinop(op, e1, e2):
-			switch( [op,e1.e] ) {
-			case [OpAssign | OpAssignOp(_), (TVar(v) | TSwiz({ e : TVar(v) },_))] if( !locals.exists(v.id) ):
+			switch( [op, e1.e] ) {
+			case [OpAssign, TVar(v)] if( !locals.exists(v.id) ):
+				var e2 = mapExprVar(e2);
 				var v = allocVar(v, e1.p);
 				if( curShader != null ) {
 					debug(curShader.name + " write " + v.path);
 					curShader.write.set(v.id, v);
 				}
-				// TSwiz might only assign part of the components, let's then consider that we read the other
-				if( op == OpAssign && (switch( e1.e ) { case TVar(_): true; default: false; }) ) {
-					var eout = { e : TVar(v.v), t : e1.t, p : e1.p };
-					return { e : TBinop(OpAssign, eout, mapExprVar(e2)), t : e.t, p : e.p };
+				// 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 };
+			case [OpAssign | OpAssignOp(_), (TVar(v) | TSwiz( { e : TVar(v) }, _))] if( !locals.exists(v.id) ):
+				// read the var
+				var e1 = mapExprVar(e1);
+				var e2 = mapExprVar(e2);
+
+				var v = allocVar(v, e1.p);
+				if( curShader != null ) {
+					// TODO : mark as partial write if SWIZ
+					debug(curShader.name + " write " + v.path);
+					curShader.write.set(v.id, v);
 				}
+				return { e : TBinop(op, e1, e2), t : e.t, p : e.p };
 			default:
 			}
 		case TDiscard: