Bläddra i källkod

added getLod on channel/texture

ncannasse 7 år sedan
förälder
incheckning
7d39b3a576
4 ändrade filer med 31 tillägg och 4 borttagningar
  1. 1 0
      hxsl/Ast.hx
  2. 9 0
      hxsl/Checker.hx
  3. 13 1
      hxsl/Dce.hx
  4. 8 3
      hxsl/Eval.hx

+ 1 - 0
hxsl/Ast.hx

@@ -234,6 +234,7 @@ enum TGlobal {
 	Fwidth;
 	// debug / internal
 	ChannelRead;
+	ChannelReadLod;
 	Trace;
 	// instancing
 	VertexID;

+ 9 - 0
hxsl/Checker.hx

@@ -120,6 +120,13 @@ class Checker {
 					{ args : [ { name : "channel", type : TChannel(3) }, { name : "uv", type : vec2 } ], ret : vec3 },
 					{ args : [ { name : "channel", type : TChannel(4) }, { name : "uv", type : vec2 } ], ret : vec4 },
 				];
+			case ChannelReadLod:
+				[
+					{ args : [ { name : "channel", type : TChannel(1) }, { name : "uv", type : vec2 }, { name : "lod", type : TFloat } ], ret : TFloat },
+					{ args : [ { name : "channel", type : TChannel(2) }, { name : "uv", type : vec2 }, { name : "lod", type : TFloat } ], ret : vec2 },
+					{ args : [ { name : "channel", type : TChannel(3) }, { name : "uv", type : vec2 }, { name : "lod", type : TFloat } ], ret : vec3 },
+					{ args : [ { name : "channel", type : TChannel(4) }, { name : "uv", type : vec2 }, { name : "lod", type : TFloat } ], ret : vec4 },
+				];
 			case ScreenToUv:
 				[{ args : [{ name : "screenPos", type : vec2 }], ret : vec2 }];
 			case UvToScreen:
@@ -822,6 +829,8 @@ class Checker {
 			var gl : TGlobal = switch( [f, e.t] ) {
 			case ["get", TSampler2D|TSampler2DArray|TSamplerCube]: Texture;
 			case ["get", TChannel(_)]: ChannelRead;
+			case ["getLod", TSampler2D|TSampler2DArray|TSamplerCube]: TextureLod;
+			case ["getLod", TChannel(_)]: ChannelReadLod;
 			default: null;
 			}
 			if( gl != null )

+ 13 - 1
hxsl/Dce.hx

@@ -185,6 +185,15 @@ class Dce {
 			} else {
 				link(channelVars[cid], writeTo);
 			}
+		case TCall({ e : TGlobal(ChannelReadLod) }, [{ e : TVar(c) }, uv, lod, { e : TConst(CInt(cid)) }]):
+			check(uv, writeTo, isAffected);
+			check(lod, writeTo, isAffected);
+			if( channelVars[cid] == null ) {
+				channelVars[cid] = c;
+				link(c, writeTo);
+			} else {
+				link(channelVars[cid], writeTo);
+			}
 		default:
 			e.iter(check.bind(_, writeTo, isAffected));
 		}
@@ -218,7 +227,10 @@ class Dce {
 			return { e : TConst(CNull), t : e.t, p : e.p };
 		case TCall({ e : TGlobal(ChannelRead) }, [_, uv, { e : TConst(CInt(cid)) }]):
 			var c = channelVars[cid];
-			return { e : TCall({ e : TGlobal(Texture), p : e.p, t : TVoid }, [{ e : TVar(c), t : c.type, p : e.p }, uv]), t : TVoid, p : e.p };
+			return { e : TCall({ e : TGlobal(Texture), p : e.p, t : TVoid }, [{ e : TVar(c), t : c.type, p : e.p }, mapExpr(uv,true)]), t : TVoid, p : e.p };
+		case TCall({ e : TGlobal(ChannelReadLod) }, [_, uv, lod, { e : TConst(CInt(cid)) }]):
+			var c = channelVars[cid];
+			return { e : TCall({ e : TGlobal(TextureLod), p : e.p, t : TVoid }, [{ e : TVar(c), t : c.type, p : e.p }, mapExpr(uv,true), mapExpr(lod,true)]), t : TVoid, p : e.p };
 		case TIf(e, econd, eelse):
 			var e = mapExpr(e, true);
 			var econd = mapExpr(econd, isVar);

+ 8 - 3
hxsl/Eval.hx

@@ -163,7 +163,8 @@ class Eval {
 			for( a in args )
 				haxe.Log.trace(Printer.toString(a), { fileName : a.p.file, lineNumber : 0, className : null, methodName : null });
 			TBlock([]);
-		case [ChannelRead, [ { e : TConst(CInt(i)) }, uv ]]:
+		case [ChannelRead|ChannelReadLod, _]:
+			var i = switch( args[0].e ) { case TConst(CInt(i)): i; default: throw "assert"; };
 			var channel = oldArgs[0];
 			channel = { e : switch( channel.e ) {
 			case TVar(v): TVar(mapVar(v));
@@ -171,8 +172,12 @@ class Eval {
 			}, t : channel.t, p : channel.p };
 			var count = switch( channel.t ) { case TChannel(i): i; default: throw "assert"; };
 			var channelMode = hxsl.Channel.createByIndex(i & 7);
+			var targs = [channel];
+			for( i in 1...args.length )
+				targs.push(args[i]);
+			targs.push({ e : TConst(CInt(i >> 3)), t : TInt, p : pos });
 			var tget = {
-				e : TCall({ e : TGlobal(ChannelRead), t : TVoid, p : pos }, [channel, uv, { e : TConst(CInt(i >> 3)), t : TInt, p : pos }]),
+				e : TCall({ e : TGlobal(g), t : TVoid, p : pos }, targs),
 				t : TVoid,
 				p : pos,
 			};
@@ -200,7 +205,7 @@ class Eval {
 			case PackedNormal:
 				return TCall({ e : TGlobal(UnpackNormal), t:TVoid, p:pos}, [tget]);
 			}
-		case [ChannelRead, [t,_]]:
+		case [ChannelRead|ChannelReadLod, [t,_]]:
 			Error.t("Cannot eval complex channel " + Printer.toString(t,true)+" "+constantsToString(), pos);
 		default: null;
 		}