|
26 | 26 |
|
27 | 27 | #include "SPIRVShaderResources.hpp" |
28 | 28 | #include "GLSLangUtils.hpp" |
| 29 | +#include "SPIRVTools.hpp" |
29 | 30 | #include "DXCompiler.hpp" |
30 | 31 | #include "DefaultShaderSourceStreamFactory.h" |
31 | 32 | #include "RefCntAutoPtr.hpp" |
@@ -287,6 +288,52 @@ TEST_F(SPIRVShaderResourcesTest, UniformBuffers_DXC) |
287 | 288 | }); |
288 | 289 | } |
289 | 290 |
|
| 291 | +TEST_F(SPIRVShaderResourcesTest, ConvertUBOToPushConstant) |
| 292 | +{ |
| 293 | + const auto& SPIRV = LoadSPIRVFromHLSL("UniformBuffers.psh", SHADER_TYPE_PIXEL, false); |
| 294 | + ASSERT_FALSE(SPIRV.empty()) << "Failed to compile HLSL to SPIRV with glslang"; |
| 295 | + |
| 296 | + // Convert CB1 from UniformBuffer to PushConstant |
| 297 | + const auto& ConvertedSPIRV = ConvertUBOToPushConstants(SPIRV, "CB1"); |
| 298 | + ASSERT_FALSE(ConvertedSPIRV.empty()) << "Failed to convert UBO to push constant"; |
| 299 | + |
| 300 | + TestSPIRVResourcesInternal("UniformBuffers.psh", |
| 301 | + { |
| 302 | + // CB1 should now be a PushConstant (48 bytes = 12 floats) |
| 303 | + SPIRVShaderResourceRefAttribs{"CB1", 1, SPIRVResourceType::PushConstant, RESOURCE_DIM_BUFFER, 0, 48, 0}, |
| 304 | + // CB2 remains as UniformBuffer |
| 305 | + SPIRVShaderResourceRefAttribs{"CB2", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 16, 0}, |
| 306 | + }, |
| 307 | + ConvertedSPIRV, |
| 308 | + SHADER_TYPE_PIXEL); |
| 309 | +} |
| 310 | + |
| 311 | +TEST_F(SPIRVShaderResourcesTest, ConvertUBOToPushConstant_DXC) |
| 312 | +{ |
| 313 | + if (!DXCompiler || !DXCompiler->IsLoaded()) |
| 314 | + { |
| 315 | + LOG_INFO_MESSAGE("HLSL->SPIRV with DXC skipped because DXCompiler is not available\n"); |
| 316 | + return; |
| 317 | + } |
| 318 | + |
| 319 | + const auto& SPIRV = LoadSPIRVFromHLSL("UniformBuffers.psh", SHADER_TYPE_PIXEL, true); |
| 320 | + ASSERT_FALSE(SPIRV.empty()) << "Failed to compile HLSL to SPIRV with DXC"; |
| 321 | + |
| 322 | + // Convert CB1 from UniformBuffer to PushConstant |
| 323 | + const auto& ConvertedSPIRV = ConvertUBOToPushConstants(SPIRV, "CB1"); |
| 324 | + ASSERT_FALSE(ConvertedSPIRV.empty()) << "Failed to convert UBO to push constant"; |
| 325 | + |
| 326 | + TestSPIRVResourcesInternal("UniformBuffers.psh", |
| 327 | + { |
| 328 | + // CB1 should now be a PushConstant (48 bytes = 12 floats) |
| 329 | + SPIRVShaderResourceRefAttribs{"CB1", 1, SPIRVResourceType::PushConstant, RESOURCE_DIM_BUFFER, 0, 48, 0}, |
| 330 | + // CB2 remains as UniformBuffer |
| 331 | + SPIRVShaderResourceRefAttribs{"CB2", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 16, 0}, |
| 332 | + }, |
| 333 | + ConvertedSPIRV, |
| 334 | + SHADER_TYPE_PIXEL); |
| 335 | +} |
| 336 | + |
290 | 337 | TEST_F(SPIRVShaderResourcesTest, StorageBuffers) |
291 | 338 | { |
292 | 339 | TestSPIRVResources("StorageBuffers.psh", |
|
0 commit comments