diff options
| -rw-r--r-- | source/slang/glsl.meta.slang | 6 | ||||
| -rw-r--r-- | source/slang/glsl.meta.slang.h | 6 | ||||
| -rw-r--r-- | tests/bugs/matrix-mult.glsl | 28 | ||||
| -rw-r--r-- | tests/cross-compile/matrix-mult.slang | 14 | ||||
| -rw-r--r-- | tests/cross-compile/matrix-mult.slang.glsl | 25 |
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; +} |
