Procházet zdrojové kódy

improved shader debugging by replacing var names

Nicolas Cannasse před 11 roky
rodič
revize
e7d7d74792
2 změnil soubory, kde provedl 89 přidání a 3 odebrání
  1. 58 2
      h3d/impl/LogDriver.hx
  2. 31 1
      h3d/impl/Stage3dDriver.hx

+ 58 - 2
h3d/impl/LogDriver.hx

@@ -72,7 +72,63 @@ class LogDriver extends Driver {
 		currentShader = shader;
 		var ret = d.selectShader(shader);
 		if( !loggedShaders.get(shader.id) ) {
-			var str = hxsl.Printer.shaderToString(shader.vertex.data) + "\n" + hxsl.Printer.shaderToString(shader.fragment.data);
+			function fmt( shader : hxsl.RuntimeShader.RuntimeShaderData ) {
+				var str = hxsl.Printer.shaderToString(shader.data);
+				str = ~/((fragment)|(vertex))Globals\[([0-9]+)\](.[xyz]+)?/g.map(str, function(r) {
+					var name = null;
+					var cid = Std.parseInt(r.matched(4)) << 2;
+					var swiz = r.matched(5);
+					if( swiz != null ) {
+						var d = swiz.charCodeAt(1) - 'x'.code;
+						cid += d;
+						swiz = "." + [for( i in 1...swiz.length ) String.fromCharCode(swiz.charCodeAt(i) - d)].join("");
+					}
+					for( g in shader.globals ) {
+						if( g.path == "__consts__" && cid >= g.pos && cid < g.pos + (switch(g.type) { case TArray(TFloat, SConst(n)): n; default: 0; } ) && swiz == ".x" ) {
+							swiz = null;
+							name = "" + shader.consts[cid - g.pos];
+							break;
+						}
+						if( g.pos == cid ) {
+							name = g.path;
+							break;
+						}
+					}
+					if( name == null )
+						return r.matched(0);
+					if( swiz != null ) name += swiz;
+					return name;
+				});
+				str = ~/((fragment)|(vertex))Params\[([0-9]+)\](.[xyz]+)?/g.map(str, function(r) {
+					var name = null;
+					var cid = Std.parseInt(r.matched(4)) << 2;
+					var swiz = r.matched(5);
+					if( swiz != null ) {
+						var d = swiz.charCodeAt(1) - 'x'.code;
+						cid += d;
+						swiz = "." + [for( i in 1...swiz.length ) String.fromCharCode(swiz.charCodeAt(i) - d)].join("");
+					}
+					for( p in shader.params )
+						if( p.pos == cid ) {
+							name = p.name;
+							break;
+						}
+					if( name == null )
+						return r.matched(0);
+					if( swiz != null ) name += swiz;
+					return name;
+				});
+				str = ~/((fragment)|(vertex))Textures\[([0-9]+)\]/g.map(str, function(r) {
+					var name = null;
+					var cid = Std.parseInt(r.matched(4));
+					for( p in shader.textures )
+						if( p.pos == cid )
+							return p.name;
+					return r.matched(0);
+				});
+				return str;
+			}
+			var str = fmt(shader.vertex) + "\n" + fmt(shader.fragment);
 			log('');
 			log('HXSL=');
 			log("\t" + str.split("\n").join("\n\t"));
@@ -127,7 +183,7 @@ class LogDriver extends Driver {
 				for( p in s.params ) {
 					var pos = p.pos;
 					#if flash
-					pos += s.globalsSize;
+					pos += s.globalsSize * 4;
 					#end
 					log('\t@$pos ' + p.name + '=' + [for( i in 0...sizeOf(p.type) ) hxd.Math.fmt(buf.params.toData()[p.pos + i])]);
 				}

+ 31 - 1
h3d/impl/Stage3dDriver.hx

@@ -356,7 +356,37 @@ class Stage3dDriver extends Driver {
 	override function getNativeShaderCode( shader : hxsl.RuntimeShader ) {
 		var vertex = compileShader(shader.vertex, []).agal;
 		var fragment = compileShader(shader.fragment, []).agal;
-		return format.agal.Tools.toString(vertex) + "\n" + format.agal.Tools.toString(fragment);
+		function fmt( agal, data : hxsl.RuntimeShader.RuntimeShaderData ) {
+			var str = format.agal.Tools.toString(agal);
+			return ~/c([0-9]+)(.[xyz]+)?/g.map(str, function(r) {
+				var cid = Std.parseInt(r.matched(1)) << 2;
+				var swiz = r.matched(2);
+				if( swiz != null ) {
+					var d = swiz.charCodeAt(1) - 'x'.code;
+					cid += d;
+					swiz = "." + [for( i in 1...swiz.length ) String.fromCharCode(swiz.charCodeAt(i) - d)].join("");
+				}
+				var name = "C" + cid;
+				for( g in data.globals ) {
+					if( g.path == "__consts__" && cid >= g.pos && cid < g.pos + (switch(g.type) { case TArray(TFloat, SConst(n)): n; default: 0; } ) && swiz == ".x" ) {
+						swiz = null;
+						name = "" + data.consts[cid - g.pos];
+						break;
+					}
+					if( g.pos == cid ) {
+						name = g.path;
+						break;
+					}
+				}
+				for( p in data.params )
+					if( p.pos + (data.globalsSize << 2) == cid ) {
+						name = p.name;
+						break;
+					}
+				return swiz == null ? name : name+swiz;
+			});
+		}
+		return fmt(vertex, shader.vertex) + "\n" + fmt(fragment, shader.fragment);
 	}
 
 	override function selectShader( shader : hxsl.RuntimeShader ) {