summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/hlsl.meta.slang31
1 files changed, 31 insertions, 0 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index d71e57400..46d251298 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -8565,6 +8565,37 @@ T determinant(matrix<T,N,N> m)
OpExtInst $$T result glsl450 Determinant $m
};
case wgsl: __intrinsic_asm "determinant";
+ default:
+ static_assert(N >= 1 && N <= 4, "determinant is only implemented up to 4x4 matrices");
+ if (N == 1)
+ {
+ return m[0][0];
+ }
+ else if (N == 2)
+ {
+ return m[0][0] * m[1][1] - m[0][1] * m[1][0];
+ }
+ else if (N == 3)
+ {
+ return
+ m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1])
+ - m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0])
+ + m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);
+ }
+ else// if (N == 4)
+ {
+ T a = m[2][2] * m[3][3] - m[2][3] * m[3][2];
+ T b = m[2][1] * m[3][3] - m[2][3] * m[3][1];
+ T c = m[2][1] * m[3][2] - m[2][2] * m[3][1];
+ T d = m[2][0] * m[3][3] - m[2][3] * m[3][0];
+ T e = m[2][0] * m[3][2] - m[2][2] * m[3][0];
+ T f = m[2][0] * m[3][1] - m[2][1] * m[3][0];
+ return
+ m[0][0] * (m[1][1] * a - m[1][2] * b + m[1][3] * c)
+ - m[0][1] * (m[1][0] * a - m[1][2] * d + m[1][3] * e)
+ + m[0][2] * (m[1][0] * b - m[1][1] * d + m[1][3] * f)
+ - m[0][3] * (m[1][0] * c - m[1][1] * e + m[1][2] * f);
+ }
}
}