@@ -131,12 +131,12 @@ std::vector<uint32_t> GLSLtoSPIRV(const char* FilePath, SHADER_TYPE ShaderType =
131131 }
132132
133133 GLSLangUtils::GLSLtoSPIRVAttribs Attribs;
134- Attribs.ShaderType = ShaderType;
135- Attribs.ShaderSource = ShaderSource.data ();
136- Attribs.SourceCodeLen = static_cast <int >(ShaderSourceSize);
137- Attribs.pShaderSourceStreamFactory = pShaderSourceStreamFactory;
138- Attribs.Version = Version;
139- Attribs.AssignBindings = true ;
134+ Attribs.ShaderType = ShaderType;
135+ Attribs.ShaderSource = ShaderSource.data ();
136+ Attribs.SourceCodeLen = static_cast <int >(ShaderSourceSize);
137+ Attribs.pShaderSourceStreamFactory = pShaderSourceStreamFactory;
138+ Attribs.Version = Version;
139+ Attribs.AssignBindings = true ;
140140
141141 GLSLangUtils::InitializeGlslang ();
142142 auto SPIRV = GLSLangUtils::GLSLtoSPIRV (Attribs);
@@ -147,9 +147,9 @@ std::vector<uint32_t> GLSLtoSPIRV(const char* FilePath, SHADER_TYPE ShaderType =
147147
148148void TestSPIRVResources (const char * FilePath,
149149 const std::vector<SPIRVShaderResourceAttribs>& RefResources,
150- SHADER_TYPE ShaderType = SHADER_TYPE_PIXEL,
150+ SHADER_TYPE ShaderType = SHADER_TYPE_PIXEL,
151151 const char * CombinedSamplerSuffix = nullptr ,
152- bool IsGLSL = false )
152+ bool IsGLSL = false )
153153{
154154 const auto SPIRV = IsGLSL ? GLSLtoSPIRV (FilePath, ShaderType) : HLSLtoSPIRV (FilePath, ShaderType);
155155 ASSERT_FALSE (SPIRV.empty ()) << " Failed to compile HLSL to SPIRV: " << FilePath;
@@ -158,16 +158,15 @@ void TestSPIRVResources(const char* FilePath,
158158 ShaderDesc.Name = " SPIRVResources test" ;
159159 ShaderDesc.ShaderType = ShaderType;
160160
161- std::string EntryPoint;
161+ std::string EntryPoint;
162162 SPIRVShaderResources Resources{
163163 GetRawAllocator (),
164164 SPIRV,
165165 ShaderDesc,
166166 CombinedSamplerSuffix,
167167 false , // LoadShaderStageInputs
168168 false , // LoadUniformBufferReflection
169- EntryPoint
170- };
169+ EntryPoint};
171170
172171 LOG_INFO_MESSAGE (" Testing shader:" , FilePath);
173172 if (CombinedSamplerSuffix != nullptr )
@@ -205,64 +204,64 @@ using SPIRVResourceType = SPIRVShaderResourceAttribs::ResourceType;
205204TEST (SPIRVShaderResources, UniformBuffers)
206205{
207206 TestSPIRVResources (" UniformBuffers.psh" ,
208- {
209- // CB0 is optimized away as it's not used in the shader
210- SPIRVShaderResourceAttribs{" CB1" , SPIRVResourceType::UniformBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 48 , 0 },
211- SPIRVShaderResourceAttribs{" CB2" , SPIRVResourceType::UniformBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
212- });
207+ {
208+ // CB0 is optimized away as it's not used in the shader
209+ SPIRVShaderResourceAttribs{" CB1" , SPIRVResourceType::UniformBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 48 , 0 },
210+ SPIRVShaderResourceAttribs{" CB2" , SPIRVResourceType::UniformBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
211+ });
213212}
214213
215214TEST (SPIRVShaderResources, StorageBuffers)
216215{
217216 TestSPIRVResources (" StorageBuffers.psh" ,
218- {
219- // StructuredBuffers have BufferStaticSize=0 (runtime array) and BufferStride is the element size
220- SPIRVShaderResourceAttribs{" g_ROBuffer" , SPIRVResourceType::ROStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 32 },
221- SPIRVShaderResourceAttribs{" g_RWBuffer" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
222- // ByteAddressBuffers also have BufferStaticSize=0 and BufferStride=4 (uint size)
223- SPIRVShaderResourceAttribs{" g_ROAtomicBuffer" , SPIRVResourceType::ROStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 4 },
224- SPIRVShaderResourceAttribs{" g_RWAtomicBuffer" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 4 },
225- });
217+ {
218+ // StructuredBuffers have BufferStaticSize=0 (runtime array) and BufferStride is the element size
219+ SPIRVShaderResourceAttribs{" g_ROBuffer" , SPIRVResourceType::ROStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 32 },
220+ SPIRVShaderResourceAttribs{" g_RWBuffer" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
221+ // ByteAddressBuffers also have BufferStaticSize=0 and BufferStride=4 (uint size)
222+ SPIRVShaderResourceAttribs{" g_ROAtomicBuffer" , SPIRVResourceType::ROStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 4 },
223+ SPIRVShaderResourceAttribs{" g_RWAtomicBuffer" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 4 },
224+ });
226225}
227226
228227TEST (SPIRVShaderResources, TexelBuffers)
229228{
230229 TestSPIRVResources (" TexelBuffers.psh" ,
231- {
232- SPIRVShaderResourceAttribs{" g_UniformTexelBuffer" , SPIRVResourceType::UniformTexelBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 0 },
233- SPIRVShaderResourceAttribs{" g_StorageTexelBuffer" , SPIRVResourceType::StorageTexelBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 0 },
234- });
230+ {
231+ SPIRVShaderResourceAttribs{" g_UniformTexelBuffer" , SPIRVResourceType::UniformTexelBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 0 },
232+ SPIRVShaderResourceAttribs{" g_StorageTexelBuffer" , SPIRVResourceType::StorageTexelBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 0 },
233+ });
235234}
236235
237236TEST (SPIRVShaderResources, Textures)
238237{
239238 TestSPIRVResources (" Textures.psh" ,
240- {
241- // When textures and samplers are declared separately in HLSL, they are compiled as separate_images
242- // instead of sampled_images. This is the correct behavior for separate sampler/texture declarations.
243- SPIRVShaderResourceAttribs{" g_SampledImage" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
244- SPIRVShaderResourceAttribs{" g_SampledImageMS" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 1 , 0 , 0 },
245- SPIRVShaderResourceAttribs{" g_SampledImage3D" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_3D, 0 , 0 , 0 },
246- SPIRVShaderResourceAttribs{" g_SampledImageCube" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_CUBE, 0 , 0 , 0 },
247- SPIRVShaderResourceAttribs{" g_Sampler" , SPIRVResourceType::SeparateSampler, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
248- SPIRVShaderResourceAttribs{" g_SeparateImage" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
249- // Combined sampler: g_Texture and g_Texture_sampler
250- // Note: Even with CombinedSamplerSuffix, SPIRV may still classify them as separate_images
251- // if they are declared separately. The CombinedSamplerSuffix is mainly used for naming convention.
252- SPIRVShaderResourceAttribs{" g_Texture" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
253- SPIRVShaderResourceAttribs{" g_Texture_sampler" , SPIRVResourceType::SeparateSampler, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
254- });
239+ {
240+ // When textures and samplers are declared separately in HLSL, they are compiled as separate_images
241+ // instead of sampled_images. This is the correct behavior for separate sampler/texture declarations.
242+ SPIRVShaderResourceAttribs{" g_SampledImage" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
243+ SPIRVShaderResourceAttribs{" g_SampledImageMS" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 1 , 0 , 0 },
244+ SPIRVShaderResourceAttribs{" g_SampledImage3D" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_3D, 0 , 0 , 0 },
245+ SPIRVShaderResourceAttribs{" g_SampledImageCube" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_CUBE, 0 , 0 , 0 },
246+ SPIRVShaderResourceAttribs{" g_Sampler" , SPIRVResourceType::SeparateSampler, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
247+ SPIRVShaderResourceAttribs{" g_SeparateImage" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
248+ // Combined sampler: g_Texture and g_Texture_sampler
249+ // Note: Even with CombinedSamplerSuffix, SPIRV may still classify them as separate_images
250+ // if they are declared separately. The CombinedSamplerSuffix is mainly used for naming convention.
251+ SPIRVShaderResourceAttribs{" g_Texture" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
252+ SPIRVShaderResourceAttribs{" g_Texture_sampler" , SPIRVResourceType::SeparateSampler, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
253+ });
255254}
256255
257256TEST (SPIRVShaderResources, StorageImages)
258257{
259258 TestSPIRVResources (" StorageImages.psh" ,
260- {
261- // Note: HLSL does not support RWTextureCube, so we only test 2D, 2DArray, and 3D storage images
262- SPIRVShaderResourceAttribs{" g_RWImage2D" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
263- SPIRVShaderResourceAttribs{" g_RWImage2DArray" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_2D_ARRAY, 0 , 0 , 0 },
264- SPIRVShaderResourceAttribs{" g_RWImage3D" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_3D, 0 , 0 , 0 },
265- });
259+ {
260+ // Note: HLSL does not support RWTextureCube, so we only test 2D, 2DArray, and 3D storage images
261+ SPIRVShaderResourceAttribs{" g_RWImage2D" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
262+ SPIRVShaderResourceAttribs{" g_RWImage2DArray" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_2D_ARRAY, 0 , 0 , 0 },
263+ SPIRVShaderResourceAttribs{" g_RWImage3D" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_3D, 0 , 0 , 0 },
264+ });
266265}
267266
268267TEST (SPIRVShaderResources, AtomicCounters)
@@ -272,20 +271,20 @@ TEST(SPIRVShaderResources, AtomicCounters)
272271 // This will be reflected as RWStorageBuffer, not AtomicCounter.
273272 // The resource name is the buffer block name (AtomicCounterBuffer), not the instance name (g_AtomicCounter).
274273 TestSPIRVResources (" AtomicCounters.glsl" ,
275- {
276- SPIRVShaderResourceAttribs{" AtomicCounterBuffer" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 4 , 0 },
277- },
278- SHADER_TYPE_PIXEL,
279- nullptr ,
280- true ); // IsGLSL = true
274+ {
275+ SPIRVShaderResourceAttribs{" AtomicCounterBuffer" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 4 , 0 },
276+ },
277+ SHADER_TYPE_PIXEL,
278+ nullptr ,
279+ true ); // IsGLSL = true
281280}
282281
283282TEST (SPIRVShaderResources, InputAttachments)
284283{
285284 TestSPIRVResources (" InputAttachments.psh" ,
286- {
287- SPIRVShaderResourceAttribs{" g_InputAttachment" , SPIRVResourceType::InputAttachment, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
288- });
285+ {
286+ SPIRVShaderResourceAttribs{" g_InputAttachment" , SPIRVResourceType::InputAttachment, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
287+ });
289288}
290289
291290TEST (SPIRVShaderResources, AccelerationStructures)
@@ -294,12 +293,12 @@ TEST(SPIRVShaderResources, AccelerationStructures)
294293 // Acceleration structures are used in raytracing shaders, so we use SHADER_TYPE_RAY_GEN
295294 // The ray gen shader uses traceRayEXT with g_AccelStruct to ensure it's not optimized away
296295 TestSPIRVResources (" AccelerationStructures.glsl" ,
297- {
298- SPIRVShaderResourceAttribs{" g_AccelStruct" , SPIRVResourceType::AccelerationStructure, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
299- },
300- SHADER_TYPE_RAY_GEN,
301- nullptr ,
302- true ); // IsGLSL = true
296+ {
297+ SPIRVShaderResourceAttribs{" g_AccelStruct" , SPIRVResourceType::AccelerationStructure, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
298+ },
299+ SHADER_TYPE_RAY_GEN,
300+ nullptr ,
301+ true ); // IsGLSL = true
303302}
304303
305304TEST (SPIRVShaderResources, PushConstants)
@@ -308,29 +307,29 @@ TEST(SPIRVShaderResources, PushConstants)
308307 // PushConstants struct: float4x4 (16 floats) + float4 (4 floats) + float2 (2 floats) + float (1 float) + uint (1 uint)
309308 // Total: 16 + 4 + 2 + 1 + 1 = 24 floats/uints = 24 * 4 bytes = 96 bytes = 24 words
310309 TestSPIRVResources (" PushConstants.psh" ,
311- {
312- SPIRVShaderResourceAttribs{" PushConstants" , SPIRVResourceType::PushConstant, 24 , RESOURCE_DIM_BUFFER, 0 , 96 , 0 },
313- });
310+ {
311+ SPIRVShaderResourceAttribs{" PushConstants" , SPIRVResourceType::PushConstant, 24 , RESOURCE_DIM_BUFFER, 0 , 96 , 0 },
312+ });
314313}
315314
316315TEST (SPIRVShaderResources, MixedResources)
317316{
318317 TestSPIRVResources (" MixedResources.psh" ,
319- {
320- // UniformBuff: float4x4 (64 bytes) + float4 (16 bytes) = 80 bytes
321- SPIRVShaderResourceAttribs{" UniformBuff" , SPIRVResourceType::UniformBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 80 , 0 },
322- // ROStorageBuff: StructuredBuffer<BufferData> where BufferData = float4[4] = 64 bytes
323- // StructuredBuffers have BufferStaticSize=0 (runtime array) and BufferStride is the element size
324- SPIRVShaderResourceAttribs{" ROStorageBuff" , SPIRVResourceType::ROStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
325- // RWStorageBuff: same as ROStorageBuff
326- SPIRVShaderResourceAttribs{" RWStorageBuff" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
327- // SampledTex: When Texture2D and SamplerState are declared separately, they are compiled as SeparateImage
328- SPIRVShaderResourceAttribs{" SampledTex" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
329- SPIRVShaderResourceAttribs{" StorageTex" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
330- SPIRVShaderResourceAttribs{" Sampler" , SPIRVResourceType::SeparateSampler, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
331- // PushConstants: float2 (2 floats) + float (1 float) + uint (1 uint) = 4 words = 16 bytes
332- SPIRVShaderResourceAttribs{" PushConstants" , SPIRVResourceType::PushConstant, 4 , RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
333- });
318+ {
319+ // UniformBuff: float4x4 (64 bytes) + float4 (16 bytes) = 80 bytes
320+ SPIRVShaderResourceAttribs{" UniformBuff" , SPIRVResourceType::UniformBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 80 , 0 },
321+ // ROStorageBuff: StructuredBuffer<BufferData> where BufferData = float4[4] = 64 bytes
322+ // StructuredBuffers have BufferStaticSize=0 (runtime array) and BufferStride is the element size
323+ SPIRVShaderResourceAttribs{" ROStorageBuff" , SPIRVResourceType::ROStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
324+ // RWStorageBuff: same as ROStorageBuff
325+ SPIRVShaderResourceAttribs{" RWStorageBuff" , SPIRVResourceType::RWStorageBuffer, 1 , RESOURCE_DIM_BUFFER, 0 , 0 , 64 },
326+ // SampledTex: When Texture2D and SamplerState are declared separately, they are compiled as SeparateImage
327+ SPIRVShaderResourceAttribs{" SampledTex" , SPIRVResourceType::SeparateImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
328+ SPIRVShaderResourceAttribs{" StorageTex" , SPIRVResourceType::StorageImage, 1 , RESOURCE_DIM_TEX_2D, 0 , 0 , 0 },
329+ SPIRVShaderResourceAttribs{" Sampler" , SPIRVResourceType::SeparateSampler, 1 , RESOURCE_DIM_UNDEFINED, 0 , 0 , 0 },
330+ // PushConstants: float2 (2 floats) + float (1 float) + uint (1 uint) = 4 words = 16 bytes
331+ SPIRVShaderResourceAttribs{" PushConstants" , SPIRVResourceType::PushConstant, 4 , RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
332+ });
334333}
335334
336335} // namespace
0 commit comments