From 036e2ebc35bf25faad66dab2b6f04e9df2d29f61 Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Fri, 17 Jan 2025 12:47:20 +0000 Subject: [PATCH 01/14] feat: Introduce FragDepth global for glsl and hlsl --- hxsl/Ast.hx | 1 + hxsl/Cache.hx | 53 ++++++++++++++++++++++++++++--------------------- hxsl/Checker.hx | 18 +++++++++++------ hxsl/GlslOut.hx | 1 + hxsl/HlslOut.hx | 3 ++- 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/hxsl/Ast.hx b/hxsl/Ast.hx index 6b73fbcc62..aa0423cf6e 100644 --- a/hxsl/Ast.hx +++ b/hxsl/Ast.hx @@ -291,6 +291,7 @@ enum TGlobal { InstanceID; // gl globals FragCoord; + FragDepth; FrontFacing; // bit casting FloatBitsToInt; diff --git a/hxsl/Cache.hx b/hxsl/Cache.hx index 8ccc7d3cdc..06920122e6 100644 --- a/hxsl/Cache.hx +++ b/hxsl/Cache.hx @@ -1,6 +1,6 @@ package hxsl; -using hxsl.Ast; import hxsl.RuntimeShader; +using hxsl.Ast; class BatchInstanceParams { @@ -55,6 +55,11 @@ class SearchMap { class Cache { + #if shader_debug_dump + public static var DEBUG_IDS = false; + public static var TRACE = true; + #end + var linkCache : SearchMap; var linkShaders : Map; var batchShaders : Map; @@ -243,10 +248,12 @@ class Cache { #if shader_debug_dump var shaderId = @:privateAccess RuntimeShader.UID; - #if ( js && !sys ) + var oldTrace = haxe.Log.trace; + #if js if( shaderId == 0 ) js.Syntax.code("window.shaders = [];"); js.Syntax.code("window.shaders[{0}] = '';", shaderId); - var dbg: { writeString: String->Void, close:Void->Void } = { + var dbg: { writeString: String->Void, close:Void->Void } = null; + dbg = { writeString: (str: String) -> { js.Syntax.code("window.shaders[{0}] += {1}", shaderId, str); }, close: () -> {} }; @@ -254,13 +261,13 @@ class Cache { if( shaderId == 0 ) try sys.FileSystem.createDirectory("shaders") catch( e : Dynamic ) {}; var dbg = sys.io.File.write("shaders/"+shaderId+"_dump.c"); #end - var oldTrace = haxe.Log.trace; + haxe.Log.trace = function(msg,?pos) dbg.writeString(haxe.Log.formatOutput(msg,pos)+"\n"); if( dbg != null ) { dbg.writeString("----- DATAS ----\n\n"); for( s in shaderDatas ) { dbg.writeString("\t\t**** " + s.inst.shader.name + (s.p == 0 ? "" : " P="+s.p)+ " *****\n"); - dbg.writeString(Printer.shaderToString(s.inst.shader,Debug.VAR_IDS)+"\n\n"); + dbg.writeString(Printer.shaderToString(s.inst.shader,DEBUG_IDS)+"\n\n"); } } //TRACE = shaderId == 0; @@ -293,17 +300,17 @@ class Cache { checkRec(v); } + #if debug + Printer.check(s,[for( s in shaderDatas ) s.inst.shader]); + #end + #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- LINK ----\n\n"); - dbg.writeString(Printer.shaderToString(s,Debug.VAR_IDS)+"\n\n"); + dbg.writeString(Printer.shaderToString(s,DEBUG_IDS)+"\n\n"); } #end - #if debug - Printer.check(s,[for( s in shaderDatas ) s.inst.shader]); - #end - var prev = s; var splitter = new hxsl.Splitter(); var sl = try splitter.split(s, mode == Batch ) catch( e : Error ) { e.msg += "\n\nin\n\n"+Printer.shaderToString(s); throw e; }; @@ -322,35 +329,35 @@ class Cache { } + #if debug + for( s in sl ) + Printer.check(s,[prev]); + #end + #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- SPLIT ----\n\n"); for( s in sl ) - dbg.writeString(Printer.shaderToString(s, Debug.VAR_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s, DEBUG_IDS) + "\n\n"); } #end - #if debug - for( s in sl ) - Printer.check(s,[prev]); - #end - var prev = sl; var sl = new hxsl.Dce().dce(sl); + #if debug + for( i => s in sl ) + Printer.check(s,[prev[i]]); + #end + #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- DCE ----\n\n"); for( s in sl ) - dbg.writeString(Printer.shaderToString(s, Debug.VAR_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s, DEBUG_IDS) + "\n\n"); } #end - #if debug - for( i => s in sl ) - Printer.check(s,[prev[i]]); - #end - var r = buildRuntimeShader(sl, paramVars); r.mode = mode; @@ -358,7 +365,7 @@ class Cache { if( dbg != null ) { dbg.writeString("----- FLATTEN ----\n\n"); for( s in r.getShaders() ) - dbg.writeString(Printer.shaderToString(s.data, Debug.VAR_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s.data, DEBUG_IDS) + "\n\n"); } #end diff --git a/hxsl/Checker.hx b/hxsl/Checker.hx index d55d5f9a22..f8a6f87c46 100644 --- a/hxsl/Checker.hx +++ b/hxsl/Checker.hx @@ -186,7 +186,7 @@ class Checker { ]; case ImageStore: []; - case VertexID, InstanceID, FragCoord, FrontFacing: + case VertexID, InstanceID, FragCoord, FrontFacing,FragDepth: null; case AtomicAdd: [{ args : [{ name : "buf", type : TBuffer(TInt, SConst(0), RW) },{ name : "index", type : TInt }, { name : "data", type : TInt }], ret : TInt }]; @@ -225,6 +225,7 @@ class Checker { globals.set("vertexID", { t : TInt, g : VertexID }); globals.set("instanceID", { t : TInt, g : InstanceID }); globals.set("fragCoord", { t : vec4, g : FragCoord }); + globals.set("fragDepth", { t : TFloat, g : FragDepth }); globals.set("frontFacing", { t : TBool, g : FrontFacing }); for( gname => vl in gvars ) globals.set(gname, { t : TStruct([ @@ -418,7 +419,13 @@ class Checker { case TArray(e, _): checkWrite(e); return; - default: + case TGlobal(g): + switch(g) { + case FragDepth: + return; + default: + } + default: } error("This expression cannot be assigned", e.p); } @@ -799,12 +806,11 @@ class Checker { checkConst(e); einit = e; } - if( v.type == null ) error("Type required for variable declaration", e.pos); - if( isImport && v.kind == Param ) - continue; - + if( v.type == null ) error("Type required for variable declaration", e.pos); if( vars.exists(v.name) ) error("Duplicate var decl '" + v.name + "'", e.pos); var v = makeVar(v, e.pos); + if( isImport && v.kind == Param ) + continue; switch( v.type ) { case TSampler(T3D, true), TRWTexture(T3D, true, _), TRWTexture(_,_,3): diff --git a/hxsl/GlslOut.hx b/hxsl/GlslOut.hx index daf30e09f5..a2cf628d93 100644 --- a/hxsl/GlslOut.hx +++ b/hxsl/GlslOut.hx @@ -67,6 +67,7 @@ class GlslOut { set(BVec3, "bvec3"); set(BVec4, "bvec4"); set(FragCoord, "gl_FragCoord"); + set(FragDepth, "gl_FragDepth"); set(FrontFacing, "gl_FrontFacing"); set(FloatBitsToUint, "_floatBitsToUint"); set(UintBitsToFloat, "_uintBitsToFloat"); diff --git a/hxsl/HlslOut.hx b/hxsl/HlslOut.hx index ce66cfcb2e..742bedb5eb 100644 --- a/hxsl/HlslOut.hx +++ b/hxsl/HlslOut.hx @@ -77,6 +77,7 @@ class HlslOut { m.set(BVec3, "bool3"); m.set(BVec4, "bool4"); m.set(FragCoord,"_in.__pos__"); + m.set(FragDepth,"SV_Depth"); m.set(FloatBitsToInt, "asint"); m.set(FloatBitsToUint, "asuint"); m.set(IntBitsToFloat, "asfloat"); @@ -458,7 +459,7 @@ class HlslOut { case TCall({ e : TGlobal(g = (Texel)) }, args): addValue(args[0], tabs); add(".Load("); - switch( args[0].t ) { + switch( args[1].t ) { case TSampler(dim,arr): var size = Tools.getDimSize(dim, arr) + 1; add("int"+size+"("); From 6c0f69699431042666d765b5c32714ec1ca75184 Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Fri, 17 Jan 2025 12:54:33 +0000 Subject: [PATCH 02/14] chore: Restore Cache --- hxsl/Cache.hx | 53 ++++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/hxsl/Cache.hx b/hxsl/Cache.hx index 06920122e6..8ccc7d3cdc 100644 --- a/hxsl/Cache.hx +++ b/hxsl/Cache.hx @@ -1,6 +1,6 @@ package hxsl; -import hxsl.RuntimeShader; using hxsl.Ast; +import hxsl.RuntimeShader; class BatchInstanceParams { @@ -55,11 +55,6 @@ class SearchMap { class Cache { - #if shader_debug_dump - public static var DEBUG_IDS = false; - public static var TRACE = true; - #end - var linkCache : SearchMap; var linkShaders : Map; var batchShaders : Map; @@ -248,12 +243,10 @@ class Cache { #if shader_debug_dump var shaderId = @:privateAccess RuntimeShader.UID; - var oldTrace = haxe.Log.trace; - #if js + #if ( js && !sys ) if( shaderId == 0 ) js.Syntax.code("window.shaders = [];"); js.Syntax.code("window.shaders[{0}] = '';", shaderId); - var dbg: { writeString: String->Void, close:Void->Void } = null; - dbg = { + var dbg: { writeString: String->Void, close:Void->Void } = { writeString: (str: String) -> { js.Syntax.code("window.shaders[{0}] += {1}", shaderId, str); }, close: () -> {} }; @@ -261,13 +254,13 @@ class Cache { if( shaderId == 0 ) try sys.FileSystem.createDirectory("shaders") catch( e : Dynamic ) {}; var dbg = sys.io.File.write("shaders/"+shaderId+"_dump.c"); #end - + var oldTrace = haxe.Log.trace; haxe.Log.trace = function(msg,?pos) dbg.writeString(haxe.Log.formatOutput(msg,pos)+"\n"); if( dbg != null ) { dbg.writeString("----- DATAS ----\n\n"); for( s in shaderDatas ) { dbg.writeString("\t\t**** " + s.inst.shader.name + (s.p == 0 ? "" : " P="+s.p)+ " *****\n"); - dbg.writeString(Printer.shaderToString(s.inst.shader,DEBUG_IDS)+"\n\n"); + dbg.writeString(Printer.shaderToString(s.inst.shader,Debug.VAR_IDS)+"\n\n"); } } //TRACE = shaderId == 0; @@ -300,17 +293,17 @@ class Cache { checkRec(v); } - #if debug - Printer.check(s,[for( s in shaderDatas ) s.inst.shader]); - #end - #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- LINK ----\n\n"); - dbg.writeString(Printer.shaderToString(s,DEBUG_IDS)+"\n\n"); + dbg.writeString(Printer.shaderToString(s,Debug.VAR_IDS)+"\n\n"); } #end + #if debug + Printer.check(s,[for( s in shaderDatas ) s.inst.shader]); + #end + var prev = s; var splitter = new hxsl.Splitter(); var sl = try splitter.split(s, mode == Batch ) catch( e : Error ) { e.msg += "\n\nin\n\n"+Printer.shaderToString(s); throw e; }; @@ -329,35 +322,35 @@ class Cache { } - #if debug - for( s in sl ) - Printer.check(s,[prev]); - #end - #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- SPLIT ----\n\n"); for( s in sl ) - dbg.writeString(Printer.shaderToString(s, DEBUG_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s, Debug.VAR_IDS) + "\n\n"); } #end - var prev = sl; - var sl = new hxsl.Dce().dce(sl); - #if debug - for( i => s in sl ) - Printer.check(s,[prev[i]]); + for( s in sl ) + Printer.check(s,[prev]); #end + var prev = sl; + var sl = new hxsl.Dce().dce(sl); + #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- DCE ----\n\n"); for( s in sl ) - dbg.writeString(Printer.shaderToString(s, DEBUG_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s, Debug.VAR_IDS) + "\n\n"); } #end + #if debug + for( i => s in sl ) + Printer.check(s,[prev[i]]); + #end + var r = buildRuntimeShader(sl, paramVars); r.mode = mode; @@ -365,7 +358,7 @@ class Cache { if( dbg != null ) { dbg.writeString("----- FLATTEN ----\n\n"); for( s in r.getShaders() ) - dbg.writeString(Printer.shaderToString(s.data, DEBUG_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s.data, Debug.VAR_IDS) + "\n\n"); } #end From ac24f56dd627dad60ad3ce2c1407e82204da2d76 Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Sat, 18 Jan 2025 12:40:23 +0000 Subject: [PATCH 03/14] fix: Remove some revert changes and apply special case for fragdepth --- hxsl/Cache.hx | 53 ++++++++++++++++++++++++++++--------------------- hxsl/Checker.hx | 12 +++-------- hxsl/HlslOut.hx | 2 +- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/hxsl/Cache.hx b/hxsl/Cache.hx index 8ccc7d3cdc..06920122e6 100644 --- a/hxsl/Cache.hx +++ b/hxsl/Cache.hx @@ -1,6 +1,6 @@ package hxsl; -using hxsl.Ast; import hxsl.RuntimeShader; +using hxsl.Ast; class BatchInstanceParams { @@ -55,6 +55,11 @@ class SearchMap { class Cache { + #if shader_debug_dump + public static var DEBUG_IDS = false; + public static var TRACE = true; + #end + var linkCache : SearchMap; var linkShaders : Map; var batchShaders : Map; @@ -243,10 +248,12 @@ class Cache { #if shader_debug_dump var shaderId = @:privateAccess RuntimeShader.UID; - #if ( js && !sys ) + var oldTrace = haxe.Log.trace; + #if js if( shaderId == 0 ) js.Syntax.code("window.shaders = [];"); js.Syntax.code("window.shaders[{0}] = '';", shaderId); - var dbg: { writeString: String->Void, close:Void->Void } = { + var dbg: { writeString: String->Void, close:Void->Void } = null; + dbg = { writeString: (str: String) -> { js.Syntax.code("window.shaders[{0}] += {1}", shaderId, str); }, close: () -> {} }; @@ -254,13 +261,13 @@ class Cache { if( shaderId == 0 ) try sys.FileSystem.createDirectory("shaders") catch( e : Dynamic ) {}; var dbg = sys.io.File.write("shaders/"+shaderId+"_dump.c"); #end - var oldTrace = haxe.Log.trace; + haxe.Log.trace = function(msg,?pos) dbg.writeString(haxe.Log.formatOutput(msg,pos)+"\n"); if( dbg != null ) { dbg.writeString("----- DATAS ----\n\n"); for( s in shaderDatas ) { dbg.writeString("\t\t**** " + s.inst.shader.name + (s.p == 0 ? "" : " P="+s.p)+ " *****\n"); - dbg.writeString(Printer.shaderToString(s.inst.shader,Debug.VAR_IDS)+"\n\n"); + dbg.writeString(Printer.shaderToString(s.inst.shader,DEBUG_IDS)+"\n\n"); } } //TRACE = shaderId == 0; @@ -293,17 +300,17 @@ class Cache { checkRec(v); } + #if debug + Printer.check(s,[for( s in shaderDatas ) s.inst.shader]); + #end + #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- LINK ----\n\n"); - dbg.writeString(Printer.shaderToString(s,Debug.VAR_IDS)+"\n\n"); + dbg.writeString(Printer.shaderToString(s,DEBUG_IDS)+"\n\n"); } #end - #if debug - Printer.check(s,[for( s in shaderDatas ) s.inst.shader]); - #end - var prev = s; var splitter = new hxsl.Splitter(); var sl = try splitter.split(s, mode == Batch ) catch( e : Error ) { e.msg += "\n\nin\n\n"+Printer.shaderToString(s); throw e; }; @@ -322,35 +329,35 @@ class Cache { } + #if debug + for( s in sl ) + Printer.check(s,[prev]); + #end + #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- SPLIT ----\n\n"); for( s in sl ) - dbg.writeString(Printer.shaderToString(s, Debug.VAR_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s, DEBUG_IDS) + "\n\n"); } #end - #if debug - for( s in sl ) - Printer.check(s,[prev]); - #end - var prev = sl; var sl = new hxsl.Dce().dce(sl); + #if debug + for( i => s in sl ) + Printer.check(s,[prev[i]]); + #end + #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- DCE ----\n\n"); for( s in sl ) - dbg.writeString(Printer.shaderToString(s, Debug.VAR_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s, DEBUG_IDS) + "\n\n"); } #end - #if debug - for( i => s in sl ) - Printer.check(s,[prev[i]]); - #end - var r = buildRuntimeShader(sl, paramVars); r.mode = mode; @@ -358,7 +365,7 @@ class Cache { if( dbg != null ) { dbg.writeString("----- FLATTEN ----\n\n"); for( s in r.getShaders() ) - dbg.writeString(Printer.shaderToString(s.data, Debug.VAR_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s.data, DEBUG_IDS) + "\n\n"); } #end diff --git a/hxsl/Checker.hx b/hxsl/Checker.hx index f8a6f87c46..8ab89382bc 100644 --- a/hxsl/Checker.hx +++ b/hxsl/Checker.hx @@ -419,13 +419,9 @@ class Checker { case TArray(e, _): checkWrite(e); return; - case TGlobal(g): - switch(g) { - case FragDepth: - return; - default: - } - default: + case TGlobal(FragDepth): + return; + default: } error("This expression cannot be assigned", e.p); } @@ -809,8 +805,6 @@ class Checker { if( v.type == null ) error("Type required for variable declaration", e.pos); if( vars.exists(v.name) ) error("Duplicate var decl '" + v.name + "'", e.pos); var v = makeVar(v, e.pos); - if( isImport && v.kind == Param ) - continue; switch( v.type ) { case TSampler(T3D, true), TRWTexture(T3D, true, _), TRWTexture(_,_,3): diff --git a/hxsl/HlslOut.hx b/hxsl/HlslOut.hx index 742bedb5eb..701e9d260d 100644 --- a/hxsl/HlslOut.hx +++ b/hxsl/HlslOut.hx @@ -459,7 +459,7 @@ class HlslOut { case TCall({ e : TGlobal(g = (Texel)) }, args): addValue(args[0], tabs); add(".Load("); - switch( args[1].t ) { + switch( args[0].t ) { case TSampler(dim,arr): var size = Tools.getDimSize(dim, arr) + 1; add("int"+size+"("); From 9ec179a05a9846c278e1e6b73ecb2f1182a699b0 Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Sat, 18 Jan 2025 12:41:59 +0000 Subject: [PATCH 04/14] fix: Restore broken code --- hxsl/Cache.hx | 53 ++++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/hxsl/Cache.hx b/hxsl/Cache.hx index 06920122e6..8ccc7d3cdc 100644 --- a/hxsl/Cache.hx +++ b/hxsl/Cache.hx @@ -1,6 +1,6 @@ package hxsl; -import hxsl.RuntimeShader; using hxsl.Ast; +import hxsl.RuntimeShader; class BatchInstanceParams { @@ -55,11 +55,6 @@ class SearchMap { class Cache { - #if shader_debug_dump - public static var DEBUG_IDS = false; - public static var TRACE = true; - #end - var linkCache : SearchMap; var linkShaders : Map; var batchShaders : Map; @@ -248,12 +243,10 @@ class Cache { #if shader_debug_dump var shaderId = @:privateAccess RuntimeShader.UID; - var oldTrace = haxe.Log.trace; - #if js + #if ( js && !sys ) if( shaderId == 0 ) js.Syntax.code("window.shaders = [];"); js.Syntax.code("window.shaders[{0}] = '';", shaderId); - var dbg: { writeString: String->Void, close:Void->Void } = null; - dbg = { + var dbg: { writeString: String->Void, close:Void->Void } = { writeString: (str: String) -> { js.Syntax.code("window.shaders[{0}] += {1}", shaderId, str); }, close: () -> {} }; @@ -261,13 +254,13 @@ class Cache { if( shaderId == 0 ) try sys.FileSystem.createDirectory("shaders") catch( e : Dynamic ) {}; var dbg = sys.io.File.write("shaders/"+shaderId+"_dump.c"); #end - + var oldTrace = haxe.Log.trace; haxe.Log.trace = function(msg,?pos) dbg.writeString(haxe.Log.formatOutput(msg,pos)+"\n"); if( dbg != null ) { dbg.writeString("----- DATAS ----\n\n"); for( s in shaderDatas ) { dbg.writeString("\t\t**** " + s.inst.shader.name + (s.p == 0 ? "" : " P="+s.p)+ " *****\n"); - dbg.writeString(Printer.shaderToString(s.inst.shader,DEBUG_IDS)+"\n\n"); + dbg.writeString(Printer.shaderToString(s.inst.shader,Debug.VAR_IDS)+"\n\n"); } } //TRACE = shaderId == 0; @@ -300,17 +293,17 @@ class Cache { checkRec(v); } - #if debug - Printer.check(s,[for( s in shaderDatas ) s.inst.shader]); - #end - #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- LINK ----\n\n"); - dbg.writeString(Printer.shaderToString(s,DEBUG_IDS)+"\n\n"); + dbg.writeString(Printer.shaderToString(s,Debug.VAR_IDS)+"\n\n"); } #end + #if debug + Printer.check(s,[for( s in shaderDatas ) s.inst.shader]); + #end + var prev = s; var splitter = new hxsl.Splitter(); var sl = try splitter.split(s, mode == Batch ) catch( e : Error ) { e.msg += "\n\nin\n\n"+Printer.shaderToString(s); throw e; }; @@ -329,35 +322,35 @@ class Cache { } - #if debug - for( s in sl ) - Printer.check(s,[prev]); - #end - #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- SPLIT ----\n\n"); for( s in sl ) - dbg.writeString(Printer.shaderToString(s, DEBUG_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s, Debug.VAR_IDS) + "\n\n"); } #end - var prev = sl; - var sl = new hxsl.Dce().dce(sl); - #if debug - for( i => s in sl ) - Printer.check(s,[prev[i]]); + for( s in sl ) + Printer.check(s,[prev]); #end + var prev = sl; + var sl = new hxsl.Dce().dce(sl); + #if shader_debug_dump if( dbg != null ) { dbg.writeString("----- DCE ----\n\n"); for( s in sl ) - dbg.writeString(Printer.shaderToString(s, DEBUG_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s, Debug.VAR_IDS) + "\n\n"); } #end + #if debug + for( i => s in sl ) + Printer.check(s,[prev[i]]); + #end + var r = buildRuntimeShader(sl, paramVars); r.mode = mode; @@ -365,7 +358,7 @@ class Cache { if( dbg != null ) { dbg.writeString("----- FLATTEN ----\n\n"); for( s in r.getShaders() ) - dbg.writeString(Printer.shaderToString(s.data, DEBUG_IDS) + "\n\n"); + dbg.writeString(Printer.shaderToString(s.data, Debug.VAR_IDS) + "\n\n"); } #end From abc4d10c3c38acda16d9904498530849979aea75 Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Sat, 18 Jan 2025 12:43:16 +0000 Subject: [PATCH 05/14] fix: More code reversion --- hxsl/Checker.hx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hxsl/Checker.hx b/hxsl/Checker.hx index 8ab89382bc..9bd9c2b8db 100644 --- a/hxsl/Checker.hx +++ b/hxsl/Checker.hx @@ -802,7 +802,10 @@ class Checker { checkConst(e); einit = e; } - if( v.type == null ) error("Type required for variable declaration", e.pos); + if( v.type == null ) error("Type required for variable declaration", e.pos); + if( isImport && v.kind == Param ) + continue; + if( vars.exists(v.name) ) error("Duplicate var decl '" + v.name + "'", e.pos); var v = makeVar(v, e.pos); From 95dfcffbd643d17a455c1010cbc5047ddaa97b61 Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Tue, 21 Jan 2025 12:55:04 +0000 Subject: [PATCH 06/14] Prevent linker from opt out fragDepth --- hxsl/Ast.hx | 2 ++ hxsl/Linker.hx | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hxsl/Ast.hx b/hxsl/Ast.hx index aa0423cf6e..d77f49dca2 100644 --- a/hxsl/Ast.hx +++ b/hxsl/Ast.hx @@ -523,6 +523,8 @@ class Tools { return hasSideEffect(it) || hasSideEffect(loop); case TArray(e, index): return hasSideEffect(e) || hasSideEffect(index); + case TGlobal(FragDepth): + return true; case TConst(_), TVar(_), TGlobal(_): return false; case TCall({ e : TGlobal(SetLayout) },_): diff --git a/hxsl/Linker.hx b/hxsl/Linker.hx index b16c608f66..e813a637fc 100644 --- a/hxsl/Linker.hx +++ b/hxsl/Linker.hx @@ -31,6 +31,7 @@ private class ShaderInfos { public var vertex : Null; public var onStack : Bool; public var hasDiscard : Bool; + public var hasFragDepth : Bool; public var isCompute : Bool; public var marked : Null; public function new(n, v) { @@ -201,6 +202,11 @@ class Linker { return { e : TVar(v.v), t : v.v.type, p : e.p }; case TBinop(op, e1, e2): switch( [op, e1.e] ) { + case [OpAssign, TGlobal(FragDepth)]: + if( curShader != null ) { + curShader.hasFragDepth = true; + } + return { e : TBinop(op, { e : TGlobal(FragDepth),t : TFloat, p : e.p }, e2), t : e.t, p : e.p }; case [OpAssign, TVar(v)] if( !locals.exists(v.id) ): var e2 = mapExprVar(e2); var v = allocVar(v, e1.p); @@ -414,7 +420,7 @@ class Linker { // force shaders containing discard to be included for( s in shaders ) - if( s.hasDiscard || s.isCompute ) { + if( s.hasDiscard || s.isCompute || s.hasFragDepth) { initDependencies(s); entry.deps.set(s, true); } From 21008892891ed79f329d5c6317a07a7000466791 Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Tue, 21 Jan 2025 13:00:21 +0000 Subject: [PATCH 07/14] Restore cache file --- hxsl/Cache.hx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hxsl/Cache.hx b/hxsl/Cache.hx index 8ccc7d3cdc..8c87e7c76e 100644 --- a/hxsl/Cache.hx +++ b/hxsl/Cache.hx @@ -243,11 +243,11 @@ class Cache { #if shader_debug_dump var shaderId = @:privateAccess RuntimeShader.UID; - #if ( js && !sys ) - if( shaderId == 0 ) js.Syntax.code("window.shaders = [];"); - js.Syntax.code("window.shaders[{0}] = '';", shaderId); + #if ( js && !sys && !hxnodejs ) + if( shaderId == 0 ) js.Syntax.code("window.shaders_debug_dump = [];"); + js.Syntax.code("window.shaders_debug_dump[{0}] = '';", shaderId); var dbg: { writeString: String->Void, close:Void->Void } = { - writeString: (str: String) -> { js.Syntax.code("window.shaders[{0}] += {1}", shaderId, str); }, + writeString: (str: String) -> { js.Syntax.code("window.shaders_debug_dump[{0}] += {1}", shaderId, str); }, close: () -> {} }; #else From 71834707fb943740214751deb266740566fee32e Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Tue, 21 Jan 2025 13:03:39 +0000 Subject: [PATCH 08/14] another restore --- hxsl/Cache.hx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hxsl/Cache.hx b/hxsl/Cache.hx index 8c87e7c76e..63e3551ab9 100644 --- a/hxsl/Cache.hx +++ b/hxsl/Cache.hx @@ -243,9 +243,9 @@ class Cache { #if shader_debug_dump var shaderId = @:privateAccess RuntimeShader.UID; - #if ( js && !sys && !hxnodejs ) - if( shaderId == 0 ) js.Syntax.code("window.shaders_debug_dump = [];"); - js.Syntax.code("window.shaders_debug_dump[{0}] = '';", shaderId); + #if ( js && !sys ) + if( shaderId == 0 ) js.Syntax.code("window.shaders = [];"); + js.Syntax.code("window.shaders[{0}] = '';", shaderId); var dbg: { writeString: String->Void, close:Void->Void } = { writeString: (str: String) -> { js.Syntax.code("window.shaders_debug_dump[{0}] += {1}", shaderId, str); }, close: () -> {} From c2336efbfabbc72cde981be923a19a791338de6c Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Tue, 21 Jan 2025 13:04:07 +0000 Subject: [PATCH 09/14] and another restore --- hxsl/Cache.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hxsl/Cache.hx b/hxsl/Cache.hx index 63e3551ab9..8ccc7d3cdc 100644 --- a/hxsl/Cache.hx +++ b/hxsl/Cache.hx @@ -247,7 +247,7 @@ class Cache { if( shaderId == 0 ) js.Syntax.code("window.shaders = [];"); js.Syntax.code("window.shaders[{0}] = '';", shaderId); var dbg: { writeString: String->Void, close:Void->Void } = { - writeString: (str: String) -> { js.Syntax.code("window.shaders_debug_dump[{0}] += {1}", shaderId, str); }, + writeString: (str: String) -> { js.Syntax.code("window.shaders[{0}] += {1}", shaderId, str); }, close: () -> {} }; #else From 7d9b83ad0200dd8cd460e0b058f3ea2b2d7baea3 Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Thu, 23 Jan 2025 10:47:17 +0000 Subject: [PATCH 10/14] Adding read dependency --- hxsl/Linker.hx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/hxsl/Linker.hx b/hxsl/Linker.hx index e813a637fc..92e700a2aa 100644 --- a/hxsl/Linker.hx +++ b/hxsl/Linker.hx @@ -202,10 +202,22 @@ class Linker { return { e : TVar(v.v), t : v.v.type, p : e.p }; case TBinop(op, e1, e2): switch( [op, e1.e] ) { - case [OpAssign, TGlobal(FragDepth)]: + case [OpAssign | OpAssignOp(_), TGlobal(FragDepth)]: if( curShader != null ) { curShader.hasFragDepth = true; } + + var e2 = mapExprVar(e2); + switch(e2.e) { + case TVar(v2): + var v2 = allocVar(v2,e2.p); + if( !curShader.readMap.exists(v2.id) ) { + curShader.readMap.set(v2.id, v2); + curShader.readVars.push(v2); + } + default: + } + return { e : TBinop(op, { e : TGlobal(FragDepth),t : TFloat, p : e.p }, e2), t : e.t, p : e.p }; case [OpAssign, TVar(v)] if( !locals.exists(v.id) ): var e2 = mapExprVar(e2); From 48ea6e03751ad0ed0b674f683e9f65a2516a6b4f Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Tue, 28 Jan 2025 15:45:46 +0000 Subject: [PATCH 11/14] DCE for fragdepth --- hxsl/Dce.hx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/hxsl/Dce.hx b/hxsl/Dce.hx index 3e85dbd989..5eb24f3a60 100644 --- a/hxsl/Dce.hx +++ b/hxsl/Dce.hx @@ -62,6 +62,7 @@ class Dce { var used : Map; var channelVars : Array; var markAsKeep : Bool; + var fragDepthId = Tools.allocVarId(); public function new() { } @@ -202,6 +203,29 @@ class Dce { link(v, writeTo); case TSwiz({ e : TVar(v) }, swiz): link(v, writeTo, swizBits(swiz)); + case TBinop(OpAssign | OpAssignOp(_), { e : TGlobal(FragDepth) }, e2 ): + var v:TVar = { + id: fragDepthId, + name: "FragDepth", + type: TFloat, + kind: Global, + }; + + var v = get(v); + v.keep = 15; + + switch(e.e) { + // Last assign will always clear all other dependencies + case TBinop(OpAssign,_,_): + v.adeps = []; + v.deps.clear(); + default: + } + + writeTo.push(v, 15); + check(e2, writeTo, isAffected); + writeTo.pop(); + case TBinop(OpAssign | OpAssignOp(_), { e : TVar(v) }, e): var v = get(v); writeTo.push(v,15); @@ -296,6 +320,8 @@ class Dce { count++; } return { e : TBlock(out), p : e.p, t : e.t }; + case TBinop(OpAssign | OpAssignOp(_), {e: TGlobal(FragDepth) },{e: TVar(v) }) if(get(v).used == 0): + return { e : TConst(CNull), t : e.t, p : e.p }; case TVarDecl(v,_) | TBinop(OpAssign | OpAssignOp(_), { e : (TVar(v) | TSwiz( { e : TVar(v) }, _) | TArray( { e : TVar(v) }, _)) }, _) if( get(v).used == 0 ): return { e : TConst(CNull), t : e.t, p : e.p }; case TBinop(OpAssign | OpAssignOp(_), { e : TSwiz( { e : TVar(v) }, swiz) }, _) if( get(v).used & swizBits(swiz) == 0 ): From f3a85f7d77f39ac027eb49563ad573328c60ceed Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Tue, 28 Jan 2025 15:56:28 +0000 Subject: [PATCH 12/14] Handle write only --- hxsl/Dce.hx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/hxsl/Dce.hx b/hxsl/Dce.hx index 5eb24f3a60..18c3876560 100644 --- a/hxsl/Dce.hx +++ b/hxsl/Dce.hx @@ -203,25 +203,28 @@ class Dce { link(v, writeTo); case TSwiz({ e : TVar(v) }, swiz): link(v, writeTo, swizBits(swiz)); - case TBinop(OpAssign | OpAssignOp(_), { e : TGlobal(FragDepth) }, e2 ): + case TBinop(op, { e : TGlobal(FragDepth) }, e2 ): var v:TVar = { id: fragDepthId, name: "FragDepth", type: TFloat, kind: Global, }; - var v = get(v); - v.keep = 15; - - switch(e.e) { + + switch(op) { // Last assign will always clear all other dependencies - case TBinop(OpAssign,_,_): + case OpAssign: v.adeps = []; v.deps.clear(); + case OpAssignOp(_): default: + // FragDepth is writeonly + return; } + v.keep = 15; + writeTo.push(v, 15); check(e2, writeTo, isAffected); writeTo.pop(); From e55cdccac724f135bd30fd14cf3ea13262ddb4cc Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Tue, 28 Jan 2025 16:00:19 +0000 Subject: [PATCH 13/14] code cleanup --- hxsl/Dce.hx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/hxsl/Dce.hx b/hxsl/Dce.hx index 18c3876560..382e81d6c0 100644 --- a/hxsl/Dce.hx +++ b/hxsl/Dce.hx @@ -211,7 +211,6 @@ class Dce { kind: Global, }; var v = get(v); - switch(op) { // Last assign will always clear all other dependencies case OpAssign: @@ -219,16 +218,12 @@ class Dce { v.deps.clear(); case OpAssignOp(_): default: - // FragDepth is writeonly return; } - v.keep = 15; - writeTo.push(v, 15); check(e2, writeTo, isAffected); writeTo.pop(); - case TBinop(OpAssign | OpAssignOp(_), { e : TVar(v) }, e): var v = get(v); writeTo.push(v,15); From b3fb037f99516a1e13b78755664b1b0417f70771 Mon Sep 17 00:00:00 2001 From: Rasmus Brinck Date: Thu, 6 Feb 2025 08:53:31 +0000 Subject: [PATCH 14/14] Remove DX try for FragDepth --- hxsl/HlslOut.hx | 1 - 1 file changed, 1 deletion(-) diff --git a/hxsl/HlslOut.hx b/hxsl/HlslOut.hx index 701e9d260d..ce66cfcb2e 100644 --- a/hxsl/HlslOut.hx +++ b/hxsl/HlslOut.hx @@ -77,7 +77,6 @@ class HlslOut { m.set(BVec3, "bool3"); m.set(BVec4, "bool4"); m.set(FragCoord,"_in.__pos__"); - m.set(FragDepth,"SV_Depth"); m.set(FloatBitsToInt, "asint"); m.set(FloatBitsToUint, "asuint"); m.set(IntBitsToFloat, "asfloat");