From 77061059ac1608ac8bf53591f18d2fa393b840cd Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 2 Mar 2018 13:22:20 -0800 Subject: [PATCH] Compile shaders for 1.0-compatible tests as SPIRV 1.0, not max supported Test: rebuild prebuilts, inspect. CtsDeqpTestCases against Pixel & Pixel2 Bug: b/74431715 Change-Id: I5a440f97f79be0e6d37d89018ae8b611e9d4e7c1 --- external/vulkancts/framework/vulkan/vkPrograms.cpp | 21 ++++++++---- external/vulkancts/framework/vulkan/vkPrograms.hpp | 15 ++++---- .../spirv_assembly/vktSpvAsmSpirvVersionTests.cpp | 2 +- .../vulkancts/modules/vulkan/vktBuildPrograms.cpp | 40 ++++++++++------------ .../vulkancts/modules/vulkan/vktTestPackage.cpp | 19 +++++----- 5 files changed, 52 insertions(+), 45 deletions(-) diff --git a/external/vulkancts/framework/vulkan/vkPrograms.cpp b/external/vulkancts/framework/vulkan/vkPrograms.cpp index 4895f56..1ab9c58 100644 --- a/external/vulkancts/framework/vulkan/vkPrograms.cpp +++ b/external/vulkancts/framework/vulkan/vkPrograms.cpp @@ -183,14 +183,15 @@ ProgramBinary* assembleProgram (const SpirVAsmSource& program, SpirVProgramInfo* return createProgramBinaryFromSpirV(binary); } -void disassembleProgram (const ProgramBinary& program, std::ostream* dst, SpirvVersion spirvVersion) +void disassembleProgram (const ProgramBinary& program, std::ostream* dst) { if (program.getFormat() == PROGRAM_FORMAT_SPIRV) { TCU_CHECK_INTERNAL(isSaneSpirVBinary(program)); if (isNativeSpirVBinaryEndianness()) - disassembleSpirV(program.getSize()/sizeof(deUint32), (const deUint32*)program.getBinary(), dst, spirvVersion); + disassembleSpirV(program.getSize()/sizeof(deUint32), (const deUint32*)program.getBinary(), dst, + extractSpirvVersion(program)); else TCU_THROW(InternalError, "SPIR-V endianness translation not supported"); } @@ -198,7 +199,7 @@ void disassembleProgram (const ProgramBinary& program, std::ostream* dst, SpirvV TCU_THROW(NotSupportedError, "Unsupported program format"); } -bool validateProgram (const ProgramBinary& program, std::ostream* dst, SpirvVersion spirvVersion) +bool validateProgram (const ProgramBinary& program, std::ostream* dst) { if (program.getFormat() == PROGRAM_FORMAT_SPIRV) { @@ -209,7 +210,8 @@ bool validateProgram (const ProgramBinary& program, std::ostream* dst, SpirvVers } if (isNativeSpirVBinaryEndianness()) - return validateSpirV(program.getSize()/sizeof(deUint32), (const deUint32*)program.getBinary(), dst, spirvVersion); + return validateSpirV(program.getSize()/sizeof(deUint32), (const deUint32*)program.getBinary(), dst, + extractSpirvVersion(program)); else TCU_THROW(InternalError, "SPIR-V endianness translation not supported"); } @@ -267,7 +269,14 @@ VkShaderStageFlagBits getVkShaderStage (glu::ShaderType shaderType) return de::getSizedArrayElement(s_shaderStages, shaderType); } -vk::SpirvVersion getSpirvVersionForAsm (const deUint32 vulkanVersion) +// Baseline version, to be used for shaders which don't specify a version +vk::SpirvVersion getBaselineSpirvVersion (const deUint32 /* vulkanVersion */) +{ + return vk::SPIRV_VERSION_1_0; +} + +// Max supported versions for each vulkan version +vk::SpirvVersion getMaxSpirvVersionForAsm (const deUint32 vulkanVersion) { vk::SpirvVersion result = vk::SPIRV_VERSION_LAST; @@ -282,7 +291,7 @@ vk::SpirvVersion getSpirvVersionForAsm (const deUint32 vulkanVersion) return result; } -vk::SpirvVersion getSpirvVersionForGlsl (const deUint32 vulkanVersion) +vk::SpirvVersion getMaxSpirvVersionForGlsl (const deUint32 vulkanVersion) { vk::SpirvVersion result = vk::SPIRV_VERSION_LAST; diff --git a/external/vulkancts/framework/vulkan/vkPrograms.hpp b/external/vulkancts/framework/vulkan/vkPrograms.hpp index f89fd34..e0bed2b 100644 --- a/external/vulkancts/framework/vulkan/vkPrograms.hpp +++ b/external/vulkancts/framework/vulkan/vkPrograms.hpp @@ -210,19 +210,20 @@ typedef ProgramCollection BinaryCollection; ProgramBinary* buildProgram (const GlslSource& program, glu::ShaderProgramInfo* buildInfo); ProgramBinary* buildProgram (const HlslSource& program, glu::ShaderProgramInfo* buildInfo); ProgramBinary* assembleProgram (const vk::SpirVAsmSource& program, SpirVProgramInfo* buildInfo); -void disassembleProgram (const ProgramBinary& program, std::ostream* dst, SpirvVersion spirvVersion); -bool validateProgram (const ProgramBinary& program, std::ostream* dst, SpirvVersion spirvVersion); +void disassembleProgram (const ProgramBinary& program, std::ostream* dst); +bool validateProgram (const ProgramBinary& program, std::ostream* dst); Move createShaderModule (const DeviceInterface& deviceInterface, VkDevice device, const ProgramBinary& binary, VkShaderModuleCreateFlags flags); glu::ShaderType getGluShaderType (VkShaderStageFlagBits shaderStage); VkShaderStageFlagBits getVkShaderStage (glu::ShaderType shaderType); -vk::SpirvVersion getSpirvVersionForAsm (const deUint32 vulkanVersion); -vk::SpirvVersion getSpirvVersionForGlsl (const deUint32 vulkanVersion); -SpirvVersion extractSpirvVersion (const ProgramBinary& binary); -std::string getSpirvVersionName (const SpirvVersion spirvVersion); -SpirvVersion& operator++ (SpirvVersion& spirvVersion); +vk::SpirvVersion getMaxSpirvVersionForAsm (const deUint32 vulkanVersion); +vk::SpirvVersion getMaxSpirvVersionForGlsl (const deUint32 vulkanVersion); +vk::SpirvVersion getBaselineSpirvVersion (const deUint32 vulkanVersion); +SpirvVersion extractSpirvVersion (const ProgramBinary& binary); +std::string getSpirvVersionName (const SpirvVersion spirvVersion); +SpirvVersion& operator++ (SpirvVersion& spirvVersion); } // vk diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp index 98ded32..affa27e 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmSpirvVersionTests.cpp @@ -260,7 +260,7 @@ SpvAsmSpirvVersionsCase::SpvAsmSpirvVersionsCase (tcu::TestContext& testCtx, con void validateVulkanVersion (const deUint32 usedVulkanVersion, const SpirvVersion testedSpirvVersion) { - const SpirvVersion usedSpirvVersionForAsm = getSpirvVersionForAsm(usedVulkanVersion); + const SpirvVersion usedSpirvVersionForAsm = getMaxSpirvVersionForAsm(usedVulkanVersion); if (testedSpirvVersion > usedSpirvVersionForAsm) TCU_THROW(NotSupportedError, "Specified SPIR-V version is not supported by the device/instance"); diff --git a/external/vulkancts/modules/vulkan/vktBuildPrograms.cpp b/external/vulkancts/modules/vulkan/vktBuildPrograms.cpp index 099a9ff..7caa836 100644 --- a/external/vulkancts/modules/vulkan/vktBuildPrograms.cpp +++ b/external/vulkancts/modules/vulkan/vktBuildPrograms.cpp @@ -337,10 +337,8 @@ public: DE_ASSERT(m_program->binary->getFormat() == vk::PROGRAM_FORMAT_SPIRV); std::ostringstream validationLog; - const vk::ProgramBinary& programBinary = *(m_program->binary); - const vk::SpirvVersion spirvVersion = vk::extractSpirvVersion(programBinary); - if (vk::validateProgram(*m_program->binary, &validationLog, spirvVersion)) + if (vk::validateProgram(*m_program->binary, &validationLog)) m_program->validationStatus = Program::STATUS_PASSED; else m_program->validationStatus = Program::STATUS_FAILED; @@ -377,8 +375,8 @@ BuildStats buildPrograms (tcu::TestContext& testCtx, const std::string& dstPath, const bool validateBinaries, const deUint32 usedVulkanVersion, - const vk::SpirvVersion spirvVersionForGlsl, - const vk::SpirvVersion spirvVersionForAsm) + const vk::SpirvVersion baselineSpirvVersion, + const vk::SpirvVersion maxSpirvVersion) { const deUint32 numThreads = deGetNumAvailableLogicalCores(); @@ -409,9 +407,9 @@ BuildStats buildPrograms (tcu::TestContext& testCtx, { const TestCase* const testCase = dynamic_cast(iterator.getNode()); const string casePath = iterator.getNodePath(); - vk::ShaderBuildOptions defaultGlslBuildOptions (spirvVersionForGlsl, 0u); - vk::ShaderBuildOptions defaultHlslBuildOptions (spirvVersionForGlsl, 0u); - vk::SpirVAsmBuildOptions defaultSpirvAsmBuildOptions (spirvVersionForAsm); + vk::ShaderBuildOptions defaultGlslBuildOptions (baselineSpirvVersion, 0u); + vk::ShaderBuildOptions defaultHlslBuildOptions (baselineSpirvVersion, 0u); + vk::SpirVAsmBuildOptions defaultSpirvAsmBuildOptions (baselineSpirvVersion); vk::SourceCollections sourcePrograms (usedVulkanVersion, defaultGlslBuildOptions, defaultHlslBuildOptions, defaultSpirvAsmBuildOptions); try @@ -430,7 +428,7 @@ BuildStats buildPrograms (tcu::TestContext& testCtx, ++progIter) { // Source program requires higher SPIR-V version than available: skip it to avoid fail - if (progIter.getProgram().buildOptions.targetVersion > spirvVersionForGlsl) + if (progIter.getProgram().buildOptions.targetVersion > maxSpirvVersion) continue; programs.pushBack(Program(vk::ProgramIdentifier(casePath, progIter.getName()), progIter.getProgram().buildOptions.targetVersion)); @@ -443,7 +441,7 @@ BuildStats buildPrograms (tcu::TestContext& testCtx, ++progIter) { // Source program requires higher SPIR-V version than available: skip it to avoid fail - if (progIter.getProgram().buildOptions.targetVersion > spirvVersionForGlsl) + if (progIter.getProgram().buildOptions.targetVersion > maxSpirvVersion) continue; programs.pushBack(Program(vk::ProgramIdentifier(casePath, progIter.getName()), progIter.getProgram().buildOptions.targetVersion)); @@ -456,7 +454,7 @@ BuildStats buildPrograms (tcu::TestContext& testCtx, ++progIter) { // Source program requires higher SPIR-V version than available: skip it to avoid fail - if (progIter.getProgram().buildOptions.targetVersion > spirvVersionForAsm) + if (progIter.getProgram().buildOptions.targetVersion > maxSpirvVersion) continue; programs.pushBack(Program(vk::ProgramIdentifier(casePath, progIter.getName()), progIter.getProgram().buildOptions.targetVersion)); @@ -591,23 +589,23 @@ int main (int argc, const char* argv[]) try { - tcu::DirArchive archive ("."); - tcu::TestLog log (deqpCmdLine.getLogFileName(), deqpCmdLine.getLogFlags()); + tcu::DirArchive archive ("."); + tcu::TestLog log (deqpCmdLine.getLogFileName(), deqpCmdLine.getLogFlags()); tcu::Platform platform; - tcu::TestContext testCtx (platform, archive, log, deqpCmdLine, DE_NULL); - vk::SpirvVersion spirvVersionForGlsl = vk::getSpirvVersionForGlsl(cmdLine.getOption()); - vk::SpirvVersion spirvVersionForAsm = vk::getSpirvVersionForAsm(cmdLine.getOption()); + tcu::TestContext testCtx (platform, archive, log, deqpCmdLine, DE_NULL); + vk::SpirvVersion baselineSpirvVersion = vk::getBaselineSpirvVersion(cmdLine.getOption()); + vk::SpirvVersion maxSpirvVersion = vk::getMaxSpirvVersionForGlsl(cmdLine.getOption()); - tcu::print("SPIR-V versions: for GLSL sources: %s, for SPIR-V asm sources: %s\n", - getSpirvVersionName(spirvVersionForGlsl).c_str(), - getSpirvVersionName(spirvVersionForAsm).c_str()); + tcu::print("SPIR-V versions: baseline: %s, max supported: %s\n", + getSpirvVersionName(baselineSpirvVersion).c_str(), + getSpirvVersionName(maxSpirvVersion).c_str()); const vkt::BuildStats stats = vkt::buildPrograms(testCtx, cmdLine.getOption(), cmdLine.getOption(), cmdLine.getOption(), - spirvVersionForGlsl, - spirvVersionForAsm); + baselineSpirvVersion, + maxSpirvVersion); tcu::print("DONE: %d passed, %d failed, %d not supported\n", stats.numSucceeded, stats.numFailed, stats.notSupported); diff --git a/external/vulkancts/modules/vulkan/vktTestPackage.cpp b/external/vulkancts/modules/vulkan/vktTestPackage.cpp index d0a0df6..8d5a612 100644 --- a/external/vulkancts/modules/vulkan/vktTestPackage.cpp +++ b/external/vulkancts/modules/vulkan/vktTestPackage.cpp @@ -226,11 +226,10 @@ void TestCaseExecutor::init (tcu::TestCase* testCase, const std::string& casePat const TestCase* vktCase = dynamic_cast(testCase); tcu::TestLog& log = m_context.getTestContext().getLog(); const deUint32 usedVulkanVersion = m_context.getUsedApiVersion(); - const vk::SpirvVersion spirvVersionForGlsl = vk::getSpirvVersionForGlsl(usedVulkanVersion); - const vk::SpirvVersion spirvVersionForAsm = vk::getSpirvVersionForAsm(usedVulkanVersion); - vk::ShaderBuildOptions defaultGlslBuildOptions (spirvVersionForGlsl, 0u); - vk::ShaderBuildOptions defaultHlslBuildOptions (spirvVersionForGlsl, 0u); - vk::SpirVAsmBuildOptions defaultSpirvAsmBuildOptions (spirvVersionForAsm); + const vk::SpirvVersion baselineSpirvVersion = vk::getBaselineSpirvVersion(usedVulkanVersion); + vk::ShaderBuildOptions defaultGlslBuildOptions (baselineSpirvVersion, 0u); + vk::ShaderBuildOptions defaultHlslBuildOptions (baselineSpirvVersion, 0u); + vk::SpirVAsmBuildOptions defaultSpirvAsmBuildOptions (baselineSpirvVersion); vk::SourceCollections sourceProgs (usedVulkanVersion, defaultGlslBuildOptions, defaultHlslBuildOptions, defaultSpirvAsmBuildOptions); DE_UNREF(casePath); // \todo [2015-03-13 pyry] Use this to identify ProgramCollection storage path @@ -243,7 +242,7 @@ void TestCaseExecutor::init (tcu::TestCase* testCase, const std::string& casePat for (vk::GlslSourceCollection::Iterator progIter = sourceProgs.glslSources.begin(); progIter != sourceProgs.glslSources.end(); ++progIter) { - if (progIter.getProgram().buildOptions.targetVersion > vk::getSpirvVersionForGlsl(m_context.getUsedApiVersion())) + if (progIter.getProgram().buildOptions.targetVersion > vk::getMaxSpirvVersionForGlsl(m_context.getUsedApiVersion())) TCU_THROW(NotSupportedError, "Shader requires SPIR-V higher than available"); const vk::ProgramBinary* const binProg = buildProgram(casePath, progIter, m_prebuiltBinRegistry, log, &m_progCollection); @@ -252,7 +251,7 @@ void TestCaseExecutor::init (tcu::TestCase* testCase, const std::string& casePat { std::ostringstream disasm; - vk::disassembleProgram(*binProg, &disasm, spirvVersionForGlsl); + vk::disassembleProgram(*binProg, &disasm); log << vk::SpirVAsmSource(disasm.str()); } @@ -264,7 +263,7 @@ void TestCaseExecutor::init (tcu::TestCase* testCase, const std::string& casePat for (vk::HlslSourceCollection::Iterator progIter = sourceProgs.hlslSources.begin(); progIter != sourceProgs.hlslSources.end(); ++progIter) { - if (progIter.getProgram().buildOptions.targetVersion > vk::getSpirvVersionForGlsl(m_context.getUsedApiVersion())) + if (progIter.getProgram().buildOptions.targetVersion > vk::getMaxSpirvVersionForGlsl(m_context.getUsedApiVersion())) TCU_THROW(NotSupportedError, "Shader requires SPIR-V higher than available"); const vk::ProgramBinary* const binProg = buildProgram(casePath, progIter, m_prebuiltBinRegistry, log, &m_progCollection); @@ -273,7 +272,7 @@ void TestCaseExecutor::init (tcu::TestCase* testCase, const std::string& casePat { std::ostringstream disasm; - vk::disassembleProgram(*binProg, &disasm, spirvVersionForGlsl); + vk::disassembleProgram(*binProg, &disasm); log << vk::SpirVAsmSource(disasm.str()); } @@ -285,7 +284,7 @@ void TestCaseExecutor::init (tcu::TestCase* testCase, const std::string& casePat for (vk::SpirVAsmCollection::Iterator asmIterator = sourceProgs.spirvAsmSources.begin(); asmIterator != sourceProgs.spirvAsmSources.end(); ++asmIterator) { - if (asmIterator.getProgram().buildOptions.targetVersion > vk::getSpirvVersionForAsm(m_context.getUsedApiVersion())) + if (asmIterator.getProgram().buildOptions.targetVersion > vk::getMaxSpirvVersionForAsm(m_context.getUsedApiVersion())) TCU_THROW(NotSupportedError, "Shader requires SPIR-V higher than available"); buildProgram(casePath, asmIterator, m_prebuiltBinRegistry, log, &m_progCollection); -- 2.7.4