浏览代码

added function kind

Nicolas Cannasse 11 年之前
父节点
当前提交
7aa7397fd2
共有 6 个文件被更改,包括 32 次插入46 次删除
  1. 8 0
      hxsl/Ast.hx
  2. 9 6
      hxsl/Checker.hx
  3. 2 4
      hxsl/Eval.hx
  4. 1 0
      hxsl/Flatten.hx
  5. 11 36
      hxsl/Linker.hx
  6. 1 0
      hxsl/Serializer.hx

+ 8 - 0
hxsl/Ast.hx

@@ -128,12 +128,20 @@ typedef TVar = {
 }
 
 typedef TFunction = {
+	var kind : FunctionKind;
 	var ref : TVar;
 	var args : Array<TVar>;
 	var ret : Type;
 	var expr : TExpr;
 }
 
+enum FunctionKind {
+	Vertex;
+	Fragment;
+	Init;
+	Helper;
+}
+
 enum TGlobal {
 	Radians;
 	Degrees;

+ 9 - 6
hxsl/Checker.hx

@@ -85,12 +85,14 @@ class Checker {
 				if( a.qualifiers.length != 0 ) error("No qualifier allowed for argument", pos);
 				{ id : 0, name : a.name, kind : Local, type : a.type };
 			}];
-			if( args.length != 0 )
-				switch( f.name ) {
-				case "vertex", "fragment", "__init__":
-					error("Root function should have no argument", pos);
-				default:
-				}
+			var kind = switch( f.name ) {
+			case "vertex":  Vertex;
+			case "fragment": Fragment;
+			case "__init__": Init;
+			default: Helper;
+			}
+			if( args.length != 0 && kind != Helper )
+				error(kind+" function should have no argument", pos);
 			var fv : TVar = {
 				id : 0,
 				name : f.name,
@@ -98,6 +100,7 @@ class Checker {
 				type : TFun([{ args : [for( a in args ) { type : a.type, name : a.name }], ret : f.ret == null ? TVoid : f.ret }]),
 			};
 			var f : TFunction = {
+				kind : kind,
 				ref : fv,
 				args : args,
 				ret : f.ret == null ? TVoid : f.ret,

+ 2 - 4
hxsl/Eval.hx

@@ -60,16 +60,14 @@ class Eval {
 		var funs = [];
 		for( f in s.funs ) {
 			var f2 : TFunction = {
+				kind : f.kind,
 				ref : mapVar(f.ref),
 				args : [for( a in f.args ) mapVar(a)],
 				ret : f.ret,
 				expr : f.expr,
 			};
-			switch( f.ref.name ) {
-			case "vertex", "fragment", "__init__":
+			if( f.kind != Helper )
 				funs.push(f2);
-			default:
-			}
 			funMap.set(f2.ref, f2);
 		}
 		for( i in 0...funs.length )

+ 1 - 0
hxsl/Flatten.hx

@@ -38,6 +38,7 @@ class Flatten {
 			name : s.name,
 			vars : outVars,
 			funs : [for( f in s.funs ) {
+				kind : f.kind,
 				ret : f.ret,
 				args : f.args,
 				ref : f.ref,

+ 11 - 36
hxsl/Linker.hx

@@ -1,23 +1,14 @@
 package hxsl;
 using hxsl.Ast;
 
-private enum VarKind {
-	Var;
-	Function;
-	Vertex;
-	Fragment;
-	Init;
-}
-
 private class AllocatedVar {
 	public var id : Int;
 	public var v : TVar;
 	public var path : String;
 	public var merged : Array<TVar>;
-	public var kind : VarKind;
+	public var kind : Null<FunctionKind>;
 	public var parent : AllocatedVar;
 	public function new() {
-		kind = Var;
 	}
 }
 
@@ -47,7 +38,6 @@ class Linker {
 
 	var varMap : Map<String,AllocatedVar>;
 	var allVars : Array<AllocatedVar>;
-	var allFuns : Map<Int,TFunction>;
 	var curShader : ShaderInfos;
 	var shaders : Array<ShaderInfos>;
 	var varIdMap : Map<Int,Int>;
@@ -266,25 +256,15 @@ class Linker {
 		varMap = new Map();
 		varIdMap = new Map();
 		allVars = new Array();
-		allFuns = new Map();
 		shaders = [];
 		
 		// globalize vars
 		for( s in shadersData ) {
-			for( v in s.vars ) {
-				// check name before rename
-				var kind = switch( v.name ) {
-				case "vertex": Vertex;
-				case "fragment": Fragment;
-				case "__init__": Init;
-				default: null;
-				}
-				var v = allocVar(v, null);
-				if( kind != null ) v.kind = kind;
-			}
+			for( v in s.vars )
+				allocVar(v, null);
 			for( f in s.funs ) {
 				var v = allocVar(f.ref, f.expr.p);
-				if( v.kind == Var ) v.kind = Function;
+				v.kind = f.kind;
 			}
 		}
 		
@@ -293,6 +273,7 @@ class Linker {
 		for( s in shadersData ) {
 			for( f in s.funs ) {
 				var v = allocVar(f.ref, f.expr.p);
+				if( v.kind == null ) throw "assert";
 				switch( v.kind ) {
 				case Vertex, Fragment:
 					addShader(s.name+"."+(v.kind == Vertex ? "vertex" : "fragment"),v.kind == Vertex,f.expr, priority);
@@ -305,15 +286,8 @@ class Linker {
 					default:
 						addShader(s.name+".__init__",true,f.expr, -1);
 					}
-				case Function:
-					allFuns.set(v.id, {
-						ref : v.v,
-						args : f.args,
-						ret : f.ret,
-						expr : mapExprVar(f.expr),
-					});
-				case Var:
-					throw "assert "+v.v.name;
+				case Helper:
+					throw "Unexpected helper function in linker "+v.v.name;
 				}
 			}
 			priority++;
@@ -381,7 +355,7 @@ class Linker {
 		for( v in outVars )
 			cleanVar(v);
 		// build resulting shader functions
-		function build(name, a:Array<ShaderInfos> ) : TFunction {
+		function build(kind, name, a:Array<ShaderInfos> ) : TFunction {
 			var v : TVar = {
 				id : Tools.allocVarId(),
 				name : name,
@@ -398,6 +372,7 @@ class Linker {
 					exprs.push(s.body);
 				}
 			return {
+				kind : kind,
 				ref : v,
 				ret : TVoid,
 				args : [],
@@ -405,8 +380,8 @@ class Linker {
 			};
 		}
 		var funs = [
-			build("vertex", v),
-			build("fragment", f),
+			build(Vertex, "vertex", v),
+			build(Fragment, "fragment", f),
 		];
 		return { name : "out", vars : outVars, funs : funs };
 	}

+ 1 - 0
hxsl/Serializer.hx

@@ -21,6 +21,7 @@ class Serializer {
 			name : s.name,
 			vars : s.vars,
 			funs : [for( f in s.funs ) {
+				kind : f.kind,
 				ref : f.ref,
 				args : f.args,
 				ret : f.ret,