@@ -20,9 +20,6 @@ namespace spirv
20
20
{
21
21
22
22
//! General Decls
23
- template<class T>
24
- NBL_CONSTEXPR_STATIC_INLINE bool is_pointer_v = is_spirv_type<T>::value;
25
-
26
23
template<uint32_t StorageClass, typename T>
27
24
struct pointer
28
25
{
@@ -38,6 +35,9 @@ struct pointer<spv::StorageClassPhysicalStorageBuffer, T>
38
35
template<uint32_t StorageClass, typename T>
39
36
using pointer_t = typename pointer<StorageClass, T>::type;
40
37
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
+
41
41
// The holy operation that makes addrof possible
42
42
template<uint32_t StorageClass, typename T>
43
43
[[vk::ext_instruction (spv::OpCopyObject)]]
@@ -49,11 +49,31 @@ template<typename SquareMatrix>
49
49
[[vk::ext_instruction (34 /* GLSLstd450MatrixInverse */ , "GLSL.std.450" )]]
50
50
SquareMatrix matrixInverse (NBL_CONST_REF_ARG (SquareMatrix) mat);
51
51
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
52
72
// 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)
53
73
template<typename T, typename U>
54
74
[[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
55
75
[[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);
57
77
58
78
template<typename T>
59
79
[[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
@@ -548,58 +568,6 @@ namespace group_operation
548
568
}
549
569
550
570
//! 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
-
603
571
template<typename T>
604
572
[[vk::ext_capability (spv::CapabilityBitInstructions)]]
605
573
[[vk::ext_instruction (spv::OpBitFieldInsert)]]
@@ -838,17 +806,17 @@ enable_if_t<(is_signed_v<T> || is_unsigned_v<T>), T> groupNonUniformIAdd_GroupNo
838
806
template<typename T>
839
807
[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
840
808
[[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);
842
810
843
811
template<typename T>
844
812
[[vk::ext_capability (spv::CapabilityGroupNonUniformClustered)]]
845
813
[[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);
847
815
848
816
template<typename T>
849
817
[[vk::ext_capability (spv::CapabilityGroupNonUniformPartitionedNV)]]
850
818
[[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);
852
820
853
821
template<typename T>
854
822
[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
@@ -868,17 +836,17 @@ enable_if_t<(is_signed_v<T> || is_unsigned_v<T>), T> groupNonUniformIMul_GroupNo
868
836
template<typename T>
869
837
[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
870
838
[[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);
872
840
873
841
template<typename T>
874
842
[[vk::ext_capability (spv::CapabilityGroupNonUniformClustered)]]
875
843
[[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);
877
845
878
846
template<typename T>
879
847
[[vk::ext_capability (spv::CapabilityGroupNonUniformPartitionedNV)]]
880
848
[[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);
882
850
883
851
template<typename T>
884
852
[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
@@ -913,17 +881,17 @@ enable_if_t<is_unsigned_v<T>, T> groupNonUniformUMin_GroupNonUniformPartitionedN
913
881
template<typename T>
914
882
[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
915
883
[[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);
917
885
918
886
template<typename T>
919
887
[[vk::ext_capability (spv::CapabilityGroupNonUniformClustered)]]
920
888
[[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);
922
890
923
891
template<typename T>
924
892
[[vk::ext_capability (spv::CapabilityGroupNonUniformPartitionedNV)]]
925
893
[[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);
927
895
928
896
template<typename T>
929
897
[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
@@ -958,17 +926,17 @@ enable_if_t<is_unsigned_v<T>, T> groupNonUniformUMax_GroupNonUniformPartitionedN
958
926
template<typename T>
959
927
[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
960
928
[[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);
962
930
963
931
template<typename T>
964
932
[[vk::ext_capability (spv::CapabilityGroupNonUniformClustered)]]
965
933
[[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);
967
935
968
936
template<typename T>
969
937
[[vk::ext_capability (spv::CapabilityGroupNonUniformPartitionedNV)]]
970
938
[[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);
972
940
973
941
template<typename T>
974
942
[[vk::ext_capability (spv::CapabilityGroupNonUniformArithmetic)]]
0 commit comments