|
@@ -70,6 +70,31 @@ class Eval {
|
|
return v2;
|
|
return v2;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ function checkSamplerRec(t:Type) {
|
|
|
|
+ if( t.isSampler() )
|
|
|
|
+ return true;
|
|
|
|
+ switch( t ) {
|
|
|
|
+ case TStruct(vl):
|
|
|
|
+ for( v in vl )
|
|
|
|
+ if( checkSamplerRec(v.type) )
|
|
|
|
+ return true;
|
|
|
|
+ return false;
|
|
|
|
+ case TArray(t, _):
|
|
|
|
+ return checkSamplerRec(t);
|
|
|
|
+ case TBuffer(_, size):
|
|
|
|
+ return true;
|
|
|
|
+ default:
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function needsInline(f:TFunction) {
|
|
|
|
+ for( a in f.args )
|
|
|
|
+ if( checkSamplerRec(a.type) )
|
|
|
|
+ return true;
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
public function eval( s : ShaderData ) : ShaderData {
|
|
public function eval( s : ShaderData ) : ShaderData {
|
|
var funs = [];
|
|
var funs = [];
|
|
for( f in s.funs ) {
|
|
for( f in s.funs ) {
|
|
@@ -80,9 +105,10 @@ class Eval {
|
|
ret : f.ret,
|
|
ret : f.ret,
|
|
expr : f.expr,
|
|
expr : f.expr,
|
|
};
|
|
};
|
|
- if( !inlineCalls || f.kind != Helper )
|
|
|
|
|
|
+ if( (f.kind == Helper && inlineCalls) || needsInline(f2) )
|
|
|
|
+ funMap.set(f2.ref, f);
|
|
|
|
+ else
|
|
funs.push(f2);
|
|
funs.push(f2);
|
|
- funMap.set(f2.ref, f);
|
|
|
|
}
|
|
}
|
|
for( i in 0...funs.length ) {
|
|
for( i in 0...funs.length ) {
|
|
curFun = funs[i];
|
|
curFun = funs[i];
|
|
@@ -252,8 +278,6 @@ class Eval {
|
|
case TGlobal(g):
|
|
case TGlobal(g):
|
|
var v = evalCall(g, args, eargs, e.p);
|
|
var v = evalCall(g, args, eargs, e.p);
|
|
if( v != null ) v else TCall(c, args);
|
|
if( v != null ) v else TCall(c, args);
|
|
- case TVar(_) if( !inlineCalls ):
|
|
|
|
- TCall(c, args);
|
|
|
|
case TVar(v) if( funMap.exists(v) ):
|
|
case TVar(v) if( funMap.exists(v) ):
|
|
// inline the function call
|
|
// inline the function call
|
|
var f = funMap.get(v);
|
|
var f = funMap.get(v);
|
|
@@ -288,6 +312,8 @@ class Eval {
|
|
outExprs.push(e);
|
|
outExprs.push(e);
|
|
}
|
|
}
|
|
TBlock(outExprs);
|
|
TBlock(outExprs);
|
|
|
|
+ case TVar(_):
|
|
|
|
+ TCall(c, args);
|
|
default:
|
|
default:
|
|
Error.t("Cannot eval non-static call expresssion '" + new Printer().exprString(c)+"'", c.p);
|
|
Error.t("Cannot eval non-static call expresssion '" + new Printer().exprString(c)+"'", c.p);
|
|
}
|
|
}
|