summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/glsl.meta.slang6
-rw-r--r--source/slang/glsl.meta.slang.h6
-rw-r--r--tests/bugs/matrix-mult.glsl28
-rw-r--r--tests/cross-compile/matrix-mult.slang14
-rw-r--r--tests/cross-compile/matrix-mult.slang.glsl25
5 files changed, 73 insertions, 6 deletions
diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang
index 5cfb5e7c0..4aa3f059c 100644
--- a/source/slang/glsl.meta.slang
+++ b/source/slang/glsl.meta.slang
@@ -43,13 +43,13 @@ sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M :int> __intrins
sb << "__generic<T : __BuiltinArithmeticType, let N : int> __intrinsic_op(dot) T operator*(vector<T,N> x, vector<T,N> y);\n";
// vector-matrix
-sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mulVectorMatrix) vector<T,M> operator*(vector<T,N> x, matrix<T,N,M> y);\n";
+sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mul) vector<T,M> operator*(vector<T,N> x, matrix<T,N,M> y);\n";
// matrix-vector
-sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mulMatrixVector) vector<T,N> operator*(matrix<T,N,M> x, vector<T,M> y);\n";
+sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mul) vector<T,N> operator*(matrix<T,N,M> x, vector<T,M> y);\n";
// matrix-matrix
-sb << "__generic<T : __BuiltinArithmeticType, let R : int, let N : int, let C : int> __intrinsic_op(mulMatrixMatrix) matrix<T,R,C> operator*(matrix<T,R,N> x, matrix<T,N,C> y);\n";
+sb << "__generic<T : __BuiltinArithmeticType, let R : int, let N : int, let C : int> __intrinsic_op(mul) matrix<T,R,C> operator*(matrix<T,R,N> x, matrix<T,N,C> y);\n";
diff --git a/source/slang/glsl.meta.slang.h b/source/slang/glsl.meta.slang.h
index a4aade3c2..a735b3beb 100644
--- a/source/slang/glsl.meta.slang.h
+++ b/source/slang/glsl.meta.slang.h
@@ -44,13 +44,13 @@ sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M :int> __intrins
sb << "__generic<T : __BuiltinArithmeticType, let N : int> __intrinsic_op(dot) T operator*(vector<T,N> x, vector<T,N> y);\n";
// vector-matrix
-sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mulVectorMatrix) vector<T,M> operator*(vector<T,N> x, matrix<T,N,M> y);\n";
+sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mul) vector<T,M> operator*(vector<T,N> x, matrix<T,N,M> y);\n";
// matrix-vector
-sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mulMatrixVector) vector<T,N> operator*(matrix<T,N,M> x, vector<T,M> y);\n";
+sb << "__generic<T : __BuiltinArithmeticType, let N : int, let M : int> __intrinsic_op(mul) vector<T,N> operator*(matrix<T,N,M> x, vector<T,M> y);\n";
// matrix-matrix
-sb << "__generic<T : __BuiltinArithmeticType, let R : int, let N : int, let C : int> __intrinsic_op(mulMatrixMatrix) matrix<T,R,C> operator*(matrix<T,R,N> x, matrix<T,N,C> y);\n";
+sb << "__generic<T : __BuiltinArithmeticType, let R : int, let N : int, let C : int> __intrinsic_op(mul) matrix<T,R,C> operator*(matrix<T,R,N> x, matrix<T,N,C> y);\n";
diff --git a/tests/bugs/matrix-mult.glsl b/tests/bugs/matrix-mult.glsl
new file mode 100644
index 000000000..b427dee14
--- /dev/null
+++ b/tests/bugs/matrix-mult.glsl
@@ -0,0 +1,28 @@
+//TEST:COMPARE_GLSL:-profile glsl_fragment_450 -no-checking
+// matrix-mult.glsl
+#version 450
+
+// Confirm that we don't exchange the operands
+// to a matrix-vector multiply when we recognize
+// one in "raw" GLSL code.
+
+#ifdef __SLANG__
+__import empty;
+#endif
+
+layout(binding = 0)
+uniform C
+{
+ mat4x4 m;
+};
+
+layout(location = 0)
+in vec4 v;
+
+layout(location = 0)
+out vec4 r;
+
+void main()
+{
+ r = m * v;
+}
diff --git a/tests/cross-compile/matrix-mult.slang b/tests/cross-compile/matrix-mult.slang
new file mode 100644
index 000000000..180a806e2
--- /dev/null
+++ b/tests/cross-compile/matrix-mult.slang
@@ -0,0 +1,14 @@
+//TEST:CROSS_COMPILE: -profile ps_5_0 -entry main -target spirv-assembly
+
+// Confirm that order of arguments to matrix-vector
+// multiplication gets reversed when generating GLSL.
+
+cbuffer C
+{
+ float4x3 m;
+};
+
+float4 main(float3 v) : SV_Target
+{
+ return mul(m, v);
+}
diff --git a/tests/cross-compile/matrix-mult.slang.glsl b/tests/cross-compile/matrix-mult.slang.glsl
new file mode 100644
index 000000000..0349d854e
--- /dev/null
+++ b/tests/cross-compile/matrix-mult.slang.glsl
@@ -0,0 +1,25 @@
+//TEST_IGNORE_FILE:
+
+layout(binding = 0)
+uniform C
+{
+ mat4x3 m;
+};
+
+vec4 main_(vec3 v)
+{
+ return v * m;
+}
+
+layout(location = 0)
+in vec3 SLANG_in_v;
+
+layout(location = 0)
+out vec4 SLANG_out_main_result;
+
+void main()
+{
+ vec3 v = SLANG_in_v;
+ vec4 main_result = main_(v);
+ SLANG_out_main_result = main_result;
+}