Nicolas Cannasse vor 11 Jahren
Ursprung
Commit
237c5d5c1b
2 geänderte Dateien mit 77 neuen und 8 gelöschten Zeilen
  1. 74 0
      hxsl/Cache.hx
  2. 3 8
      test/Test.hx

+ 74 - 0
hxsl/Cache.hx

@@ -0,0 +1,74 @@
+package hxsl;
+using hxsl.Ast;
+
+class SearchMap {
+	public var linked : ShaderData;
+	public var next : Map<Int,SearchMap>;
+	public function new() {
+	}
+}
+
+class Cache {
+
+	var linkCache : Map<Int,SearchMap>;
+	var outVarsMap : Map<String, Int>;
+	var outVars : Array<Array<String>>;
+	
+	function new() {
+		linkCache = new Map();
+		outVarsMap = new Map();
+		outVars = [];
+	}
+	
+	public function allocOutputVars( vars : Array<String> ) {
+		var key = vars.join(",");
+		var id = outVarsMap.get(key);
+		if( id != null )
+			return id;
+		vars = vars.copy();
+		vars.sort(Reflect.compare);
+		id = outVarsMap.get(vars.join(","));
+		if( id != null ) {
+			outVarsMap.set(key, id);
+			return id;
+		}
+		id = outVars.length;
+		outVars.push(vars);
+		outVarsMap.set(key, id);
+		return id;
+	}
+	
+	public function link( instances : Array<SharedShader.ShaderInstance>, outVars : Int ) {
+		var c = linkCache.get(outVars);
+		if( c == null ) {
+			c = new SearchMap();
+			linkCache.set(outVars, c);
+		}
+		for( i in instances ) {
+			if( c.next == null ) c.next = new Map();
+			var cs = c.next.get(i.id);
+			if( cs == null ) {
+				cs = new SearchMap();
+				c.next.set(i.id, cs);
+			}
+			c = cs;
+		}
+		if( c.linked != null )
+			return c.linked;
+		c.linked = new hxsl.Linker().link([for( s in instances ) s.shader], this.outVars[outVars]);
+		return c.linked;
+	}
+	
+	static var INST : Cache;
+	public static function get() : Cache {
+		var c = INST;
+		if( c == null )
+			INST = c = new Cache();
+		return c;
+	}
+	
+	public static function clear() {
+		INST = null;
+	}
+	
+}

+ 3 - 8
test/Test.hx

@@ -347,15 +347,10 @@ class Test {
 			new AnimatedUV(),
 		//	new Outline(),
 		];
-		
-		
-		
 		var globals = new hxsl.Globals();
-		
-		var instances = [for( s in shaders ) { s.updateConstants(globals); s.instance.shader; }];
-		
-		
-		var s = new hxsl.Linker().link(instances, ["output.position", "output.color"]);
+		var instances = [for( s in shaders ) { s.updateConstants(globals); s.instance; }];
+		var cache = hxsl.Cache.get();
+		var s = cache.link(instances, cache.allocOutputVars(["output.position", "output.color"]));
 		trace("\n"+hxsl.Printer.shaderToString(s));
 	}