@@ -17,6 +17,40 @@ namespace nbl
17
17
namespace hlsl
18
18
{
19
19
#ifdef __HLSL_VERSION
20
+
21
+
22
+ #if __SPIRV_MAJOR_VERSION__>1 || (__SPIRV_MAJOR_VERSION__==1 && __SPIRV_MINOR_VERSION__>=5 )
23
+
24
+ #define __NBL_SPIRV_SUPERSET_1_5__
25
+
26
+ #define __NBL_CAPABILITY_VulkanMemoryModel [[vk::ext_capability (spv::CapabilityVulkanMemoryModel)]]
27
+ #define __NBL_CAPABILITY_ShaderNonUniform [[vk::ext_capability (spv::CapabilityShaderNonUniform)]]
28
+ #define __NBL_CAPABILITY_PhysicalStorageBufferAddresses [[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
29
+ // TODO: some poor soul needs to study rest of https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#_capability
30
+ #define __NBL_CAPABILITY_ShaderLayer [[vk::ext_capability (spv::CapabilityShaderLayer)]]
31
+ #define __NBL_CAPABILITY_ShaderViewportIndex [[vk::ext_capability (spv::CapabilityShaderViewportIndex)]]
32
+
33
+ #else
34
+
35
+ #define __NBL_CAPABILITY_VulkanMemoryModel [[vk::ext_capability (spv::CapabilityVulkanMemoryModel)]] [[vk::ext_extension ("SPV_KHR_vulkan_memory_model" )]]
36
+ #define __NBL_CAPABILITY_ShaderNonUniform [[vk::ext_capability (spv::CapabilityShaderNonUniform)]] [[vk::ext_extension ("SPV_EXT_descriptor_indexing" )]]
37
+ #define __NBL_CAPABILITY_PhysicalStorageBufferAddresses [[vk::ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]] [[vk::ext_extension ("SPV_KHR_physical_storage_buffer" )]]
38
+
39
+ #endif
40
+
41
+
42
+ #if __SPIRV_MAJOR_VERSION__>1 || (__SPIRV_MAJOR_VERSION__==1 && __SPIRV_MINOR_VERSION__>=6 )
43
+
44
+ #define __NBL_SPIRV_SUPERSET_1_6__
45
+
46
+ // 1.6 core caps
47
+
48
+ #else
49
+
50
+ // 1.6 core caps and their old extensions
51
+
52
+ #endif
53
+
20
54
namespace spirv
21
55
{
22
56
//! General
@@ -171,7 +205,7 @@ enable_if_t<is_spirv_type_v<Ptr_T>, T> atomicCompareExchange(Ptr_T ptr, uint32_t
171
205
172
206
173
207
template<typename T, uint32_t alignment>
174
- [[vk:: ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
208
+ __NBL_CAPABILITY_PhysicalStorageBufferAddresses
175
209
[[vk::ext_instruction (spv::OpLoad)]]
176
210
T load (pointer_t<spv::StorageClassPhysicalStorageBuffer,T> pointer, [[vk::ext_literal]] uint32_t __aligned = /*Aligned*/ 0x00000002 , [[vk::ext_literal]] uint32_t __alignment = alignment);
177
211
@@ -180,7 +214,7 @@ template<typename T, typename P>
180
214
enable_if_t<is_spirv_type_v<P>,T> load (P pointer);
181
215
182
216
template<typename T, uint32_t alignment>
183
- [[vk:: ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
217
+ __NBL_CAPABILITY_PhysicalStorageBufferAddresses
184
218
[[vk::ext_instruction (spv::OpStore)]]
185
219
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);
186
220
@@ -205,12 +239,12 @@ template<typename T, typename U>
205
239
enable_if_t<is_spirv_type_v<T> && is_spirv_type_v<U>, T> bitcast (U);
206
240
207
241
template<typename T>
208
- [[vk:: ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
242
+ __NBL_CAPABILITY_PhysicalStorageBufferAddresses
209
243
[[vk::ext_instruction (spv::OpBitcast)]]
210
244
uint64_t bitcast (pointer_t<spv::StorageClassPhysicalStorageBuffer,T>);
211
245
212
246
template<typename T>
213
- [[vk:: ext_capability (spv::CapabilityPhysicalStorageBufferAddresses)]]
247
+ __NBL_CAPABILITY_PhysicalStorageBufferAddresses
214
248
[[vk::ext_instruction (spv::OpBitcast)]]
215
249
pointer_t<spv::StorageClassPhysicalStorageBuffer,T> bitcast (uint64_t);
216
250
@@ -269,8 +303,7 @@ enable_if_t<is_vector_v<BooleanVector>&& is_same_v<typename vector_traits<Boolea
269
303
}
270
304
271
305
#endif
272
- }
273
306
}
274
-
307
+ }
275
308
#endif
276
309
#endif
0 commit comments