Pārlūkot izejas kodu

added Mat4x4mult

ncannasse 10 gadi atpakaļ
vecāks
revīzija
e84f9bcfc5
2 mainītis faili ar 27 papildinājumiem un 1 dzēšanām
  1. 26 1
      hxsl/AgalOut.hx
  2. 1 0
      hxsl/Checker.hx

+ 26 - 1
hxsl/AgalOut.hx

@@ -388,7 +388,18 @@ class AgalOut {
 				op(ODp4(swiz(r,[X]), r1, r2));
 				op(ODp4(swiz(r,[Y]), r1, offset(r2,1)));
 				op(ODp4(swiz(r,[Z]), r1, offset(r2,2)));
-				op(ODp4(swiz(r,[W]), r1, offset(r2,3)));
+				op(ODp4(swiz(r, [W]), r1, offset(r2, 3)));
+			case [TMat4, TMat4]:
+				var tmp = allocReg(TMat4);
+				colsToRows(r1, tmp, TMat4);
+				for( i in 0...4 ) {
+					var b = offset(r2, i);
+					var o = offset(r, i);
+					op(ODp4(swiz(o, [X]), tmp, b));
+					op(ODp4(swiz(o, [Y]), offset(tmp, 1), b));
+					op(ODp4(swiz(o, [Z]), offset(tmp, 2), b));
+					op(ODp4(swiz(o, [W]), offset(tmp, 3), b));
+				}
 			default:
 				throw "assert " + [e1.t, e2.t];
 			}
@@ -411,6 +422,20 @@ class AgalOut {
 		return null;
 	}
 
+	function colsToRows( src : Reg, dst : Reg, t : Type ) {
+		switch( t ) {
+		case TMat4:
+			for( i in 0...4 ) {
+				var ldst = offset(dst, i);
+				for( j in 0...4 )
+					op(OMov(swiz(ldst, [COMPS[j]]), swiz(offset(src, j), [COMPS[i]])));
+			}
+		default:
+			throw "Can't transpose " + t;
+		}
+	}
+
+
 	function global( g : TGlobal, args : Array<TExpr>, ret : Type ) : Reg {
 		inline function binop(bop) {
 			if( args.length != 2 ) throw "assert";

+ 1 - 0
hxsl/Checker.hx

@@ -936,6 +936,7 @@ class Checker {
 			case [_, TVec(_,VFloat), TFloat]: e1.t;
 			case [_, TInt, TVec(_, VFloat)]: toFloat(e1); e2.t;
 			case [_, TVec(_,VFloat), TInt]: toFloat(e2); e1.t;
+			case [OpMult, TMat4, TMat4]: TMat4;
 			default:
 				var opName = switch( op ) {
 				case OpMult: "multiply";