浏览代码

added runtimeshader spec signature for easier duplicate check

ncannasse 7 年之前
父节点
当前提交
973ca19d37
共有 3 个文件被更改,包括 22 次插入7 次删除
  1. 4 1
      hxsl/Cache.hx
  2. 1 0
      hxsl/RuntimeShader.hx
  3. 17 6
      hxsl/UniqueChecker.hx

+ 4 - 1
hxsl/Cache.hx

@@ -38,8 +38,9 @@ class Cache {
 			return shader;
 		var s = new hxsl.SharedShader("");
 		var v = vars.copy();
+		var id = haxe.crypto.Md5.encode(vars.join(":")).substr(0, 8);
 		s.data = {
-			name : "shaderLinker",
+			name : "shaderLinker_"+id,
 			vars : [],
 			funs : [],
 		};
@@ -273,6 +274,8 @@ class Cache {
 		}
 		#end
 
+		r.spec = { instances : @:privateAccess [for( s in shaders ) s.shader.data.name + (s.priority == 0 ? "" : ""+s.priority)+(s.constBits == 0 ? "" : "_"+StringTools.hex(s.constBits))], signature : null };
+		r.spec.signature = haxe.crypto.Md5.encode(r.spec.instances.join(":"));
 		r.signature = haxe.crypto.Md5.encode(Printer.shaderToString(r.vertex.data) + Printer.shaderToString(r.fragment.data));
 
 		var r2 = byID.get(r.signature);

+ 1 - 0
hxsl/RuntimeShader.hx

@@ -55,6 +55,7 @@ class RuntimeShader {
 	public var fragment : RuntimeShaderData;
 	public var globals : Map<Int,Bool>;
 	public var signature : String;
+	public var spec : { instances : Array<String>, signature : String };
 
 	public function new() {
 		id = UID++;

+ 17 - 6
hxsl/UniqueChecker.hx

@@ -6,13 +6,17 @@ class UniqueChecker {
 
 	var signatures = new Map<String,Int>();
 	var compile : Ast.ShaderData -> String;
-	var previousShaders = new Map<String,Bool>();
+	var previousShaders = new Map<String,String>();
+	var previousSigns = new Map<String,Bool>();
 
 	function new() {
 		var r = ~/^[0-9]+_([A-Fa-f0-9]+)\./;
 		for( f in (try sys.FileSystem.readDirectory("shaders") catch( e : Dynamic ) []) )
-			if( r.match(f) )
-				previousShaders.set(r.matched(1), true);
+			if( r.match(f) ) {
+				var spec = sys.io.File.getContent("shaders/" + f).split("\n")[0];
+				previousShaders.set(spec, r.matched(1));
+				previousSigns.set(r.matched(1), true);
+			}
 	}
 
 	function duplicate( shader : ShaderData ) : ShaderData {
@@ -59,8 +63,15 @@ class UniqueChecker {
 			return;
 		}
 
+		var specKey = shader.spec.instances.toString() + " = " + shader.spec.signature;
+		var prevSign = previousShaders.get(specKey);
+
+		if( prevSign != null && prevSign != sign )
+			Sys.println("**** SAME SPEC GIVES DIFFERENT SIGN " + sign + " != " + prevSign + " *****");
+
+
 		var head = "Shader " + sign;
-		var str = head + "\n\n" + vertexCode+"\n\n" + fragmentCode + "\n\n" + hxsl.Printer.shaderToString(shader.vertex.data, true) + "\n\n" + hxsl.Printer.shaderToString(shader.fragment.data, true);
+		var str = specKey+"\n" + head + "\n\n" + vertexCode+"\n\n" + fragmentCode + "\n\n" + hxsl.Printer.shaderToString(shader.vertex.data, true) + "\n\n" + hxsl.Printer.shaderToString(shader.fragment.data, true);
 
 		sys.io.File.saveContent("shaders/" + shader.id + "_" + sign + ".c", str);
 		signatures.set(sign, shader.id);
@@ -74,10 +85,10 @@ class UniqueChecker {
 			extra = " (" + (v == checkV ? "vertex" : "fragment") + " " + v.type+" with " + v.id + ")";
 		}
 
-		if( previousShaders.exists(sign) )
+		if( previousSigns.exists(sign) )
 			Sys.println("Reuse  " + shader.id+ " "+sign);
 		else
-			Sys.println("Shader " + shader.id+ " "+sign+extra);
+			Sys.println("Shader " + shader.id+ " "+specKey+extra);
 
 		if( checkV != null && checkF != null && checkV.id == checkF.id ) {
 			var v = checkF;