|
@@ -21,6 +21,7 @@ class Flatten {
|
|
var params : Array<TVar>;
|
|
var params : Array<TVar>;
|
|
var outVars : Array<TVar>;
|
|
var outVars : Array<TVar>;
|
|
var varMap : Map<TVar,Alloc>;
|
|
var varMap : Map<TVar,Alloc>;
|
|
|
|
+ public var allocData : Map< TVar, Array<Alloc> >;
|
|
|
|
|
|
public function new() {
|
|
public function new() {
|
|
}
|
|
}
|
|
@@ -30,6 +31,7 @@ class Flatten {
|
|
params = [];
|
|
params = [];
|
|
outVars = [];
|
|
outVars = [];
|
|
varMap = new Map();
|
|
varMap = new Map();
|
|
|
|
+ allocData = new Map();
|
|
for( v in s.vars )
|
|
for( v in s.vars )
|
|
gatherVar(v);
|
|
gatherVar(v);
|
|
var prefix = switch( kind ) {
|
|
var prefix = switch( kind ) {
|
|
@@ -38,7 +40,9 @@ class Flatten {
|
|
default: throw "assert";
|
|
default: throw "assert";
|
|
}
|
|
}
|
|
pack(prefix+"Globals", Global, globals, VFloat);
|
|
pack(prefix+"Globals", Global, globals, VFloat);
|
|
- pack(prefix+"Params", Param, params, VFloat);
|
|
|
|
|
|
+ pack(prefix + "Params", Param, params, VFloat);
|
|
|
|
+ packTextures(prefix + "GTextures", Global, globals, TSampler2D);
|
|
|
|
+ packTextures(prefix + "PTextures", Param, params, TSampler2D);
|
|
return {
|
|
return {
|
|
name : s.name,
|
|
name : s.name,
|
|
vars : outVars,
|
|
vars : outVars,
|
|
@@ -90,6 +94,8 @@ class Flatten {
|
|
case TArray(t, SConst(len)):
|
|
case TArray(t, SConst(len)):
|
|
var stride = Std.int(a.size / len);
|
|
var stride = Std.int(a.size / len);
|
|
return { e : TArrayDecl([for( i in 0...len ) access(new Alloc(a.g, a.t, a.pos + stride * i, stride), t, pos)]), t : t, p : pos };
|
|
return { e : TArrayDecl([for( i in 0...len ) access(new Alloc(a.g, a.t, a.pos + stride * i, stride), t, pos)]), t : t, p : pos };
|
|
|
|
+ case TSampler2D, TSamplerCube:
|
|
|
|
+ return read(a.pos);
|
|
default:
|
|
default:
|
|
var size = varSize(t, a.t);
|
|
var size = varSize(t, a.t);
|
|
if( size <= 4 ) {
|
|
if( size <= 4 ) {
|
|
@@ -132,6 +138,29 @@ class Flatten {
|
|
return e;
|
|
return e;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ function packTextures( name : String, kind : VarKind, vars : Array<TVar>, t : Type ) {
|
|
|
|
+ var alloc = new Array<Alloc>();
|
|
|
|
+ var g : TVar = {
|
|
|
|
+ id : Tools.allocVarId(),
|
|
|
|
+ name : name,
|
|
|
|
+ type : t,
|
|
|
|
+ kind : kind,
|
|
|
|
+ };
|
|
|
|
+ for( v in vars ) {
|
|
|
|
+ if( v.type != t ) continue;
|
|
|
|
+ var a = new Alloc(g, null, alloc.length, 1);
|
|
|
|
+ a.v = v;
|
|
|
|
+ varMap.set(v, a);
|
|
|
|
+ alloc.push(a);
|
|
|
|
+ }
|
|
|
|
+ g.type = TArray(t, SConst(alloc.length));
|
|
|
|
+ if( alloc.length > 0 ) {
|
|
|
|
+ outVars.push(g);
|
|
|
|
+ allocData.set(g, alloc);
|
|
|
|
+ }
|
|
|
|
+ return g;
|
|
|
|
+ }
|
|
|
|
+
|
|
function pack( name : String, kind : VarKind, vars : Array<TVar>, t : VecType ) {
|
|
function pack( name : String, kind : VarKind, vars : Array<TVar>, t : VecType ) {
|
|
var alloc = new Array<Alloc>(), apos = 0;
|
|
var alloc = new Array<Alloc>(), apos = 0;
|
|
var g : TVar = {
|
|
var g : TVar = {
|
|
@@ -143,7 +172,6 @@ class Flatten {
|
|
for( v in vars ) {
|
|
for( v in vars ) {
|
|
switch( v.type ) {
|
|
switch( v.type ) {
|
|
case TSampler2D, TSamplerCube:
|
|
case TSampler2D, TSamplerCube:
|
|
- outVars.push(v);
|
|
|
|
continue;
|
|
continue;
|
|
default:
|
|
default:
|
|
}
|
|
}
|
|
@@ -177,8 +205,10 @@ class Flatten {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
g.type = TArray(TVec(4, t), SConst(apos >> 2));
|
|
g.type = TArray(TVec(4, t), SConst(apos >> 2));
|
|
- if( vars.length > 0 )
|
|
|
|
|
|
+ if( vars.length > 0 ) {
|
|
outVars.push(g);
|
|
outVars.push(g);
|
|
|
|
+ allocData.set(g, alloc);
|
|
|
|
+ }
|
|
return g;
|
|
return g;
|
|
}
|
|
}
|
|
|
|
|