Ver código fonte

disable varying optim (agal bug), force unique write on Out/Var

Nicolas Cannasse 11 anos atrás
pai
commit
4e8541d11c
2 arquivos alterados com 19 adições e 1 exclusões
  1. 17 0
      hxsl/AgalOptim.hx
  2. 2 1
      hxsl/AgalOut.hx

+ 17 - 0
hxsl/AgalOptim.hx

@@ -64,6 +64,10 @@ class AgalOptim {
 				code.push(OMov(allocTemp(4), { t : RAttr, index : i, swiz : null, access : null } ));
 			}
 
+		// single writes for out/varying
+		uniqueWrite(RVar);
+		uniqueWrite(ROut);
+
 		unoptim();
 		if( changed )
 			buildLive(false);
@@ -85,6 +89,19 @@ class AgalOptim {
 		};
 	}
 
+	function uniqueWrite( t ) {
+		var writes = [];
+		for( op in code ) iter(op, function(r, w) if( r.t == t ) writes[r.index] += w ? 1 : (data.fragmentShader ? 0 : 2));
+		for( i in 0...writes.length ) {
+			if( writes[i] > 1 ) {
+				var ri = allocTemp(4);
+				for( op in code ) iter(op, function(r, _) if( r.t == t && r.index == i ) { r.t = RTemp; r.index = ri.index; } );
+				code.push(OMov( { t : t, index : i, access : null, swiz : null }, ri));
+				changed = true;
+			}
+		}
+	}
+
 	function allocRegs() {
 		for( r in regs )
 			if( r != null )

+ 2 - 1
hxsl/AgalOut.hx

@@ -78,7 +78,8 @@ class AgalOut {
 				found = i;
 				break;
 			}
-			if( found < 0 ) {
+			// DISABLE varying optimization (cause AGAL bug...)
+			if( true || found < 0 ) {
 				found = valloc.length;
 				valloc.push([X, Y, Z, W]);
 			}