|
@@ -22,8 +22,10 @@ private class ShaderInfos {
|
|
|
public var body : TExpr;
|
|
|
public var usedFunctions : Array<TFunction>;
|
|
|
public var deps : Map<ShaderInfos, Bool>;
|
|
|
- public var read : Map<Int,AllocatedVar>;
|
|
|
- public var write : Map<Int,AllocatedVar>;
|
|
|
+ public var readMap : Map<Int,AllocatedVar>;
|
|
|
+ public var readVars : Array<AllocatedVar>;
|
|
|
+ public var writeMap : Map<Int,AllocatedVar>;
|
|
|
+ public var writeVars : Array<AllocatedVar>;
|
|
|
public var processed : Map<Int, Bool>;
|
|
|
public var vertex : Null<Bool>;
|
|
|
public var onStack : Bool;
|
|
@@ -36,8 +38,10 @@ private class ShaderInfos {
|
|
|
this.vertex = v;
|
|
|
processed = new Map();
|
|
|
usedFunctions = [];
|
|
|
- read = new Map();
|
|
|
- write = new Map();
|
|
|
+ readMap = new Map();
|
|
|
+ readVars = [];
|
|
|
+ writeMap = new Map();
|
|
|
+ writeVars = [];
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -187,9 +191,12 @@ class Linker {
|
|
|
switch( e.e ) {
|
|
|
case TVar(v) if( !locals.exists(v.id) ):
|
|
|
var v = allocVar(v, e.p);
|
|
|
- if( curShader != null && !curShader.write.exists(v.id) ) {
|
|
|
+ if( curShader != null && !curShader.writeMap.exists(v.id) ) {
|
|
|
debug(curShader.name + " read " + v.path);
|
|
|
- curShader.read.set(v.id, v);
|
|
|
+ if( !curShader.readMap.exists(v.id) ) {
|
|
|
+ curShader.readMap.set(v.id, v);
|
|
|
+ curShader.readVars.push(v);
|
|
|
+ }
|
|
|
// if we read a varying, force into fragment
|
|
|
if( curShader.vertex == null && v.v.kind == Var ) {
|
|
|
debug("Force " + curShader.name+" into fragment (use varying)");
|
|
@@ -202,9 +209,10 @@ class Linker {
|
|
|
case [OpAssign, TVar(v)] if( !locals.exists(v.id) ):
|
|
|
var e2 = mapExprVar(e2);
|
|
|
var v = allocVar(v, e1.p);
|
|
|
- if( curShader != null ) {
|
|
|
+ if( curShader != null && !curShader.writeMap.exists(v.id) ) {
|
|
|
debug(curShader.name + " write " + v.path);
|
|
|
- curShader.write.set(v.id, v);
|
|
|
+ curShader.writeMap.set(v.id, v);
|
|
|
+ curShader.writeVars.push(v);
|
|
|
}
|
|
|
// don't read the var
|
|
|
return { e : TBinop(op, { e : TVar(v.v), t : v.v.type, p : e.p }, e2), t : e.t, p : e.p };
|
|
@@ -214,10 +222,11 @@ class Linker {
|
|
|
var e2 = mapExprVar(e2);
|
|
|
|
|
|
var v = allocVar(v, e1.p);
|
|
|
- if( curShader != null ) {
|
|
|
+ if( curShader != null && !curShader.writeMap.exists(v.id) ) {
|
|
|
// TODO : mark as partial write if SWIZ
|
|
|
debug(curShader.name + " write " + v.path);
|
|
|
- curShader.write.set(v.id, v);
|
|
|
+ curShader.writeMap.set(v.id, v);
|
|
|
+ curShader.writeVars.push(v);
|
|
|
}
|
|
|
return { e : TBinop(op, e1, e2), t : e.t, p : e.p };
|
|
|
default:
|
|
@@ -261,7 +270,7 @@ class Linker {
|
|
|
continue;
|
|
|
} else if( !found )
|
|
|
continue;
|
|
|
- if( !parent.write.exists(v.id) )
|
|
|
+ if( !parent.writeMap.exists(v.id) )
|
|
|
continue;
|
|
|
if( s.vertex ) {
|
|
|
if( parent.vertex == false )
|
|
@@ -274,7 +283,7 @@ class Linker {
|
|
|
debugDepth++;
|
|
|
initDependencies(parent);
|
|
|
debugDepth--;
|
|
|
- if( !parent.read.exists(v.id) )
|
|
|
+ if( !parent.readMap.exists(v.id) )
|
|
|
return;
|
|
|
}
|
|
|
if( v.v.kind == Var )
|
|
@@ -285,8 +294,8 @@ class Linker {
|
|
|
if( s.deps != null )
|
|
|
return;
|
|
|
s.deps = new Map();
|
|
|
- for( r in s.read )
|
|
|
- buildDependency(s, r, s.write.exists(r.id));
|
|
|
+ for( r in s.readVars )
|
|
|
+ buildDependency(s, r, s.writeMap.exists(r.id));
|
|
|
// propagate fragment flag
|
|
|
if( s.vertex == null )
|
|
|
for( d in s.deps.keys() )
|
|
@@ -433,7 +442,7 @@ class Linker {
|
|
|
for( s in shaders ) {
|
|
|
if( s.vertex != null ) continue;
|
|
|
var onlyParams = true;
|
|
|
- for( r in s.read )
|
|
|
+ for( r in s.readVars )
|
|
|
if( r.v.kind != Param ) {
|
|
|
onlyParams = false;
|
|
|
break;
|
|
@@ -473,9 +482,9 @@ class Linker {
|
|
|
outVars.push(v.v);
|
|
|
}
|
|
|
for( s in v.concat(f) ) {
|
|
|
- for( v in s.read )
|
|
|
+ for( v in s.readVars )
|
|
|
addVar(v);
|
|
|
- for( v in s.write )
|
|
|
+ for( v in s.writeVars )
|
|
|
addVar(v);
|
|
|
}
|
|
|
// cleanup unused structure vars
|