@@ -13,10 +13,9 @@ namespace spirv
13
13
{
14
14
15
15
// Find MSB and LSB restricted to 32-bit width component types https://registry.khronos.org/SPIR-V/specs/unified1/GLSL.std.450.html
16
-
17
16
template<typename Integral>
18
17
[[vk::ext_instruction (GLSLstd450::GLSLstd450FindILsb, "GLSL.std.450" )]]
19
- enable_if_t<is_integral_v<Integral> && (sizeof (scalar_type_t<Integral>) == 4 ), Integral> findILsb (Integral value);
18
+ enable_if_t<is_integral_v<Integral> && (sizeof (scalar_type_t<Integral>) == 4 && !is_matrix_v<Integral> ), Integral> findILsb (Integral value);
20
19
21
20
[[vk::ext_instruction (GLSLstd450::GLSLstd450FindSMsb, "GLSL.std.450" )]]
22
21
int32_t findSMsb (int32_t value);
@@ -26,28 +25,41 @@ uint32_t findUMsb(uint32_t value);
26
25
27
26
template<typename FloatingPoint>
28
27
[[vk::ext_instruction (GLSLstd450::GLSLstd450Exp2, "GLSL.std.450" )]]
29
- enable_if_t<is_floating_point<FloatingPoint>::value, FloatingPoint> exp2 (FloatingPoint val);
28
+ enable_if_t<is_floating_point<FloatingPoint>::value && !is_matrix_v<FloatingPoint> , FloatingPoint> exp2 (FloatingPoint val);
30
29
31
30
template<typename FloatingPoint>
32
31
[[vk::ext_instruction (GLSLstd450::GLSLstd450InverseSqrt, "GLSL.std.450" )]]
33
- enable_if_t<is_floating_point_v<FloatingPoint>, FloatingPoint> inverseSqrt (FloatingPoint val);
32
+ enable_if_t<is_floating_point_v<FloatingPoint> && !is_matrix_v<FloatingPoint> , FloatingPoint> inverseSqrt (FloatingPoint val);
34
33
35
34
template<typename FloatingPoint>
36
35
[[vk::ext_instruction (GLSLstd450::GLSLstd450Floor, "GLSL.std.450" )]]
37
- enable_if_t<is_floating_point_v<FloatingPoint>, FloatingPoint> floor (FloatingPoint val);
36
+ enable_if_t<is_floating_point_v<FloatingPoint> && !is_matrix_v<FloatingPoint> , FloatingPoint> floor (FloatingPoint val);
38
37
39
38
template<typename FloatingPoint>
40
39
[[vk::ext_instruction (GLSLstd450::GLSLstd450Cross, "GLSL.std.450" )]]
41
40
enable_if_t<is_floating_point_v<FloatingPoint>, vector <FloatingPoint, 3 > > cross (in vector <FloatingPoint, 3 > lhs, in vector <FloatingPoint, 3 > rhs);
42
41
43
42
template<typename FloatingPoint>
44
43
[[vk::ext_instruction (GLSLstd450::GLSLstd450FMix, "GLSL.std.450" )]]
45
- enable_if_t<is_floating_point_v<FloatingPoint>, FloatingPoint> fMix (FloatingPoint val, FloatingPoint min , FloatingPoint max );
44
+ enable_if_t<is_floating_point_v<FloatingPoint> && !is_matrix_v<FloatingPoint> , FloatingPoint> fMix (FloatingPoint val, FloatingPoint min , FloatingPoint max );
46
45
47
46
template<typename T, int N>
48
47
[[vk::ext_instruction (GLSLstd450::GLSLstd450Determinant, "GLSL.std.450" )]]
49
48
T determinant (in matrix <T, N, N> mat);
50
49
50
+ template<typename T, int N>
51
+ [[vk::ext_instruction (GLSLstd450MatrixInverse, "GLSL.std.450" )]]
52
+ matrix <T, N, N> matrixInverse (in matrix <T, N, N> mat);
53
+
54
+ [[vk::ext_instruction (GLSLstd450UnpackSnorm2x16, "GLSL.std.450" )]]
55
+ float32_t2 unpackSnorm2x16 (uint32_t p);
56
+
57
+ [[vk::ext_instruction (GLSLstd450UnpackSnorm4x8, "GLSL.std.450" )]]
58
+ float32_t4 unpackSnorm4x8 (uint32_t p);
59
+
60
+ [[vk::ext_instruction (GLSLstd450UnpackUnorm4x8, "GLSL.std.450" )]]
61
+ float32_t4 unpackUnorm4x8 (uint32_t p);
62
+
51
63
}
52
64
}
53
65
}
0 commit comments