Ver Fonte

change TArray to be not always 4-comps aligned, require 4 comps align for indexed access

Nicolas Cannasse há 11 anos atrás
pai
commit
786593bc89
4 ficheiros alterados com 28 adições e 13 exclusões
  1. 4 6
      h3d/shader/Manager.hx
  2. 19 0
      hxsl/Ast.hx
  3. 1 1
      hxsl/Cache.hx
  4. 4 6
      hxsl/Flatten.hx

+ 4 - 6
h3d/shader/Manager.hx

@@ -68,16 +68,14 @@ class Manager {
 			return 12;
 		case TArray(t, SConst(len)):
 			var v : Array<Dynamic> = v;
-			var stride = 0;
+			var size = 0;
 			for( i in 0...len ) {
 				var n = v[i];
 				if( n == null ) break;
-				stride = fillRec(n, t, out, pos);
-				// align
-				stride += (4 - (stride & 3)) & 3;
-				pos += stride;
+				size = fillRec(n, t, out, pos);
+				pos += size;
 			}
-			return len * stride;
+			return len * size;
 		case TStruct(vl):
 			var tot = 0;
 			for( vv in vl )

+ 19 - 0
hxsl/Ast.hx

@@ -383,6 +383,25 @@ class Tools {
 		}
 		return { e : ed, t : e.t, p : e.p };
 	}
+	
+	public static function size( t : Type ) {
+		return switch( t ) {
+		case TVoid: 0;
+		case TFloat, TInt: 1;
+		case TVec(n, _): n;
+		case TStruct(vl):
+			var s = 0;
+			for( v in vl ) s += size(v.type);
+			return s;
+		case TMat3: 9;
+		case TMat4: 16;
+		case TMat3x4: 12;
+		case TBytes(s): s;
+		case TBool, TString, TSampler2D, TSamplerCube, TFun(_): 0;
+		case TArray(t, SConst(v)): size(t) * v;
+		case TArray(_, SVar(_)): 0;
+		}
+	}
 
 }
 

+ 1 - 1
hxsl/Cache.hx

@@ -67,7 +67,7 @@ class Cache {
 			shaders.push(i.shader);
 		}
 		var s = linker.link(shaders, this.outVars[outVars]);
-		
+
 		// params tracking
 		var paramVars = new Map();
 		for( v in linker.allVars )

+ 4 - 6
hxsl/Flatten.hx

@@ -100,8 +100,9 @@ class Flatten {
 			else {
 				switch( v.type ) {
 				case TArray(t, _):
-					var stride = varSize(t, a.t) >> 2;
-					if( stride == 0 ) stride = 1;
+					var stride = varSize(t, a.t);
+					if( stride == 0 || stride & 3 != 0 ) throw "assert " + t;
+					stride >>= 2;
 					var toInt = { e : TCall( { e : TGlobal(ToInt), t : TFun([]), p : vp }, [eindex]), t : TInt, p : vp };
 					access(a, t, vp, readOffset.bind(a,stride,{ e : TBinop(OpMult,toInt,mkInt(stride,vp)), t : TInt, p : vp }));
 				default:
@@ -298,10 +299,7 @@ class Flatten {
 		case TMat4 if( t == VFloat ): 16;
 		case TMat3x4 if( t == VFloat ): 12;
 		case TMat3 if( t == VFloat ): 9;
-		case TArray(at, SConst(n)):
-			var s = varSize(at, t);
-			s += (4 - (s & 3)) & 3;
-			s * n;
+		case TArray(at, SConst(n)): varSize(at, t) * n;
 		default:
 			throw v.toString() + " size unknown for type " + t;
 		}