Browse Source

move fill() functions from ShaderManager to RenderContext

Nicolas Cannasse 1 year ago
parent
commit
2c922a7702
6 changed files with 262 additions and 264 deletions
  1. 2 2
      h2d/RenderContext.hx
  2. 251 0
      h3d/impl/RenderContext.hx
  3. 3 4
      h3d/pass/Default.hx
  4. 5 4
      h3d/pass/ScreenFx.hx
  5. 0 252
      h3d/pass/ShaderManager.hx
  6. 1 2
      h3d/scene/RenderContext.hx

+ 2 - 2
h2d/RenderContext.hx

@@ -215,7 +215,7 @@ class RenderContext extends h3d.impl.RenderContext {
 			buffers = new h3d.shader.Buffers(compiledShader);
 		else
 			buffers.grow(compiledShader);
-		manager.fillGlobals(globals, buffers, compiledShader);
+		fillGlobals(buffers, compiledShader);
 		engine.selectShader(compiledShader);
 		engine.uploadShaderBuffers(buffers, Globals);
 	}
@@ -612,7 +612,7 @@ class RenderContext extends h3d.impl.RenderContext {
 					pass.blendSrc = One;
 			}
 		}
-		manager.fillParams(globals, buffers, compiledShader, currentShaders);
+		fillParams(buffers, compiledShader, currentShaders);
 		engine.selectMaterial(pass);
 		engine.uploadShaderBuffers(buffers, Params);
 		engine.uploadShaderBuffers(buffers, Textures);

+ 251 - 0
h3d/impl/RenderContext.hx

@@ -2,6 +2,8 @@ package h3d.impl;
 
 class RenderContext {
 
+	public static var STRICT = true;
+
 	public var engine : h3d.Engine;
 	public var time : Float;
 	public var elapsedTime : Float;
@@ -33,6 +35,255 @@ class RenderContext {
 		textures.dispose();
 	}
 
+	function fillRec( v : Dynamic, type : hxsl.Ast.Type, out : #if hl hl.BytesAccess<hl.F32> #else h3d.shader.Buffers.ShaderBufferData #end, pos : Int ) {
+		switch( type ) {
+		case TInt:
+			out[pos] = v;
+			return 1;
+		case TFloat:
+			out[pos] = v;
+			return 1;
+		case TVec(4, _):
+			var v : hxsl.Types.Vec4 = v;
+			out[pos++] = v.x;
+			out[pos++] = v.y;
+			out[pos++] = v.z;
+			out[pos++] = v.w;
+			return 4;
+		case TVec(n, _):
+			var v : hxsl.Types.Vec = v;
+			out[pos++] = v.x;
+			out[pos++] = v.y;
+			if( n == 3 )
+				out[pos++] = v.z;
+			return n;
+		case TMat4:
+			var m : h3d.Matrix = v;
+			out[pos++] = m._11;
+			out[pos++] = m._21;
+			out[pos++] = m._31;
+			out[pos++] = m._41;
+			out[pos++] = m._12;
+			out[pos++] = m._22;
+			out[pos++] = m._32;
+			out[pos++] = m._42;
+			out[pos++] = m._13;
+			out[pos++] = m._23;
+			out[pos++] = m._33;
+			out[pos++] = m._43;
+			out[pos++] = m._14;
+			out[pos++] = m._24;
+			out[pos++] = m._34;
+			out[pos++] = m._44;
+			return 16;
+		case TMat3x4:
+			var m : h3d.Matrix = v;
+			out[pos++] = m._11;
+			out[pos++] = m._21;
+			out[pos++] = m._31;
+			out[pos++] = m._41;
+			out[pos++] = m._12;
+			out[pos++] = m._22;
+			out[pos++] = m._32;
+			out[pos++] = m._42;
+			out[pos++] = m._13;
+			out[pos++] = m._23;
+			out[pos++] = m._33;
+			out[pos++] = m._43;
+			return 12;
+		case TMat3:
+			var m : h3d.Matrix = v;
+			out[pos++] = m._11;
+			out[pos++] = m._21;
+			out[pos++] = m._31;
+			out[pos++] = 0;
+			out[pos++] = m._12;
+			out[pos++] = m._22;
+			out[pos++] = m._32;
+			out[pos++] = 0;
+			out[pos++] = m._13;
+			out[pos++] = m._23;
+			out[pos++] = m._33;
+			out[pos++] = 0;
+			return 12;
+		case TArray(TVec(4,VFloat), SConst(len)):
+			var v : Array<h3d.Vector4> = v;
+			for( i in 0...len ) {
+				var n = v[i];
+				if( n == null ) break;
+				out[pos++] = n.x;
+				out[pos++] = n.y;
+				out[pos++] = n.z;
+				out[pos++] = n.w;
+			}
+			return len * 4;
+		case TArray(TMat3x4, SConst(len)):
+			var v : Array<h3d.Matrix> = v;
+			for( i in 0...len ) {
+				var m = v[i];
+				if( m == null ) break;
+				out[pos++] = m._11;
+				out[pos++] = m._21;
+				out[pos++] = m._31;
+				out[pos++] = m._41;
+				out[pos++] = m._12;
+				out[pos++] = m._22;
+				out[pos++] = m._32;
+				out[pos++] = m._42;
+				out[pos++] = m._13;
+				out[pos++] = m._23;
+				out[pos++] = m._33;
+				out[pos++] = m._43;
+			}
+			return len * 12;
+		case TArray(TFloat, SConst(len)):
+			var v : Array<Float> = v;
+			var size = 0;
+			var count = v.length < len ? v.length : len;
+			for( i in 0...count )
+				out[pos++] = v[i];
+			return len;
+		case TArray(t, SConst(len)):
+			var v : Array<Dynamic> = v;
+			var size = 0;
+			for( i in 0...len ) {
+				var n = v[i];
+				if( n == null ) break;
+				size = fillRec(n, t, out, pos);
+				pos += size;
+			}
+			return len * size;
+		case TStruct(vl):
+			var tot = 0;
+			for( vv in vl )
+				tot += fillRec(Reflect.field(v, vv.name), vv.type, out, pos + tot);
+			return tot;
+		default:
+			throw "assert " + type;
+		}
+		return 0;
+	}
+
+	function shaderInfo( shaders : hxsl.ShaderList, path : String ) {
+		var name = path.split(".").pop();
+		while( shaders != null ) {
+			var inst = @:privateAccess shaders.s.instance;
+			for( v in inst.shader.vars )
+				if( v.name == name )
+					return shaders.s.toString();
+			shaders = shaders.next;
+		}
+		return "(not found)";
+	}
+
+	inline function getPtr( data : h3d.shader.Buffers.ShaderBufferData ) {
+		#if hl
+		return (hl.Bytes.getArray((cast data : Array<Single>)) : hl.BytesAccess<hl.F32>);
+		#else
+		return data;
+		#end
+	}
+
+	public inline function getParamValue( p : hxsl.RuntimeShader.AllocParam, shaders : hxsl.ShaderList, opt = false ) : Dynamic {
+		if( p.perObjectGlobal != null ) {
+			var v : Dynamic = globals.fastGet(p.perObjectGlobal.gid);
+			if( v == null ) throw "Missing global value " + p.perObjectGlobal.path+" for shader "+shaderInfo(shaders,p.perObjectGlobal.path);
+			if( p.type.match(TChannel(_)) )
+				return v.texture;
+			return v;
+		}
+		var si = shaders;
+		var n = p.instance;
+		while( --n > 0 ) si = si.next;
+		var v = si.s.getParamValue(p.index);
+		if( v == null && !opt ) throw "Missing param value " + si.s + "." + p.name;
+		return v;
+	}
+
+	public function fillGlobals( buf : h3d.shader.Buffers, s : hxsl.RuntimeShader ) {
+		inline function fill(buf:h3d.shader.Buffers.ShaderBuffers, s:hxsl.RuntimeShader.RuntimeShaderData) {
+			var g = s.globals;
+			var ptr = getPtr(buf.globals);
+			while( g != null ) {
+				var v = globals.fastGet(g.gid);
+				if( v == null )
+					throw "Missing global value " + g.path;
+				fillRec(v, g.type, ptr, g.pos);
+				g = g.next;
+			}
+		}
+		fill(buf.vertex, s.vertex);
+		fill(buf.fragment, s.fragment);
+	}
+
+	public function fillParams( buf : h3d.shader.Buffers, s : hxsl.RuntimeShader, shaders : hxsl.ShaderList ) {
+		var curInstance = -1;
+		var curInstanceValue = null;
+		inline function getInstance( index : Int ) {
+			if( curInstance == index )
+				return curInstanceValue;
+			var si = shaders;
+			curInstance = index;
+			while( --index > 0 ) si = si.next;
+			curInstanceValue = si.s;
+			return curInstanceValue;
+		}
+		inline function getParamValue( p : hxsl.RuntimeShader.AllocParam, shaders : hxsl.ShaderList, opt = false ) : Dynamic {
+			if( p.perObjectGlobal != null ) {
+				var v : Dynamic = globals.fastGet(p.perObjectGlobal.gid);
+				if( v == null ) throw "Missing global value " + p.perObjectGlobal.path+" for shader "+shaderInfo(shaders,p.perObjectGlobal.path);
+				if( p.type.match(TChannel(_)) )
+					return v.texture;
+				return v;
+			}
+			var v = getInstance(p.instance).getParamValue(p.index);
+			if( v == null && !opt ) throw "Missing param value " + shaders.s + "." + p.name;
+			return v;
+		}
+		inline function fill(buf:h3d.shader.Buffers.ShaderBuffers, s:hxsl.RuntimeShader.RuntimeShaderData) {
+			var p = s.params;
+			var ptr = getPtr(buf.params);
+			while( p != null ) {
+				var v : Dynamic;
+				if( p.perObjectGlobal == null ) {
+					if( p.type == TFloat ) {
+						var i = getInstance(p.instance);
+						ptr[p.pos] = i.getParamFloatValue(p.index);
+						p = p.next;
+						continue;
+					}
+					v = getInstance(p.instance).getParamValue(p.index);
+					if( v == null ) throw "Missing param value " + curInstanceValue + "." + p.name;
+				} else
+					v = getParamValue(p, shaders);
+				fillRec(v, p.type, ptr, p.pos);
+				p = p.next;
+			}
+			var tid = 0;
+			var p = s.textures;
+			while( p != null ) {
+				var t : Dynamic = getParamValue(p, shaders, !STRICT);
+				if( p.pos < 0 ) {
+					// is array !
+					var arr : Array<h3d.mat.Texture> = t;
+					for( i in 0...-p.pos )
+						buf.tex[tid++] = arr[i];
+				} else
+					buf.tex[tid++] = t;
+				p = p.next;
+			}
+			var p = s.buffers;
+			var bid = 0;
+			while( p != null ) {
+				var b : h3d.Buffer = getParamValue(p, shaders, !STRICT);
+				buf.buffers[bid++] = b;
+				p = p.next;
+			}
+		}
+		fill(buf.vertex, s.vertex);
+		fill(buf.fragment, s.fragment);
+	}
+
 	static var inst : RenderContext;
 	public static function get() return inst;
 	public static inline function getType<T:RenderContext>( cl : Class<h3d.impl.RenderContext> ) {

+ 3 - 4
h3d/pass/Default.hx

@@ -74,7 +74,7 @@ class Default extends Base {
 			if( t == null || t.type.match(TArray(_)) )
 				p.texture = 0;
 			else {
-				var t : h3d.mat.Texture = manager.getParamValue(ctx.globals, t, shaders, true);
+				var t : h3d.mat.Texture = ctx.getParamValue(t, shaders, true);
 				p.texture = t == null ? 0 : t.id;
 			}
 		}
@@ -103,7 +103,6 @@ class Default extends Base {
 			defaultSort(passes);
 		else
 			sort(passes);
-		ctx.currentManager = manager;
 		var buf = ctx.shaderBuffers, prevShader = null;
 		for( p in passes ) {
 			#if sceneprof h3d.impl.SceneProf.mark(p.obj); #end
@@ -126,11 +125,11 @@ class Default extends Base {
 					buf = ctx.shaderBuffers = new h3d.shader.Buffers(p.shader);
 				else
 					buf.grow(p.shader);
-				manager.fillGlobals(ctx.globals, buf, p.shader);
+				ctx.fillGlobals(buf, p.shader);
 				ctx.engine.uploadShaderBuffers(buf, Globals);
 			}
 			if( !p.pass.dynamicParameters ) {
-				manager.fillParams(ctx.globals, buf, p.shader, p.shaders);
+				ctx.fillParams(buf, p.shader, p.shaders);
 				ctx.engine.uploadShaderBuffers(buf, Params);
 				ctx.engine.uploadShaderBuffers(buf, Textures);
 				ctx.engine.uploadShaderBuffers(buf, Buffers);

+ 5 - 4
h3d/pass/ScreenFx.hx

@@ -45,16 +45,17 @@ class ScreenFx<T:h3d.shader.ScreenShader> {
 		shader.flipY = engine.driver.hasFeature(BottomLeftCoords) && engine.getCurrentTarget() != null ? -1 : 1;
 		var shaders = @:privateAccess pass.shaders;
 		var ctx = h3d.impl.RenderContext.get();
-		var globals = ctx == null ? new hxsl.Globals() : ctx.globals;
-		var rts = manager.compileShaders(globals, shaders);
+		if( ctx == null )
+			throw "Missing render context";
+		var rts = manager.compileShaders(ctx.globals, shaders);
 		engine.selectMaterial(pass);
 		engine.selectShader(rts);
 		if( buffers == null )
 			buffers = new h3d.shader.Buffers(rts);
 		else
 			buffers.grow(rts);
-		manager.fillGlobals(globals, buffers, rts);
-		manager.fillParams(globals, buffers, rts, shaders);
+		ctx.fillGlobals(buffers, rts);
+		ctx.fillParams(buffers, rts, shaders);
 		engine.uploadShaderBuffers(buffers, Globals);
 		engine.uploadShaderBuffers(buffers, Params);
 		engine.uploadShaderBuffers(buffers, Textures);

+ 0 - 252
h3d/pass/ShaderManager.hx

@@ -2,8 +2,6 @@ package h3d.pass;
 
 class ShaderManager {
 
-	public static var STRICT = true;
-
 	var shaderCache : hxsl.Cache;
 	var currentOutput : hxsl.ShaderList;
 
@@ -18,256 +16,6 @@ class ShaderManager {
 		currentOutput.s = shaderCache.getLinkShader(output);
 	}
 
-	@:noDebug
-	function fillRec( v : Dynamic, type : hxsl.Ast.Type, out : #if hl hl.BytesAccess<hl.F32> #else h3d.shader.Buffers.ShaderBufferData #end, pos : Int ) {
-		switch( type ) {
-		case TInt:
-			out[pos] = v;
-			return 1;
-		case TFloat:
-			out[pos] = v;
-			return 1;
-		case TVec(4, _):
-			var v : hxsl.Types.Vec4 = v;
-			out[pos++] = v.x;
-			out[pos++] = v.y;
-			out[pos++] = v.z;
-			out[pos++] = v.w;
-			return 4;
-		case TVec(n, _):
-			var v : hxsl.Types.Vec = v;
-			out[pos++] = v.x;
-			out[pos++] = v.y;
-			if( n == 3 )
-				out[pos++] = v.z;
-			return n;
-		case TMat4:
-			var m : h3d.Matrix = v;
-			out[pos++] = m._11;
-			out[pos++] = m._21;
-			out[pos++] = m._31;
-			out[pos++] = m._41;
-			out[pos++] = m._12;
-			out[pos++] = m._22;
-			out[pos++] = m._32;
-			out[pos++] = m._42;
-			out[pos++] = m._13;
-			out[pos++] = m._23;
-			out[pos++] = m._33;
-			out[pos++] = m._43;
-			out[pos++] = m._14;
-			out[pos++] = m._24;
-			out[pos++] = m._34;
-			out[pos++] = m._44;
-			return 16;
-		case TMat3x4:
-			var m : h3d.Matrix = v;
-			out[pos++] = m._11;
-			out[pos++] = m._21;
-			out[pos++] = m._31;
-			out[pos++] = m._41;
-			out[pos++] = m._12;
-			out[pos++] = m._22;
-			out[pos++] = m._32;
-			out[pos++] = m._42;
-			out[pos++] = m._13;
-			out[pos++] = m._23;
-			out[pos++] = m._33;
-			out[pos++] = m._43;
-			return 12;
-		case TMat3:
-			var m : h3d.Matrix = v;
-			out[pos++] = m._11;
-			out[pos++] = m._21;
-			out[pos++] = m._31;
-			out[pos++] = 0;
-			out[pos++] = m._12;
-			out[pos++] = m._22;
-			out[pos++] = m._32;
-			out[pos++] = 0;
-			out[pos++] = m._13;
-			out[pos++] = m._23;
-			out[pos++] = m._33;
-			out[pos++] = 0;
-			return 12;
-		case TArray(TVec(4,VFloat), SConst(len)):
-			var v : Array<h3d.Vector4> = v;
-			for( i in 0...len ) {
-				var n = v[i];
-				if( n == null ) break;
-				out[pos++] = n.x;
-				out[pos++] = n.y;
-				out[pos++] = n.z;
-				out[pos++] = n.w;
-			}
-			return len * 4;
-		case TArray(TMat3x4, SConst(len)):
-			var v : Array<h3d.Matrix> = v;
-			for( i in 0...len ) {
-				var m = v[i];
-				if( m == null ) break;
-				out[pos++] = m._11;
-				out[pos++] = m._21;
-				out[pos++] = m._31;
-				out[pos++] = m._41;
-				out[pos++] = m._12;
-				out[pos++] = m._22;
-				out[pos++] = m._32;
-				out[pos++] = m._42;
-				out[pos++] = m._13;
-				out[pos++] = m._23;
-				out[pos++] = m._33;
-				out[pos++] = m._43;
-			}
-			return len * 12;
-		case TArray(TFloat, SConst(len)):
-			var v : Array<Float> = v;
-			var size = 0;
-			var count = v.length < len ? v.length : len;
-			for( i in 0...count )
-				out[pos++] = v[i];
-			return len;
-		case TArray(t, SConst(len)):
-			var v : Array<Dynamic> = v;
-			var size = 0;
-			for( i in 0...len ) {
-				var n = v[i];
-				if( n == null ) break;
-				size = fillRec(n, t, out, pos);
-				pos += size;
-			}
-			return len * size;
-		case TStruct(vl):
-			var tot = 0;
-			for( vv in vl )
-				tot += fillRec(Reflect.field(v, vv.name), vv.type, out, pos + tot);
-			return tot;
-		default:
-			throw "assert " + type;
-		}
-		return 0;
-	}
-
-	function shaderInfo( shaders : hxsl.ShaderList, path : String ) {
-		var name = path.split(".").pop();
-		while( shaders != null ) {
-			var inst = @:privateAccess shaders.s.instance;
-			for( v in inst.shader.vars )
-				if( v.name == name )
-					return shaders.s.toString();
-			shaders = shaders.next;
-		}
-		return "(not found)";
-	}
-
-	inline function getPtr( data : h3d.shader.Buffers.ShaderBufferData ) {
-		#if hl
-		return (hl.Bytes.getArray((cast data : Array<Single>)) : hl.BytesAccess<hl.F32>);
-		#else
-		return data;
-		#end
-	}
-
-	public inline function getParamValue( globals : hxsl.Globals, p : hxsl.RuntimeShader.AllocParam, shaders : hxsl.ShaderList, opt = false ) : Dynamic {
-		if( p.perObjectGlobal != null ) {
-			var v : Dynamic = globals.fastGet(p.perObjectGlobal.gid);
-			if( v == null ) throw "Missing global value " + p.perObjectGlobal.path+" for shader "+shaderInfo(shaders,p.perObjectGlobal.path);
-			if( p.type.match(TChannel(_)) )
-				return v.texture;
-			return v;
-		}
-		var si = shaders;
-		var n = p.instance;
-		while( --n > 0 ) si = si.next;
-		var v = si.s.getParamValue(p.index);
-		if( v == null && !opt ) throw "Missing param value " + si.s + "." + p.name;
-		return v;
-	}
-
-	public function fillGlobals( globals : hxsl.Globals, buf : h3d.shader.Buffers, s : hxsl.RuntimeShader ) {
-		inline function fill(buf:h3d.shader.Buffers.ShaderBuffers, s:hxsl.RuntimeShader.RuntimeShaderData) {
-			var g = s.globals;
-			var ptr = getPtr(buf.globals);
-			while( g != null ) {
-				var v = globals.fastGet(g.gid);
-				if( v == null )
-					throw "Missing global value " + g.path;
-				fillRec(v, g.type, ptr, g.pos);
-				g = g.next;
-			}
-		}
-		fill(buf.vertex, s.vertex);
-		fill(buf.fragment, s.fragment);
-	}
-
-	public function fillParams( globals : hxsl.Globals, buf : h3d.shader.Buffers, s : hxsl.RuntimeShader, shaders : hxsl.ShaderList ) {
-		var curInstance = -1;
-		var curInstanceValue = null;
-		inline function getInstance( index : Int ) {
-			if( curInstance == index )
-				return curInstanceValue;
-			var si = shaders;
-			curInstance = index;
-			while( --index > 0 ) si = si.next;
-			curInstanceValue = si.s;
-			return curInstanceValue;
-		}
-		inline function getParamValue( p : hxsl.RuntimeShader.AllocParam, shaders : hxsl.ShaderList, opt = false ) : Dynamic {
-			if( p.perObjectGlobal != null ) {
-				var v : Dynamic = globals.fastGet(p.perObjectGlobal.gid);
-				if( v == null ) throw "Missing global value " + p.perObjectGlobal.path+" for shader "+shaderInfo(shaders,p.perObjectGlobal.path);
-				if( p.type.match(TChannel(_)) )
-					return v.texture;
-				return v;
-			}
-			var v = getInstance(p.instance).getParamValue(p.index);
-			if( v == null && !opt ) throw "Missing param value " + shaders.s + "." + p.name;
-			return v;
-		}
-		inline function fill(buf:h3d.shader.Buffers.ShaderBuffers, s:hxsl.RuntimeShader.RuntimeShaderData) {
-			var p = s.params;
-			var ptr = getPtr(buf.params);
-			while( p != null ) {
-				var v : Dynamic;
-				if( p.perObjectGlobal == null ) {
-					if( p.type == TFloat ) {
-						var i = getInstance(p.instance);
-						ptr[p.pos] = i.getParamFloatValue(p.index);
-						p = p.next;
-						continue;
-					}
-					v = getInstance(p.instance).getParamValue(p.index);
-					if( v == null ) throw "Missing param value " + curInstanceValue + "." + p.name;
-				} else
-					v = getParamValue(p, shaders);
-				fillRec(v, p.type, ptr, p.pos);
-				p = p.next;
-			}
-			var tid = 0;
-			var p = s.textures;
-			while( p != null ) {
-				var t : Dynamic = getParamValue(p, shaders, !STRICT);
-				if( p.pos < 0 ) {
-					// is array !
-					var arr : Array<h3d.mat.Texture> = t;
-					for( i in 0...-p.pos )
-						buf.tex[tid++] = arr[i];
-				} else
-					buf.tex[tid++] = t;
-				p = p.next;
-			}
-			var p = s.buffers;
-			var bid = 0;
-			while( p != null ) {
-				var b : h3d.Buffer = getParamValue(p, shaders, !STRICT);
-				buf.buffers[bid++] = b;
-				p = p.next;
-			}
-		}
-		fill(buf.vertex, s.vertex);
-		fill(buf.fragment, s.fragment);
-	}
-
 	public function compileShaders( globals : hxsl.Globals, shaders : hxsl.ShaderList, mode : hxsl.Linker.LinkMode = Default ) {
 		globals.resetChannels();
 		for( s in shaders ) s.updateConstants(globals);

+ 1 - 2
h3d/scene/RenderContext.hx

@@ -32,7 +32,6 @@ class RenderContext extends h3d.impl.RenderContext {
 	var cachedPos : Int;
 	var passes : Array<h3d.pass.PassObject>;
 	var lights : Light;
-	var currentManager : h3d.pass.ShaderManager;
 
 	public function new() {
 		super();
@@ -111,7 +110,7 @@ class RenderContext extends h3d.impl.RenderContext {
 	}
 
 	public function uploadParams() {
-		currentManager.fillParams(globals, shaderBuffers, drawPass.shader, drawPass.shaders);
+		fillParams(shaderBuffers, drawPass.shader, drawPass.shaders);
 		engine.uploadShaderBuffers(shaderBuffers, Params);
 		engine.uploadShaderBuffers(shaderBuffers, Textures);
 		engine.uploadShaderBuffers(shaderBuffers, Buffers);