Browse Source

add -D debug_shader_cache option for DirectX

trethaller 3 years ago
parent
commit
9684e8a001
1 changed files with 24 additions and 0 deletions
  1. 24 0
      h3d/impl/DirectXDriver.hx

+ 24 - 0
h3d/impl/DirectXDriver.hx

@@ -71,6 +71,9 @@ class DirectXDriver extends h3d.impl.Driver {
 
 
 	public static var CACHE_FILE : { input : String, output : String } = null;
 	public static var CACHE_FILE : { input : String, output : String } = null;
 	var cacheFileData : Map<String,haxe.io.Bytes>;
 	var cacheFileData : Map<String,haxe.io.Bytes>;
+	#if debug_shader_cache
+	var cacheFileDebugData = new Map<String, String>();
+	#end
 
 
 	var driver : DriverInstance;
 	var driver : DriverInstance;
 	var shaders : Map<Int,CompiledShader>;
 	var shaders : Map<Int,CompiledShader>;
@@ -772,6 +775,16 @@ class DirectXDriver extends h3d.impl.Driver {
 						if( len < 0 || len > 4<<20 ) break;
 						if( len < 0 || len > 4<<20 ) break;
 						var str = cache.readString(len);
 						var str = cache.readString(len);
 						cacheFileData.set(key,haxe.crypto.Base64.decode(str));
 						cacheFileData.set(key,haxe.crypto.Base64.decode(str));
+						#if debug_shader_cache
+						var peek = @:privateAccess cache.b[cache.position];
+						if(peek != '\n'.code) {
+							cache.readByte(); // skip null marker
+							var len = cache.readInt32();
+							if( len < 0 || len > 4<<20 ) break;
+							var code = cache.readString(len);
+							cacheFileDebugData.set(key, code);
+						}
+						#end
 						cache.readByte(); // newline
 						cache.readByte(); // newline
 					}
 					}
 				}
 				}
@@ -828,6 +841,9 @@ class DirectXDriver extends h3d.impl.Driver {
 			var key = shaderVersion + haxe.crypto.Md5.encode(shader.code);
 			var key = shaderVersion + haxe.crypto.Md5.encode(shader.code);
 			if( cacheFileData.get(key) != bytes ) {
 			if( cacheFileData.get(key) != bytes ) {
 				cacheFileData.set(key, bytes);
 				cacheFileData.set(key, bytes);
+				#if debug_shader_cache
+				cacheFileDebugData.set(key, shader.code.split('\n').join('\\n'));
+				#end
 				if( CACHE_FILE != null ) {
 				if( CACHE_FILE != null ) {
 					var out = new haxe.io.BytesOutput();
 					var out = new haxe.io.BytesOutput();
 					var keys = Lambda.array({ iterator : cacheFileData.keys });
 					var keys = Lambda.array({ iterator : cacheFileData.keys });
@@ -838,6 +854,14 @@ class DirectXDriver extends h3d.impl.Driver {
 						var b64 = haxe.crypto.Base64.encode(cacheFileData.get(key));
 						var b64 = haxe.crypto.Base64.encode(cacheFileData.get(key));
 						out.writeInt32(b64.length);
 						out.writeInt32(b64.length);
 						out.writeString(b64);
 						out.writeString(b64);
+						#if debug_shader_cache
+						var s = cacheFileDebugData.get(key);
+						if(s != null) {
+							out.writeByte(0);
+							out.writeInt32(s.length);
+							out.writeString(s);
+						}
+						#end
 						out.writeByte('\n'.code);
 						out.writeByte('\n'.code);
 					}
 					}
 					try sys.io.File.saveBytes(CACHE_FILE.output, out.getBytes()) catch( e : Dynamic ) {};
 					try sys.io.File.saveBytes(CACHE_FILE.output, out.getBytes()) catch( e : Dynamic ) {};