@@ -81,29 +81,77 @@ T subgroupExclusiveXor(T value) {
81
81
}
82
82
83
83
template<typename T>
84
- T subgroupMin (T value) {
85
- return spirv::groupBitwiseMin (spv::ScopeSubgroup, spv::GroupOperationReduce, value);
84
+ enable_if_t<!is_matrix_v<T> && is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupMin (T value) {
85
+ return spirv::groupSMin (spv::ScopeSubgroup, spv::GroupOperationReduce, value);
86
86
}
87
87
template<typename T>
88
- T subgroupInclusiveMin (T value) {
89
- return spirv::groupBitwiseMin (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan , value);
88
+ enable_if_t<!is_matrix_v<T> && !is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupMin (T value) {
89
+ return spirv::groupUMin (spv::ScopeSubgroup, spv::GroupOperationReduce , value);
90
90
}
91
91
template<typename T>
92
- T subgroupExclusiveMin (T value) {
93
- return spirv::groupBitwiseMin (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
92
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> subgroupMin (T value) {
93
+ return spirv::groupFMin (spv::ScopeSubgroup, spv::GroupOperationReduce, value);
94
+ }
95
+ template<typename T>
96
+ enable_if_t<!is_matrix_v<T> && is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupInclusiveMin (T value) {
97
+ return spirv::groupSMin (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, value);
98
+ }
99
+ template<typename T>
100
+ enable_if_t<!is_matrix_v<T> && !is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupInclusiveMin (T value) {
101
+ return spirv::groupUMin (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, value);
102
+ }
103
+ template<typename T>
104
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> subgroupInclusiveMin (T value) {
105
+ return spirv::groupFMin (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, value);
106
+ }
107
+ template<typename T>
108
+ enable_if_t<!is_matrix_v<T> && is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupExclusiveMin (T value) {
109
+ return spirv::groupSMin (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
110
+ }
111
+ template<typename T>
112
+ enable_if_t<!is_matrix_v<T> && !is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupExclusiveMin (T value) {
113
+ return spirv::groupUMin (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
114
+ }
115
+ template<typename T>
116
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> subgroupExclusiveMin (T value) {
117
+ return spirv::groupFMin (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
94
118
}
95
119
96
120
template<typename T>
97
- T subgroupMax (T value) {
98
- return spirv::groupBitwiseMax (spv::ScopeSubgroup, spv::GroupOperationReduce, value);
121
+ enable_if_t<!is_matrix_v<T> && is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupMax (T value) {
122
+ return spirv::groupSMax (spv::ScopeSubgroup, spv::GroupOperationReduce, value);
123
+ }
124
+ template<typename T>
125
+ enable_if_t<!is_matrix_v<T> && !is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupMax (T value) {
126
+ return spirv::groupUMax (spv::ScopeSubgroup, spv::GroupOperationReduce, value);
127
+ }
128
+ template<typename T>
129
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> subgroupMax (T value) {
130
+ return spirv::groupFMax (spv::ScopeSubgroup, spv::GroupOperationReduce, value);
131
+ }
132
+ template<typename T>
133
+ enable_if_t<!is_matrix_v<T> && is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupInclusiveMax (T value) {
134
+ return spirv::groupSMax (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, value);
135
+ }
136
+ template<typename T>
137
+ enable_if_t<!is_matrix_v<T> && !is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupInclusiveMax (T value) {
138
+ return spirv::groupUMax (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, value);
139
+ }
140
+ template<typename T>
141
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> subgroupInclusiveMax (T value) {
142
+ return spirv::groupFMax (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, value);
143
+ }
144
+ template<typename T>
145
+ enable_if_t<!is_matrix_v<T> && is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupExclusiveMax (T value) {
146
+ return spirv::groupSMax (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
99
147
}
100
148
template<typename T>
101
- T subgroupInclusiveMax (T value) {
102
- return spirv::groupBitwiseMax (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan , value);
149
+ enable_if_t<!is_matrix_v<T> && !is_signed_v<T> && is_integral_v<typename vector_traits<T>::scalar_type>, T> subgroupExclusiveMax (T value) {
150
+ return spirv::groupUMax (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan , value);
103
151
}
104
152
template<typename T>
105
- T subgroupExclusiveMax (T value) {
106
- return spirv::groupBitwiseMax (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
153
+ enable_if_t<!is_matrix_v<T> && is_floating_point_v<typename vector_traits<T>::scalar_type>, T> subgroupExclusiveMax (T value) {
154
+ return spirv::groupFMax (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
107
155
}
108
156
109
157
}
0 commit comments