浏览代码

handle global channels + a few renames

Nicolas Cannnasse 8 年之前
父节点
当前提交
db45bbf6b9
共有 6 个文件被更改,包括 56 次插入33 次删除
  1. 3 1
      h3d/shader/Manager.hx
  2. 11 0
      hxsl/Channel.hx
  3. 18 16
      hxsl/Eval.hx
  4. 4 4
      hxsl/Macros.hx
  5. 18 0
      hxsl/Shader.hx
  6. 2 12
      hxsl/Types.hx

+ 3 - 1
h3d/shader/Manager.hx

@@ -142,8 +142,10 @@ class Manager {
 
 	public inline function getParamValue( p : hxsl.RuntimeShader.AllocParam, shaders : hxsl.ShaderList, opt = false ) : Dynamic {
 		if( p.perObjectGlobal != null ) {
-			var v = globals.fastGet(p.perObjectGlobal.gid);
+			var v : Dynamic = globals.fastGet(p.perObjectGlobal.gid);
 			if( v == null ) throw "Missing global value " + p.perObjectGlobal.path;
+			if( p.type.match(TChannel(_)) )
+				return v.texture;
 			return v;
 		}
 		var si = shaders;

+ 11 - 0
hxsl/Channel.hx

@@ -0,0 +1,11 @@
+package hxsl;
+
+enum Channel {
+	Unknown;
+	R;
+	G;
+	B;
+	A;
+	PackedFloat;
+	PackedNormal;
+}

+ 18 - 16
hxsl/Eval.hx

@@ -12,7 +12,7 @@ class Eval {
 	public var inlineCalls : Bool;
 	public var unrollLoops : Bool;
 	public var eliminateConditionals : Bool;
-	var constants : Map<TVar,TExprDef>;
+	var constants : Map<Int,TExprDef>;
 	var funMap : Map<TVar,TFunction>;
 	var curFun : TFunction;
 
@@ -23,7 +23,7 @@ class Eval {
 	}
 
 	public function setConstant( v : TVar, c : Const ) {
-		constants.set(v, TConst(c));
+		constants.set(v.id, TConst(c));
 	}
 
 	function mapVar( v : TVar ) {
@@ -39,11 +39,12 @@ class Eval {
 		}
 
 		v2 = {
-			id : Tools.allocVarId(),
+			id : v.type.match(TChannel(_)) ? v.id : Tools.allocVarId(),
 			name : v.name,
 			type : v.type,
 			kind : v.kind,
 		};
+
 		if( v.parent != null ) v2.parent = mapVar(v.parent);
 		if( v.qualifiers != null ) v2.qualifiers = v.qualifiers.copy();
 		varMap.set(v, v2);
@@ -52,7 +53,7 @@ class Eval {
 		case TStruct(vl):
 			v2.type = TStruct([for( v in vl ) mapVar(v)]);
 		case TArray(t, SVar(vs)):
-			var c = constants.get(vs);
+			var c = constants.get(vs.id);
 			if( c != null )
 				switch( c ) {
 				case TConst(CInt(v)):
@@ -165,14 +166,11 @@ class Eval {
 		case [ChannelRead, [ { e : TConst(CInt(i)) }, uv ]]:
 			var channel = oldArgs[0];
 			channel.e = switch( channel.e ) {
-			case TVar(v):
-				var v2 = mapVar(v);
-				constants.set(v2, constants.get(v));
-				TVar(v2);
+			case TVar(v): TVar(mapVar(v));
 			default: throw "assert";
 			};
 			var count = switch( channel.t ) { case TChannel(i): i; default: throw "assert"; };
-			var channelMode = hxsl.Types.ChannelSelect.createByIndex(i & 7);
+			var channelMode = hxsl.Channel.createByIndex(i & 7);
 			var tget = {
 				e : TCall({ e : TGlobal(ChannelRead), t : TVoid, p : pos }, [channel, uv, { e : TConst(CInt(i >> 3)), t : TInt, p : pos }]),
 				t : TVoid,
@@ -192,16 +190,20 @@ class Eval {
 				return TCall({ e : TGlobal(UnpackNormal), t:TVoid, p:pos}, [tget]);
 			}
 		case [ChannelRead, [t,_]]:
-			Error.t("Cannot eval complex channel " + Printer.toString(t,true), pos);
+			Error.t("Cannot eval complex channel " + Printer.toString(t,true)+" "+constantsToString(), pos);
 		default: null;
 		}
 	}
 
+	function constantsToString() {
+		return [for( c in constants.keys() ) c + " => " + Printer.toString({ e : constants.get(c), t : TVoid, p : null }, true)].toString();
+	}
+
 	function evalExpr( e : TExpr, isVal = true ) : TExpr {
 		var d : TExprDef = switch( e.e ) {
 		case TGlobal(_), TConst(_): e.e;
 		case TVar(v):
-			var c = constants.get(v);
+			var c = constants.get(v.id);
 			if( c != null )
 				c;
 			else {
@@ -241,9 +243,9 @@ class Eval {
 					var e = args[i];
 					switch( e.e ) {
 					case TConst(_), TVar({ kind : (Input|Param|Global) }):
-						var old = constants.get(v);
-						undo.push(function() old == null ? constants.remove(v) : constants.set(v, old));
-						constants.set(v, e.e);
+						var old = constants.get(v.id);
+						undo.push(function() old == null ? constants.remove(v.id) : constants.set(v.id, old));
+						constants.set(v.id, e.e);
 					default:
 						var old = varMap.get(v);
 						if( old == null )
@@ -410,10 +412,10 @@ class Eval {
 			case TBinop(OpInterval, { e : TConst(CInt(start)) }, { e : TConst(CInt(len)) } ) if( unrollLoops ):
 				var out = [];
 				for( i in start...len ) {
-					constants.set(v, TConst(CInt(i)));
+					constants.set(v.id, TConst(CInt(i)));
 					out.push(evalExpr(loop,false));
 				}
-				constants.remove(v);
+				constants.remove(v.id);
 				TBlock(out);
 			default:
 				TFor(v2, it, evalExpr(loop,false));

+ 4 - 4
hxsl/Macros.hx

@@ -23,7 +23,7 @@ class Macros {
 			for( v in vl ) {
 				fields.push({ pos : pos, name : v.name, kind : FVar(makeType(v.type)) });
 				if( v.type.match(TChannel(_)) )
-				fields.push({ pos : pos, name : v.name+"Channel", kind : FVar(macro : hxsl.Types.ChannelSelect) });
+				fields.push({ pos : pos, name : v.name+"Channel", kind : FVar(macro : hxsl.Channel) });
 			}
 			TAnonymous(fields);
 		case TSampler2D:
@@ -44,7 +44,7 @@ class Macros {
 			var t = makeType(t);
 			macro : Array<$t>;
 		case TChannel(_):
-			macro : hxsl.Types.Channel;
+			macro : hxsl.Types.ChannelTexture;
 		case TFun(_):
 			throw "assert";
 		}
@@ -172,8 +172,8 @@ class Macros {
 					var get_sel = "get_" + sel;
 					var set_sel = "set_" + sel;
 					var sfields = macro class {
-						var $selVar : hxsl.Types.ChannelSelect = Unknown;
-						public var $sel(get, set) : hxsl.Types.ChannelSelect;
+						var $selVar : hxsl.Channel = Unknown;
+						public var $sel(get, set) : hxsl.Channel;
 						inline function $get_sel() return $i{selVar};
 						inline function $set_sel(v) { constModified = true; return $i{selVar} = v; }
 					};

+ 18 - 0
hxsl/Shader.hx

@@ -58,6 +58,24 @@ class Shader {
 			case TBool:
 				var v : Bool = v;
 				if( v ) constBits |= 1 << c.pos;
+			case TChannel(count):
+				if( v == null ) {
+					c = c.next;
+					continue;
+				}
+				var v : { texture : hxsl.Types.ChannelTexture, channel : hxsl.Channel } = v;
+				var sel : hxsl.Channel = v.channel;
+				if( v.texture == null )
+					sel = Unknown
+				else if( sel == null || sel == Unknown ) {
+					switch( count ) {
+					case 1 if( hxsl.Types.ChannelTools.isPackedFormat(v.texture) ): sel = PackedFloat;
+					case 3 if( hxsl.Types.ChannelTools.isPackedFormat(v.texture) ): sel = PackedNormal;
+					default:
+						throw "Constant " + c.v.name+" does not define channel select value";
+					}
+				}
+				constBits |= ((globals.allocChannelID(v.texture) << 3) | sel.getIndex()) << c.pos;
 			default:
 				throw "assert";
 			}

+ 2 - 12
hxsl/Types.hx

@@ -7,20 +7,10 @@ typedef Matrix = h3d.Matrix;
 typedef Texture = h3d.mat.Texture;
 typedef Sampler2D = h3d.mat.Texture;
 typedef SamplerCube = h3d.mat.Texture;
-typedef Channel = h3d.mat.Texture;
-
-enum ChannelSelect {
-	Unknown;
-	R;
-	G;
-	B;
-	A;
-	PackedFloat;
-	PackedNormal;
-}
+typedef ChannelTexture = h3d.mat.Texture;
 
 class ChannelTools {
-	public static inline function isPackedFormat( c : Channel ) {
+	public static inline function isPackedFormat( c : ChannelTexture ) {
 		return c.format == h3d.mat.Texture.nativeFormat;
 	}
 }