@@ -17,25 +17,23 @@ namespace hlsl
1717namespace spirv
1818{
1919
20+ template<typename T>
2021[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
2122[[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>
2625[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
2726[[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);
2928
29+ template<typename T>
3030[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
3131[[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>
3634[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
3735[[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);
3937
4038template<typename T>
4139[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
@@ -54,25 +52,31 @@ T groupBitwiseXor(uint32_t groupScope, [[vk::ext_literal]] uint32_t operation, T
5452
5553// The MIN and MAX operations in SPIR-V have different Ops for each arithmetic type
5654// so we implement them distinctly
55+ template<typename T>
5756[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
5857[[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>
6060[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
6161[[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>
6364[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
6465[[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);
6667
68+ template<typename T>
6769[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
6870[[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>
7073[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
7174[[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>
7377[[vk::ext_capability ( spv::CapabilityGroupNonUniformArithmetic )]]
7478[[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);
7680
7781}
7882}
0 commit comments