@@ -17,25 +17,23 @@ namespace hlsl
17
17
namespace spirv
18
18
{
19
19
20
+ template<typename T>
20
21
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
21
22
[[vk::ext_instruction ( spv::OpGroupNonUniformIAdd )]]
22
- int32_t groupAdd (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, int32_t value);
23
- [[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
24
- [[vk::ext_instruction ( spv::OpGroupNonUniformIAdd )]]
25
- uint32_t groupAdd (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, uint32_t value);
23
+ enable_if_t<!is_matrix_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> groupAdd (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
24
+ template<typename T>
26
25
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
27
26
[[vk::ext_instruction ( spv::OpGroupNonUniformFAdd )]]
28
- float32_t groupAdd (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, float32_t value);
27
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> groupAdd (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
29
28
29
+ template<typename T>
30
30
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
31
31
[[vk::ext_instruction ( spv::OpGroupNonUniformIMul )]]
32
- int32_t groupMul (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, int32_t value);
33
- [[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
34
- [[vk::ext_instruction ( spv::OpGroupNonUniformIMul )]]
35
- uint32_t groupMul (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, uint32_t value);
32
+ enable_if_t<!is_matrix_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> groupMul (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
33
+ template<typename T>
36
34
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
37
35
[[vk::ext_instruction ( spv::OpGroupNonUniformFMul )]]
38
- float32_t groupMul (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, float32_t value);
36
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> groupMul (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
39
37
40
38
template<typename T>
41
39
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
@@ -54,25 +52,31 @@ T groupBitwiseXor(uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T
54
52
55
53
// The MIN and MAX operations in SPIR-V have different Ops for each arithmetic type
56
54
// so we implement them distinctly
55
+ template<typename T>
57
56
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
58
57
[[vk::ext_instruction ( spv::OpGroupNonUniformSMin )]]
59
- int32_t groupBitwiseMin (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, int32_t value);
58
+ enable_if_t<!is_matrix_v<T> && is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> groupSMin (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
59
+ template<typename T>
60
60
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
61
61
[[vk::ext_instruction ( spv::OpGroupNonUniformUMin )]]
62
- uint32_t groupBitwiseMin (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, uint32_t value);
62
+ enable_if_t<!is_matrix_v<T> && !is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> groupUMin (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
63
+ template<typename T>
63
64
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
64
65
[[vk::ext_instruction ( spv::OpGroupNonUniformFMin )]]
65
- float32_t groupBitwiseMin (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, float32_t value);
66
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> groupFMin (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
66
67
68
+ template<typename T>
67
69
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
68
70
[[vk::ext_instruction ( spv::OpGroupNonUniformSMax )]]
69
- int32_t groupBitwiseMax (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, int32_t value);
71
+ enable_if_t<!is_matrix_v<T> && is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> groupSMax (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
72
+ template<typename T>
70
73
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
71
74
[[vk::ext_instruction ( spv::OpGroupNonUniformUMax )]]
72
- uint32_t groupBitwiseMax (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, uint32_t value);
75
+ enable_if_t<!is_matrix_v<T> && !is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> groupUMax (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
76
+ template<typename T>
73
77
[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
74
78
[[vk::ext_instruction ( spv::OpGroupNonUniformFMax )]]
75
- float32_t groupBitwiseMax (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, float32_t value);
79
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> groupFMax (uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T value);
76
80
77
81
}
78
82
}
0 commit comments