@@ -20,9 +20,6 @@ namespace spirv
2020{
2121
2222//! General Decls
23- template<class T>
24- NBL_CONSTEXPR_STATIC_INLINE bool is_pointer_v = is_spirv_type<T>::value;
25-
2623template<uint32_t StorageClass, typename T>
2724struct pointer
2825{
@@ -38,6 +35,9 @@ struct pointer<spv::StorageClassPhysicalStorageBuffer, T>
3835template<uint32_t StorageClass, typename T>
3936using pointer_t = typename pointer<StorageClass, T>::type;
4037
38+ template<uint32_t StorageClass, typename T>
39+ NBL_CONSTEXPR_STATIC_INLINE bool is_pointer_v = is_same_v<T, typename pointer<StorageClass, T>::type >;
40+
4141// The holy operation that makes addrof possible
4242template<uint32_t StorageClass, typename T>
4343[[vk::ext_instruction (spv::OpCopyObject)]]
@@ -49,11 +49,31 @@ template<typename SquareMatrix>
4949[[vk::ext_instruction (34 /* GLSLstd450MatrixInverse */ , "GLSL.std.450" )]]
5050SquareMatrix matrixInverse (NBL_CONST_REF_ARG (SquareMatrix) mat);
5151
52+ //! Memory instructions
53+ template<typename T, uint32_t alignment>
54+ [[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
55+ [[vk::ext_instruction (spv::OpLoad)]]
56+ T load (pointer_t<spv::StorageClassPhysicalStorageBuffer, T> pointer, [[vk::ext_literal]] uint32_t __aligned = /*Aligned*/ 0x00000002 , [[vk::ext_literal]] uint32_t __alignment = alignment);
57+
58+ template<typename T, typename P>
59+ [[vk::ext_instruction (spv::OpLoad)]]
60+ enable_if_t<is_spirv_type_v<P>, T> load (P pointer);
61+
62+ template<typename T, uint32_t alignment>
63+ [[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
64+ [[vk::ext_instruction (spv::OpStore)]]
65+ void store (pointer_t<spv::StorageClassPhysicalStorageBuffer, T> pointer, T obj, [[vk::ext_literal]] uint32_t __aligned = /*Aligned*/ 0x00000002 , [[vk::ext_literal]] uint32_t __alignment = alignment);
66+
67+ template<typename T, typename P>
68+ [[vk::ext_instruction (spv::OpStore)]]
69+ enable_if_t<is_spirv_type_v<P>, void > store (P pointer, T obj);
70+
71+ //! Bitcast Instructions
5272// Add specializations if you need to emit a `ext_capability` (this means that the instruction needs to forward through an `impl::` struct and so on)
5373template<typename T, typename U>
5474[[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
5575[[vk::ext_instruction (spv::OpBitcast)]]
56- enable_if_t<is_pointer_v<T>, T> bitcast (U);
76+ enable_if_t<is_pointer_v<spv::StorageClassPhysicalStorageBuffer, T>, T> bitcast (U);
5777
5878template<typename T>
5979[[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
@@ -548,58 +568,6 @@ namespace group_operation
548568}
549569
550570//! Instructions
551- template<typename T, typename P>
552- [[vk::ext_instruction (spv::OpLoad)]]
553- enable_if_t<is_spirv_type_v<P>, T> load (P pointer, [[vk::ext_literal]] uint32_t memoryAccess);
554-
555- template<typename T, typename P>
556- [[vk::ext_instruction (spv::OpLoad)]]
557- enable_if_t<is_spirv_type_v<P>, T> load (P pointer, [[vk::ext_literal]] uint32_t memoryAccess, [[vk::ext_literal]] uint32_t memoryAccessParam);
558-
559- template<typename T, typename P, uint32_t alignment>
560- [[vk::ext_instruction (spv::OpLoad)]]
561- enable_if_t<is_spirv_type_v<P>, T> load (P pointer, [[vk::ext_literal]] uint32_t __aligned = /*Aligned*/ 0x00000002 , [[vk::ext_literal]] uint32_t __alignment = alignment);
562-
563- template<typename T, typename P>
564- [[vk::ext_instruction (spv::OpLoad)]]
565- enable_if_t<is_spirv_type_v<P>, T> load (P pointer);
566-
567- template<typename T, uint32_t alignment>
568- [[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
569- [[vk::ext_instruction (spv::OpLoad)]]
570- T load (pointer_t<spv::StorageClassPhysicalStorageBuffer, T> pointer, [[vk::ext_literal]] uint32_t __aligned = /*Aligned*/ 0x00000002 , [[vk::ext_literal]] uint32_t __alignment = alignment);
571-
572- template<typename T>
573- [[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
574- [[vk::ext_instruction (spv::OpLoad)]]
575- T load (pointer_t<spv::StorageClassPhysicalStorageBuffer, T> pointer);
576-
577- template<typename T, typename P>
578- [[vk::ext_instruction (spv::OpStore)]]
579- enable_if_t<is_spirv_type_v<P>, void > store (P pointer, T object, [[vk::ext_literal]] uint32_t memoryAccess);
580-
581- template<typename T, typename P>
582- [[vk::ext_instruction (spv::OpStore)]]
583- enable_if_t<is_spirv_type_v<P>, void > store (P pointer, T object, [[vk::ext_literal]] uint32_t memoryAccess, [[vk::ext_literal]] uint32_t memoryAccessParam);
584-
585- template<typename T, typename P, uint32_t alignment>
586- [[vk::ext_instruction (spv::OpStore)]]
587- enable_if_t<is_spirv_type_v<P>, void > store (P pointer, T object, [[vk::ext_literal]] uint32_t __aligned = /*Aligned*/ 0x00000002 , [[vk::ext_literal]] uint32_t __alignment = alignment);
588-
589- template<typename T, typename P>
590- [[vk::ext_instruction (spv::OpStore)]]
591- enable_if_t<is_spirv_type_v<P>, void > store (P pointer, T object);
592-
593- template<typename T, uint32_t alignment>
594- [[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
595- [[vk::ext_instruction (spv::OpStore)]]
596- void store (pointer_t<spv::StorageClassPhysicalStorageBuffer, T> pointer, T object, [[vk::ext_literal]] uint32_t __aligned = /*Aligned*/ 0x00000002 , [[vk::ext_literal]] uint32_t __alignment = alignment);
597-
598- template<typename T>
599- [[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
600- [[vk::ext_instruction (spv::OpStore)]]
601- void store (pointer_t<spv::StorageClassPhysicalStorageBuffer, T> pointer, T object);
602-
603571template<typename T>
604572[[vk::ext_capability (spv::CapabilityBitInstructions)]]
605573[[vk::ext_instruction (spv::OpBitFieldInsert)]]
@@ -838,17 +806,17 @@ enable_if_t<(is_signed_v<T> || is_unsigned_v<T>), T> groupNonUniformIAdd_GroupNo
838806template<typename T>
839807[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
840808[[vk::ext_instruction (spv::OpGroupNonUniformFAdd)]]
841- enable_if_t<is_floating_point<T> , T> groupNonUniformFAdd_GroupNonUniformArithmetic (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
809+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFAdd_GroupNonUniformArithmetic (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
842810
843811template<typename T>
844812[[vk::ext_capability (spv::CapabilityGroupNonUniformClustered)]]
845813[[vk::ext_instruction (spv::OpGroupNonUniformFAdd)]]
846- enable_if_t<is_floating_point<T> , T> groupNonUniformFAdd_GroupNonUniformClustered (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
814+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFAdd_GroupNonUniformClustered (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
847815
848816template<typename T>
849817[[vk::ext_capability (spv::CapabilityGroupNonUniformPartitionedNV)]]
850818[[vk::ext_instruction (spv::OpGroupNonUniformFAdd)]]
851- enable_if_t<is_floating_point<T> , T> groupNonUniformFAdd_GroupNonUniformPartitionedNV (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
819+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFAdd_GroupNonUniformPartitionedNV (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
852820
853821template<typename T>
854822[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
@@ -868,17 +836,17 @@ enable_if_t<(is_signed_v<T> || is_unsigned_v<T>), T> groupNonUniformIMul_GroupNo
868836template<typename T>
869837[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
870838[[vk::ext_instruction (spv::OpGroupNonUniformFMul)]]
871- enable_if_t<is_floating_point<T> , T> groupNonUniformFMul_GroupNonUniformArithmetic (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
839+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFMul_GroupNonUniformArithmetic (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
872840
873841template<typename T>
874842[[vk::ext_capability (spv::CapabilityGroupNonUniformClustered)]]
875843[[vk::ext_instruction (spv::OpGroupNonUniformFMul)]]
876- enable_if_t<is_floating_point<T> , T> groupNonUniformFMul_GroupNonUniformClustered (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
844+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFMul_GroupNonUniformClustered (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
877845
878846template<typename T>
879847[[vk::ext_capability (spv::CapabilityGroupNonUniformPartitionedNV)]]
880848[[vk::ext_instruction (spv::OpGroupNonUniformFMul)]]
881- enable_if_t<is_floating_point<T> , T> groupNonUniformFMul_GroupNonUniformPartitionedNV (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
849+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFMul_GroupNonUniformPartitionedNV (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
882850
883851template<typename T>
884852[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
@@ -913,17 +881,17 @@ enable_if_t<is_unsigned_v<T>, T> groupNonUniformUMin_GroupNonUniformPartitionedN
913881template<typename T>
914882[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
915883[[vk::ext_instruction (spv::OpGroupNonUniformFMin)]]
916- enable_if_t<is_floating_point<T> , T> groupNonUniformFMin_GroupNonUniformArithmetic (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
884+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFMin_GroupNonUniformArithmetic (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
917885
918886template<typename T>
919887[[vk::ext_capability (spv::CapabilityGroupNonUniformClustered)]]
920888[[vk::ext_instruction (spv::OpGroupNonUniformFMin)]]
921- enable_if_t<is_floating_point<T> , T> groupNonUniformFMin_GroupNonUniformClustered (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
889+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFMin_GroupNonUniformClustered (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
922890
923891template<typename T>
924892[[vk::ext_capability (spv::CapabilityGroupNonUniformPartitionedNV)]]
925893[[vk::ext_instruction (spv::OpGroupNonUniformFMin)]]
926- enable_if_t<is_floating_point<T> , T> groupNonUniformFMin_GroupNonUniformPartitionedNV (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
894+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFMin_GroupNonUniformPartitionedNV (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
927895
928896template<typename T>
929897[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
@@ -958,17 +926,17 @@ enable_if_t<is_unsigned_v<T>, T> groupNonUniformUMax_GroupNonUniformPartitionedN
958926template<typename T>
959927[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
960928[[vk::ext_instruction (spv::OpGroupNonUniformFMax)]]
961- enable_if_t<is_floating_point<T> , T> groupNonUniformFMax_GroupNonUniformArithmetic (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
929+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFMax_GroupNonUniformArithmetic (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
962930
963931template<typename T>
964932[[vk::ext_capability (spv::CapabilityGroupNonUniformClustered)]]
965933[[vk::ext_instruction (spv::OpGroupNonUniformFMax)]]
966- enable_if_t<is_floating_point<T> , T> groupNonUniformFMax_GroupNonUniformClustered (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
934+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFMax_GroupNonUniformClustered (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
967935
968936template<typename T>
969937[[vk::ext_capability (spv::CapabilityGroupNonUniformPartitionedNV)]]
970938[[vk::ext_instruction (spv::OpGroupNonUniformFMax)]]
971- enable_if_t<is_floating_point<T> , T> groupNonUniformFMax_GroupNonUniformPartitionedNV (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
939+ enable_if_t<(is_same_v<float16_t, T> || is_same_v<float32_t, T> || is_same_v<float64_t, T>) , T> groupNonUniformFMax_GroupNonUniformPartitionedNV (uint32_t executionScope, [[vk::ext_literal]] uint32_t operation, T value);
972940
973941template<typename T>
974942[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
0 commit comments