@@ -45,49 +45,20 @@ namespace
4545
4646struct SPIRVShaderResourceRefAttribs
4747{
48- // clang-format off
49-
50- /* 0 */ const char * const Name;
51- /* 8 */ const Uint16 ArraySize;
52- /* 10 */ const SPIRVShaderResourceAttribs::ResourceType Type;
53- /* 11.0*/ const Uint8 ResourceDim : 7 ; // RESOURCE_DIMENSION
54- /* 11.7*/ const Uint8 IsMS : 1 ;
55-
56- // Offset in SPIRV words (uint32_t) of binding & descriptor set decorations in SPIRV binary
57- /* 12 */ const uint32_t BindingDecorationOffset;
58- /* 16 */ const uint32_t DescriptorSetDecorationOffset;
59-
60- /* 20 */ const Uint32 BufferStaticSize;
61- /* 24 */ const Uint32 BufferStride;
62- /* 28 */
63- /* 32 */ // End of structure
64-
65- // clang-format on
66- //
67- // Test-only constructor for creating reference resources
68- SPIRVShaderResourceRefAttribs (const char * _Name,
69- SPIRVShaderResourceAttribs::ResourceType _Type,
70- Uint16 _ArraySize,
71- RESOURCE_DIMENSION _ResourceDim,
72- Uint8 _IsMS,
73- Uint32 _BufferStaticSize,
74- Uint32 _BufferStride) noexcept :
75- // clang-format off
76- Name {_Name},
77- ArraySize {_ArraySize},
78- Type {_Type},
79- ResourceDim {static_cast <Uint8>(_ResourceDim)},
80- IsMS {_IsMS},
81- BindingDecorationOffset {0 }, // Not used in tests
82- DescriptorSetDecorationOffset {0 }, // Not used in tests
83- BufferStaticSize {_BufferStaticSize},
84- BufferStride {_BufferStride}
85- // clang-format on
86- {}
48+ const char * const Name;
49+ const Uint16 ArraySize;
50+ const SPIRVShaderResourceAttribs::ResourceType Type;
51+ const Uint8 ResourceDim; // RESOURCE_DIMENSION
52+ const Uint8 IsMS;
53+
54+ // Offset in SPIRV words (uint32_t) of binding & descriptor set decorations in SPIRV binary
55+ const uint32_t BindingDecorationOffset;
56+ const uint32_t DescriptorSetDecorationOffset;
57+
58+ const Uint32 BufferStaticSize;
59+ const Uint32 BufferStride;
8760};
8861
89- static_assert (sizeof (SPIRVShaderResourceRefAttribs) == sizeof (SPIRVShaderResourceAttribs), " Size of SPIRVShaderResourceRefAttribs struct must be equal to SPIRVShaderResourceAttribs" );
90-
9162std::vector<unsigned int > LoadSPIRVFromHLSL (const char * FilePath, SHADER_TYPE ShaderType = SHADER_TYPE_PIXEL)
9263{
9364 std::vector<unsigned int > SPIRV;
@@ -271,8 +242,8 @@ TEST(SPIRVShaderResources, UniformBuffers)
271242 TestSPIRVResources (" UniformBuffers.psh" ,
272243 {
273244 // CB0 is optimized away as it's not used in the shader
274- SPIRVShaderResourceRefAttribs{" CB1" , SPIRVResourceType::UniformBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 48 , 0 },
275- SPIRVShaderResourceRefAttribs{" CB2" , SPIRVResourceType::UniformBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
245+ SPIRVShaderResourceRefAttribs{" CB1" , 1 , SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0 , 48 , 0 },
246+ SPIRVShaderResourceRefAttribs{" CB2" , 1 , SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
276247 });
277248}
278249
@@ -281,20 +252,20 @@ TEST(SPIRVShaderResources, StorageBuffers)
281252 TestSPIRVResources (" StorageBuffers.psh" ,
282253 {
283254 // StructuredBuffers have BufferStaticSize=0 (runtime array) and BufferStride is the element size
284- SPIRVShaderResourceRefAttribs{" g_ROBuffer" , SPIRVResourceType::ROStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 32 },
285- SPIRVShaderResourceRefAttribs{" g_RWBuffer" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
255+ SPIRVShaderResourceRefAttribs{" g_ROBuffer" , 1 , SPIRVResourceType::ROStorageBuffer, RESOURCE_DIM_BUFFER, 0 , 0 , 32 },
256+ SPIRVShaderResourceRefAttribs{" g_RWBuffer" , 1 , SPIRVResourceType::RWStorageBuffer, RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
286257 // ByteAddressBuffers also have BufferStaticSize=0 and BufferStride=4 (uint size)
287- SPIRVShaderResourceRefAttribs{" g_ROAtomicBuffer" , SPIRVResourceType::ROStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 4 },
288- SPIRVShaderResourceRefAttribs{" g_RWAtomicBuffer" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 4 },
258+ SPIRVShaderResourceRefAttribs{" g_ROAtomicBuffer" , 1 , SPIRVResourceType::ROStorageBuffer, RESOURCE_DIM_BUFFER, 0 , 0 , 4 },
259+ SPIRVShaderResourceRefAttribs{" g_RWAtomicBuffer" , 1 , SPIRVResourceType::RWStorageBuffer, RESOURCE_DIM_BUFFER, 0 , 0 , 4 },
289260 });
290261}
291262
292263TEST (SPIRVShaderResources, TexelBuffers)
293264{
294265 TestSPIRVResources (" TexelBuffers.psh" ,
295266 {
296- SPIRVShaderResourceRefAttribs{" g_UniformTexelBuffer" , SPIRVResourceType::UniformTexelBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 0 },
297- SPIRVShaderResourceRefAttribs{" g_StorageTexelBuffer" , SPIRVResourceType::StorageTexelBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 0 },
267+ SPIRVShaderResourceRefAttribs{" g_UniformTexelBuffer" , 1 , SPIRVResourceType::UniformTexelBuffer, RESOURCE_DIM_BUFFER, 0 , 0 , 0 },
268+ SPIRVShaderResourceRefAttribs{" g_StorageTexelBuffer" , 1 , SPIRVResourceType::StorageTexelBuffer, RESOURCE_DIM_BUFFER, 0 , 0 , 0 },
298269 });
299270}
300271
@@ -304,17 +275,17 @@ TEST(SPIRVShaderResources, Textures)
304275 {
305276 // When textures and samplers are declared separately in HLSL, they are compiled as separate_images
306277 // instead of sampled_images. This is the correct behavior for separate sampler/texture declarations.
307- SPIRVShaderResourceRefAttribs{" g_SampledImage" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
308- SPIRVShaderResourceRefAttribs{" g_SampledImageMS" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 1 , 0 , 0 },
309- SPIRVShaderResourceRefAttribs{" g_SampledImage3D" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_3D, 0 , 0 , 0 },
310- SPIRVShaderResourceRefAttribs{" g_SampledImageCube" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_CUBE, 0 , 0 , 0 },
311- SPIRVShaderResourceRefAttribs{" g_Sampler" , SPIRVResourceType::SeparateSampler, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
312- SPIRVShaderResourceRefAttribs{" g_SeparateImage" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
278+ SPIRVShaderResourceRefAttribs{" g_SampledImage" , 1 , SPIRVResourceType::SeparateImage, RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
279+ SPIRVShaderResourceRefAttribs{" g_SampledImageMS" , 1 , SPIRVResourceType::SeparateImage, RESOURCE_DIM_TEX_2D, 1 , 0 , 0 },
280+ SPIRVShaderResourceRefAttribs{" g_SampledImage3D" , 1 , SPIRVResourceType::SeparateImage, RESOURCE_DIM_TEX_3D, 0 , 0 , 0 },
281+ SPIRVShaderResourceRefAttribs{" g_SampledImageCube" , 1 , SPIRVResourceType::SeparateImage, RESOURCE_DIM_TEX_CUBE, 0 , 0 , 0 },
282+ SPIRVShaderResourceRefAttribs{" g_Sampler" , 1 , SPIRVResourceType::SeparateSampler, RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
283+ SPIRVShaderResourceRefAttribs{" g_SeparateImage" , 1 , SPIRVResourceType::SeparateImage, RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
313284 // Combined sampler: g_Texture and g_Texture_sampler
314285 // Note: Even with CombinedSamplerSuffix, SPIRV may still classify them as separate_images
315286 // if they are declared separately. The CombinedSamplerSuffix is mainly used for naming convention.
316- SPIRVShaderResourceRefAttribs{" g_Texture" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
317- SPIRVShaderResourceRefAttribs{" g_Texture_sampler" , SPIRVResourceType::SeparateSampler, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
287+ SPIRVShaderResourceRefAttribs{" g_Texture" , 1 , SPIRVResourceType::SeparateImage, RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
288+ SPIRVShaderResourceRefAttribs{" g_Texture_sampler" , 1 , SPIRVResourceType::SeparateSampler, RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
318289 });
319290}
320291
@@ -323,9 +294,9 @@ TEST(SPIRVShaderResources, StorageImages)
323294 TestSPIRVResources (" StorageImages.psh" ,
324295 {
325296 // Note: HLSL does not support RWTextureCube, so we only test 2D, 2DArray, and 3D storage images
326- SPIRVShaderResourceRefAttribs{" g_RWImage2D" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
327- SPIRVShaderResourceRefAttribs{" g_RWImage2DArray" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_2D_ARRAY, 0 , 0 , 0 },
328- SPIRVShaderResourceRefAttribs{" g_RWImage3D" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_3D, 0 , 0 , 0 },
297+ SPIRVShaderResourceRefAttribs{" g_RWImage2D" , 1 , SPIRVResourceType::StorageImage, RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
298+ SPIRVShaderResourceRefAttribs{" g_RWImage2DArray" , 1 , SPIRVResourceType::StorageImage, RESOURCE_DIM_TEX_2D_ARRAY, 0 , 0 , 0 },
299+ SPIRVShaderResourceRefAttribs{" g_RWImage3D" , 1 , SPIRVResourceType::StorageImage, RESOURCE_DIM_TEX_3D, 0 , 0 , 0 },
329300 });
330301}
331302
@@ -337,7 +308,7 @@ TEST(SPIRVShaderResources, AtomicCounters)
337308 // The resource name is the buffer block name (AtomicCounterBuffer), not the instance name (g_AtomicCounter).
338309 TestSPIRVResources (" AtomicCounters.glsl" ,
339310 {
340- SPIRVShaderResourceRefAttribs{" AtomicCounterBuffer" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 4 , 0 },
311+ SPIRVShaderResourceRefAttribs{" AtomicCounterBuffer" , 1 , SPIRVResourceType::RWStorageBuffer, RESOURCE_DIM_BUFFER, 0 , 4 , 0 },
341312 },
342313 SHADER_TYPE_PIXEL,
343314 nullptr ,
@@ -348,7 +319,7 @@ TEST(SPIRVShaderResources, InputAttachments)
348319{
349320 TestSPIRVResources (" InputAttachments.psh" ,
350321 {
351- SPIRVShaderResourceRefAttribs{" g_InputAttachment" , SPIRVResourceType::InputAttachment, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
322+ SPIRVShaderResourceRefAttribs{" g_InputAttachment" , 1 , SPIRVResourceType::InputAttachment, RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
352323 });
353324}
354325
@@ -359,7 +330,7 @@ TEST(SPIRVShaderResources, AccelerationStructures)
359330 // The ray gen shader uses traceRayEXT with g_AccelStruct to ensure it's not optimized away
360331 TestSPIRVResources (" AccelerationStructures.glsl" ,
361332 {
362- SPIRVShaderResourceRefAttribs{" g_AccelStruct" , SPIRVResourceType::AccelerationStructure, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
333+ SPIRVShaderResourceRefAttribs{" g_AccelStruct" , 1 , SPIRVResourceType::AccelerationStructure, RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
363334 },
364335 SHADER_TYPE_RAY_GEN,
365336 nullptr ,
@@ -373,7 +344,7 @@ TEST(SPIRVShaderResources, PushConstants)
373344 // Total: 16 + 4 + 2 + 1 + 1 = 24 floats/uints = 24 * 4 bytes = 96 bytes = 24 words
374345 TestSPIRVResources (" PushConstants.psh" ,
375346 {
376- SPIRVShaderResourceRefAttribs{" PushConstants" , SPIRVResourceType::PushConstant, 24 , RESOURCE_DIM_BUFFER, 0 , 96 , 0 },
347+ SPIRVShaderResourceRefAttribs{" PushConstants" , 24 , SPIRVResourceType::PushConstant, RESOURCE_DIM_BUFFER, 0 , 96 , 0 },
377348 });
378349}
379350
@@ -382,18 +353,18 @@ TEST(SPIRVShaderResources, MixedResources)
382353 TestSPIRVResources (" MixedResources.psh" ,
383354 {
384355 // UniformBuff: float4x4 (64 bytes) + float4 (16 bytes) = 80 bytes
385- SPIRVShaderResourceRefAttribs{" UniformBuff" , SPIRVResourceType::UniformBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 80 , 0 },
356+ SPIRVShaderResourceRefAttribs{" UniformBuff" , 1 , SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0 , 80 , 0 },
386357 // ROStorageBuff: StructuredBuffer<BufferData> where BufferData = float4[4] = 64 bytes
387358 // StructuredBuffers have BufferStaticSize=0 (runtime array) and BufferStride is the element size
388- SPIRVShaderResourceRefAttribs{" ROStorageBuff" , SPIRVResourceType::ROStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
359+ SPIRVShaderResourceRefAttribs{" ROStorageBuff" , 1 , SPIRVResourceType::ROStorageBuffer, RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
389360 // RWStorageBuff: same as ROStorageBuff
390- SPIRVShaderResourceRefAttribs{" RWStorageBuff" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
361+ SPIRVShaderResourceRefAttribs{" RWStorageBuff" , 1 , SPIRVResourceType::RWStorageBuffer, RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
391362 // SampledTex: When Texture2D and SamplerState are declared separately, they are compiled as SeparateImage
392- SPIRVShaderResourceRefAttribs{" SampledTex" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
393- SPIRVShaderResourceRefAttribs{" StorageTex" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
394- SPIRVShaderResourceRefAttribs{" Sampler" , SPIRVResourceType::SeparateSampler, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
363+ SPIRVShaderResourceRefAttribs{" SampledTex" , 1 , SPIRVResourceType::SeparateImage, RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
364+ SPIRVShaderResourceRefAttribs{" StorageTex" , 1 , SPIRVResourceType::StorageImage, RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
365+ SPIRVShaderResourceRefAttribs{" Sampler" , 1 , SPIRVResourceType::SeparateSampler, RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
395366 // PushConstants: float2 (2 floats) + float (1 float) + uint (1 uint) = 4 words = 16 bytes
396- SPIRVShaderResourceRefAttribs{" PushConstants" , SPIRVResourceType::PushConstant, 4 , RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
367+ SPIRVShaderResourceRefAttribs{" PushConstants" , 4 , SPIRVResourceType::PushConstant, RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
397368 });
398369}
399370
0 commit comments