Update checking of VulkanFeatures structs
authorGraeme Leese <gleese@broadcom.com>
Fri, 16 Jul 2021 17:07:03 +0000 (18:07 +0100)
committerMatthew Netsch <quic_mnetsch@quicinc.com>
Mon, 20 Sep 2021 14:38:41 +0000 (14:38 +0000)
The spirv_assembly tests defined various helpers for checking whether
certain features are supported but they worked inconsistently and were
repeated in various places. This change pulls the checking into a single
function which can be used to check instead of having to call a while
set of functions to achieve the same end.

The higher-level checking functions have always masked out a subset of
the features that are requested, and this is not changed, so requests
for certain things that look correct will silently not check all the
features.

The extension feature enums that were defined just for the checking
system are replaced with the standard structs. They're easier to use
because they don't need to be defined afresh when extensions are added
here, and because the names are automatically consistent with the names
that are known from the API. In at least 1 case the existing names were
pretty hard to decode correctly.

Components: Vulkan
Affects: dEQP-VK.spirv_assembly.*

Change-Id: Icd2fc3f7d37e0ec3cfed9a80f3152617c8f599a3

18 files changed:
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsm16bitStorageTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsm64bitCompareTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsm8bitStorageTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmEmptyStructTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsExtensionlessTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmFloatControlsTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmIndexingTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmIntegerDotProductTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmPointerParameterTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTypeTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.hpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariableInitTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmWorkgroupMemoryTests.cpp

index 8010ac8..2d9515c 100644 (file)
@@ -152,9 +152,9 @@ VulkanFeatures      get16BitStorageFeatures (const char* cap)
 {
        VulkanFeatures features;
        if (string(cap) == "uniform_buffer_block")
-               features.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               features.ext16BitStorage.storageBuffer16BitAccess = true;
        else if (string(cap) == "uniform")
-               features.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM;
+               features.ext16BitStorage.uniformAndStorageBuffer16BitAccess = true;
        else
                DE_ASSERT(false && "not supported");
 
@@ -1860,7 +1860,7 @@ void addCompute16bitStoragePushConstant16To32Group (tcu::TestCaseGroup* group)
 
                        spec.outputs.push_back(Resource(BufferSp(new Float32Buffer(cTypes[tyIdx].useConstantIndex ? float32DataConstIdx : float32Data))));
                        spec.extensions.push_back("VK_KHR_16bit_storage");
-                       spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
+                       spec.requestedVulkanFeatures.ext16BitStorage.storagePushConstant16 = true;
 
                        group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
                }
@@ -1978,7 +1978,7 @@ void addCompute16bitStoragePushConstant16To32Group (tcu::TestCaseGroup* group)
                        else
                                spec.outputs.push_back(Resource(BufferSp(new Int32Buffer(uOutputs))));
                        spec.extensions.push_back("VK_KHR_16bit_storage");
-                       spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
+                       spec.requestedVulkanFeatures.ext16BitStorage.storagePushConstant16 = true;
 
                        group->addChild(new SpvAsmComputeShaderCase(testCtx, testName, testName, spec));
                }
@@ -3719,7 +3719,7 @@ void addGraphics16BitStorageInputOutputFloat32To16Group (tcu::TestCaseGroup* tes
        };
 
        VulkanFeatures  requiredFeatures;
-       requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16 = true;
 
        for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
                for (deUint32 rndModeIdx = 0; rndModeIdx < DE_LENGTH_OF_ARRAY(rndModes); ++rndModeIdx)
@@ -3840,7 +3840,7 @@ void addGraphics16BitStorageInputOutputFloat16To32Group (tcu::TestCaseGroup* tes
        };
 
        VulkanFeatures  requiredFeatures;
-       requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16 = true;
 
        for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
        {
@@ -3882,7 +3882,7 @@ void addGraphics16BitStorageInputOutputFloat16To16Group (tcu::TestCaseGroup* tes
        vector<deFloat16>       float16Data                     (getFloat16s(rnd, numDataPoints));
        VulkanFeatures          requiredFeatures;
 
-       requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16 = true;
        extensions.push_back("VK_KHR_16bit_storage");
 
        fragments["capability"]                                 = "OpCapability StorageInputOutput16\n";
@@ -4196,7 +4196,7 @@ void addGraphics16BitStorageInputOutputFloat16To16x2Group (tcu::TestCaseGroup* t
        getDefaultColors(defaultColors);
 
        extensions.push_back("VK_KHR_16bit_storage");
-       requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16 = true;
 
        const struct
        {
@@ -4269,7 +4269,7 @@ void addGraphics16BitStorageInputOutputInt16To16x2Group (tcu::TestCaseGroup* tes
        getDefaultColors(defaultColors);
 
        extensions.push_back("VK_KHR_16bit_storage");
-       requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16 = true;
        requiredFeatures.coreFeatures.shaderInt16 = DE_TRUE;
 
        const struct
@@ -4402,7 +4402,7 @@ void addGraphics16BitStorageInputOutputInt32To16Group (tcu::TestCaseGroup* testG
 
        VulkanFeatures  requiredFeatures;
        requiredFeatures.coreFeatures.shaderInt16 = DE_TRUE;
-       requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16 = true;
 
        for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
        {
@@ -4539,7 +4539,7 @@ void addGraphics16BitStorageInputOutputInt16To32Group (tcu::TestCaseGroup* testG
 
        VulkanFeatures  requiredFeatures;
        requiredFeatures.coreFeatures.shaderInt16 = DE_TRUE;
-       requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16 = true;
 
        for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
        {
@@ -4602,7 +4602,7 @@ void addGraphics16BitStorageInputOutputInt16To16Group (tcu::TestCaseGroup* testG
        vector<deInt16>                 inputs                          = getInt16s(rnd, numDataPoints);
        VulkanFeatures                  requiredFeatures;
 
-       requiredFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16 = true;
        extensions.push_back("VK_KHR_16bit_storage");
 
        fragments["capability"]                                         = "OpCapability StorageInputOutput16\n";
@@ -4729,7 +4729,7 @@ void addGraphics16BitStoragePushConstantFloat16To32Group (tcu::TestCaseGroup* te
 
        requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics    = true;
        requiredFeatures.coreFeatures.fragmentStoresAndAtomics                  = true;
-       requiredFeatures.ext16BitStorage                                                                = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
+       requiredFeatures.ext16BitStorage.storagePushConstant16                  = true;
 
        fragments["capability"]                         = "OpCapability StoragePushConstant16\n";
        fragments["extension"]                          = "OpExtension \"SPV_KHR_16bit_storage\"";
@@ -5045,7 +5045,7 @@ void addGraphics16BitStoragePushConstantInt16To32Group (tcu::TestCaseGroup* test
 
        requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics    = true;
        requiredFeatures.coreFeatures.fragmentStoresAndAtomics                  = true;
-       requiredFeatures.ext16BitStorage                                                                = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
+       requiredFeatures.ext16BitStorage.storagePushConstant16                  = true;
 
        fragments["capability"]                         = "OpCapability StoragePushConstant16\n";
        fragments["extension"]                          = "OpExtension \"SPV_KHR_16bit_storage\"";
@@ -6458,7 +6458,7 @@ void addGraphics16BitStorageUniformStructFloat32To16Group (tcu::TestCaseGroup* t
 
                features.coreFeatures.vertexPipelineStoresAndAtomics    = true;
                features.coreFeatures.fragmentStoresAndAtomics                  = true;
-               features.ext16BitStorage                                                                = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               features.ext16BitStorage.storageBuffer16BitAccess               = true;
 
                createTestsForAllStages(testName, defaultColors, defaultColors, fragments, resources, extensions, testGroup, features);
        }
@@ -6776,7 +6776,7 @@ void addGraphics16BitStorageInputOutputFloat16To64Group (tcu::TestCaseGroup* tes
        VulkanFeatures  requiredFeatures;
 
        requiredFeatures.coreFeatures.shaderFloat64     = DE_TRUE;
-       requiredFeatures.ext16BitStorage                        = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16                   = true;
 
        for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
        {
@@ -7210,7 +7210,7 @@ void addGraphics16BitStoragePushConstantFloat16To64Group (tcu::TestCaseGroup* te
        extensions.push_back("VK_KHR_16bit_storage");
 
        requiredFeatures.coreFeatures.shaderFloat64     = DE_TRUE;
-       requiredFeatures.ext16BitStorage                        = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
+       requiredFeatures.ext16BitStorage.storagePushConstant16                  = true;
 
        fragments["capability"]                                         =
                "OpCapability StoragePushConstant16\n"
@@ -8080,7 +8080,7 @@ void addGraphics16BitStorageInputOutputFloat64To16Group (tcu::TestCaseGroup* tes
        VulkanFeatures  requiredFeatures;
 
        requiredFeatures.coreFeatures.shaderFloat64     = DE_TRUE;
-       requiredFeatures.ext16BitStorage                        = EXT16BITSTORAGEFEATURES_INPUT_OUTPUT;
+       requiredFeatures.ext16BitStorage.storageInputOutput16                   = true;
 
        for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(cases); ++caseIdx)
                for (deUint32 rndModeIdx = 0; rndModeIdx < DE_LENGTH_OF_ARRAY(rndModes); ++rndModeIdx)
@@ -8515,7 +8515,7 @@ void addCompute16bitStoragePushConstant16To64Group (tcu::TestCaseGroup* group)
                        spec.extensions.push_back("VK_KHR_16bit_storage");
 
                        spec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
-                       spec.requestedVulkanFeatures.ext16BitStorage                    = EXT16BITSTORAGEFEATURES_PUSH_CONSTANT;
+                       spec.requestedVulkanFeatures.ext16BitStorage.storagePushConstant16                      = true;
 
                        group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
                }
index ec073bd..e92243e 100644 (file)
@@ -1721,11 +1721,12 @@ void T64bitCompareTest<T>::checkSupport (Context& context) const
                DE_ASSERT(DE_NULL == "Invalid shader stage specified");
        }
 
-       ExtensionFloatControlsFeatures fcFeatures;
+       vk::VkPhysicalDeviceFloatControlsProperties fcFeatures;
        deMemset(&fcFeatures, 0, sizeof(fcFeatures));
        fcFeatures.shaderSignedZeroInfNanPreserveFloat64 = VK_TRUE;
 
-       if (m_params.requireNanPreserve && !isFloatControlsFeaturesSupported(context, fcFeatures))
+       const char *unused;
+       if (m_params.requireNanPreserve && !isFloatControlsFeaturesSupported(context, fcFeatures, &unused))
                TCU_THROW(NotSupportedError, "NaN preservation not supported");
 }
 
index e163511..08f8a96 100644 (file)
@@ -145,11 +145,11 @@ VulkanFeatures    get8BitStorageFeatures  (const char* cap)
 {
        VulkanFeatures features;
        if (string(cap) == "storage_buffer")
-               features.ext8BitStorage = EXT8BITSTORAGEFEATURES_STORAGE_BUFFER;
+               features.ext8BitStorage.storageBuffer8BitAccess = true;
        else if (string(cap) == "uniform")
-               features.ext8BitStorage = EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER;
+               features.ext8BitStorage.uniformAndStorageBuffer8BitAccess = true;
        else if  (string(cap) == "push_constant")
-               features.ext8BitStorage = EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;
+               features.ext8BitStorage.storagePushConstant8 = true;
        else
                DE_ASSERT(false && "not supported");
 
@@ -1409,7 +1409,7 @@ void addCompute8bitStoragePushConstant8To32Group (tcu::TestCaseGroup* group)
                                spec.outputs.push_back(BufferSp(new Int32Buffer(uOutputs)));
                        spec.extensions.push_back("VK_KHR_8bit_storage");
                        spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
-                       spec.requestedVulkanFeatures.ext8BitStorage = EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;
+                       spec.requestedVulkanFeatures.ext8BitStorage.storagePushConstant8 = true;
 
                        group->addChild(new SpvAsmComputeShaderCase(testCtx, testName, testName, spec));
                }
@@ -1567,7 +1567,7 @@ void addCompute8bitStorage16To8Group (tcu::TestCaseGroup* group)
                        spec.extensions.push_back("VK_KHR_8bit_storage");
                        spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
                        spec.requestedVulkanFeatures = get8BitStorageFeatures(CAPABILITIES[STORAGE_BUFFER_TEST].name);
-                       spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM;
+                       spec.requestedVulkanFeatures.ext16BitStorage.uniformAndStorageBuffer16BitAccess = true;
 
                        group->addChild(new SpvAsmComputeShaderCase(testCtx, testName.c_str(), testName.c_str(), spec));
                }
@@ -1725,7 +1725,7 @@ void addCompute8bitUniform8To16Group (tcu::TestCaseGroup* group)
                        spec.extensions.push_back("VK_KHR_16bit_storage");
                        spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
                        spec.requestedVulkanFeatures = get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);
-                       spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM;
+                       spec.requestedVulkanFeatures.ext16BitStorage.uniformAndStorageBuffer16BitAccess = true;
 
                        if (cTypes[tyIdx].componentsCount == 4)
                                spec.verifyIO = checkUniformsArray<deInt8, deInt16, 4>;
@@ -1896,8 +1896,8 @@ void addCompute8bitStoragePushConstant8To16Group (tcu::TestCaseGroup* group)
                        spec.extensions.push_back("VK_KHR_8bit_storage");
                        spec.extensions.push_back("VK_KHR_16bit_storage");
                        spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
-                       spec.requestedVulkanFeatures.ext8BitStorage = EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;
-                       spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM;
+                       spec.requestedVulkanFeatures.ext8BitStorage.storagePushConstant8 = true;
+                       spec.requestedVulkanFeatures.ext16BitStorage.uniformAndStorageBuffer16BitAccess = true;
 
                        group->addChild(new SpvAsmComputeShaderCase(testCtx, testName, testName, spec));
                }
@@ -1982,7 +1982,7 @@ void addCompute8bitStorageBuffer8To8Group (tcu::TestCaseGroup* group)
        spec.outputs.push_back(BufferSp(new Int8Buffer(int8DummyData)));
        spec.extensions.push_back("VK_KHR_storage_buffer_storage_class");
        spec.extensions.push_back("VK_KHR_8bit_storage");
-       spec.requestedVulkanFeatures.ext8BitStorage = EXT8BITSTORAGEFEATURES_STORAGE_BUFFER;
+       spec.requestedVulkanFeatures.ext8BitStorage.storageBuffer8BitAccess = true;
 
        group->addChild(new SpvAsmComputeShaderCase(testCtx, "stress_test", "Granularity stress test", spec));
 }
@@ -3201,7 +3201,7 @@ void addGraphics8BitStoragePushConstantInt8To32Group (tcu::TestCaseGroup* testGr
 
        requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics    = true;
        requiredFeatures.coreFeatures.fragmentStoresAndAtomics                  = true;
-       requiredFeatures.ext8BitStorage                                                                 = EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;
+       requiredFeatures.ext8BitStorage.storagePushConstant8           = true;
 
        fragments["capability"]                         = "OpCapability StoragePushConstant8\n";
        fragments["extension"]                          = "OpExtension \"SPV_KHR_storage_buffer_storage_class\"\n"
@@ -3696,7 +3696,7 @@ void addGraphics8BitStorageUniformInt16To8Group (tcu::TestCaseGroup* testGroup)
                        fragments["decoration"]                 = categories[catIdx].decoration.specialize(specs);
 
                        features                                                                                                = get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);
-                       features.ext16BitStorage                                                                = EXT16BITSTORAGEFEATURES_UNIFORM;
+                       features.ext16BitStorage.uniformAndStorageBuffer16BitAccess                                                             = true;
                        features.coreFeatures.vertexPipelineStoresAndAtomics    = true;
                        features.coreFeatures.fragmentStoresAndAtomics                  = true;
 
@@ -3977,7 +3977,7 @@ void addGraphics8BitStorageUniformInt8To16Group (tcu::TestCaseGroup* testGroup)
                                }
 
                                features                                                                                                = get8BitStorageFeatures(CAPABILITIES[UNIFORM_AND_STORAGEBUFFER_TEST].name);
-                               features.ext16BitStorage                                                                = EXT16BITSTORAGEFEATURES_UNIFORM;
+                               features.ext16BitStorage.uniformAndStorageBuffer16BitAccess                                                             = true;
                                features.coreFeatures.vertexPipelineStoresAndAtomics    = true;
                                features.coreFeatures.fragmentStoresAndAtomics                  = true;
 
@@ -4033,8 +4033,8 @@ void addGraphics8BitStoragePushConstantInt8To16Group (tcu::TestCaseGroup* testGr
 
        requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics    = true;
        requiredFeatures.coreFeatures.fragmentStoresAndAtomics                  = true;
-       requiredFeatures.ext8BitStorage                                                                 = EXT8BITSTORAGEFEATURES_PUSH_CONSTANT;
-       requiredFeatures.ext16BitStorage                                                                = EXT16BITSTORAGEFEATURES_UNIFORM;
+       requiredFeatures.ext8BitStorage.storagePushConstant8           = true;
+       requiredFeatures.ext16BitStorage.uniformAndStorageBuffer16BitAccess                                                             = true;
 
        fragments["capability"]                         = "OpCapability StoragePushConstant8\n"
                                                                                  "OpCapability StorageUniform16\n";
index fb102e1..6246e9a 100644 (file)
@@ -382,69 +382,44 @@ void SpvAsmComputeShaderCase::checkSupport(Context& context) const
 
        // Core features
        {
-               const char*                                             unsupportedFeature = DE_NULL;
-               vk::VkPhysicalDeviceFeatures    localRequiredCoreFeatures = m_shaderSpec.requestedVulkanFeatures.coreFeatures;
+               VulkanFeatures localRequired = m_shaderSpec.requestedVulkanFeatures;
 
                // Skip check features not targeted to compute
-               localRequiredCoreFeatures.fullDrawIndexUint32                                           = DE_FALSE;
-               localRequiredCoreFeatures.independentBlend                                                      = DE_FALSE;
-               localRequiredCoreFeatures.geometryShader                                                        = DE_FALSE;
-               localRequiredCoreFeatures.tessellationShader                                            = DE_FALSE;
-               localRequiredCoreFeatures.sampleRateShading                                                     = DE_FALSE;
-               localRequiredCoreFeatures.dualSrcBlend                                                          = DE_FALSE;
-               localRequiredCoreFeatures.logicOp                                                                       = DE_FALSE;
-               localRequiredCoreFeatures.multiDrawIndirect                                                     = DE_FALSE;
-               localRequiredCoreFeatures.drawIndirectFirstInstance                                     = DE_FALSE;
-               localRequiredCoreFeatures.depthClamp                                                            = DE_FALSE;
-               localRequiredCoreFeatures.depthBiasClamp                                                        = DE_FALSE;
-               localRequiredCoreFeatures.fillModeNonSolid                                                      = DE_FALSE;
-               localRequiredCoreFeatures.depthBounds                                                           = DE_FALSE;
-               localRequiredCoreFeatures.wideLines                                                                     = DE_FALSE;
-               localRequiredCoreFeatures.largePoints                                                           = DE_FALSE;
-               localRequiredCoreFeatures.alphaToOne                                                            = DE_FALSE;
-               localRequiredCoreFeatures.multiViewport                                                         = DE_FALSE;
-               localRequiredCoreFeatures.occlusionQueryPrecise                                         = DE_FALSE;
-               localRequiredCoreFeatures.vertexPipelineStoresAndAtomics                        = DE_FALSE;
-               localRequiredCoreFeatures.fragmentStoresAndAtomics                                      = DE_FALSE;
-               localRequiredCoreFeatures.shaderTessellationAndGeometryPointSize        = DE_FALSE;
-               localRequiredCoreFeatures.shaderClipDistance                                            = DE_FALSE;
-               localRequiredCoreFeatures.shaderCullDistance                                            = DE_FALSE;
-               localRequiredCoreFeatures.sparseBinding                                                         = DE_FALSE;
-               localRequiredCoreFeatures.variableMultisampleRate                                       = DE_FALSE;
-
-               if (!isCoreFeaturesSupported(context, localRequiredCoreFeatures, &unsupportedFeature))
-                       TCU_THROW(NotSupportedError, std::string("At least following requested core feature is not supported: ") + unsupportedFeature);
+               // TODO: Is this really needed? Just don't have tests ask for features that they don't want.
+               localRequired.coreFeatures.fullDrawIndexUint32                                          = DE_FALSE;
+               localRequired.coreFeatures.independentBlend                                                     = DE_FALSE;
+               localRequired.coreFeatures.geometryShader                                                       = DE_FALSE;
+               localRequired.coreFeatures.tessellationShader                                           = DE_FALSE;
+               localRequired.coreFeatures.sampleRateShading                                                    = DE_FALSE;
+               localRequired.coreFeatures.dualSrcBlend                                                         = DE_FALSE;
+               localRequired.coreFeatures.logicOp                                                                      = DE_FALSE;
+               localRequired.coreFeatures.multiDrawIndirect                                                    = DE_FALSE;
+               localRequired.coreFeatures.drawIndirectFirstInstance                                    = DE_FALSE;
+               localRequired.coreFeatures.depthClamp                                                           = DE_FALSE;
+               localRequired.coreFeatures.depthBiasClamp                                                       = DE_FALSE;
+               localRequired.coreFeatures.fillModeNonSolid                                                     = DE_FALSE;
+               localRequired.coreFeatures.depthBounds                                                          = DE_FALSE;
+               localRequired.coreFeatures.wideLines                                                                    = DE_FALSE;
+               localRequired.coreFeatures.largePoints                                                          = DE_FALSE;
+               localRequired.coreFeatures.alphaToOne                                                           = DE_FALSE;
+               localRequired.coreFeatures.multiViewport                                                                = DE_FALSE;
+               localRequired.coreFeatures.occlusionQueryPrecise                                                = DE_FALSE;
+               localRequired.coreFeatures.vertexPipelineStoresAndAtomics                       = DE_FALSE;
+               localRequired.coreFeatures.fragmentStoresAndAtomics                                     = DE_FALSE;
+               localRequired.coreFeatures.shaderTessellationAndGeometryPointSize       = DE_FALSE;
+               localRequired.coreFeatures.shaderClipDistance                                           = DE_FALSE;
+               localRequired.coreFeatures.shaderCullDistance                                           = DE_FALSE;
+               localRequired.coreFeatures.sparseBinding                                                                = DE_FALSE;
+               localRequired.coreFeatures.variableMultisampleRate                                      = DE_FALSE;
+
+               const char* unsupportedFeature = DE_NULL;
+               if (!isVulkanFeaturesSupported(context, localRequired, &unsupportedFeature))
+                       TCU_THROW(NotSupportedError, std::string("At least following requested feature is not supported: ") + unsupportedFeature);
        }
 
        // Extension features
-       {
-               // 8bit storage features
-               if (!is8BitStorageFeaturesSupported(context, m_shaderSpec.requestedVulkanFeatures.ext8BitStorage))
-                       TCU_THROW(NotSupportedError, "Requested 8bit storage features not supported");
-
-               // 16bit storage features
-               if (!is16BitStorageFeaturesSupported(context, m_shaderSpec.requestedVulkanFeatures.ext16BitStorage))
-                       TCU_THROW(NotSupportedError, "Requested 16bit storage features not supported");
-
-               // VariablePointers features
-               if (!isVariablePointersFeaturesSupported(context, m_shaderSpec.requestedVulkanFeatures.extVariablePointers))
-                       TCU_THROW(NotSupportedError, "Requested Variable Pointer feature not supported");
-
-               // Float16/Int8 shader features
-               if (!isFloat16Int8FeaturesSupported(context, m_shaderSpec.requestedVulkanFeatures.extFloat16Int8))
-                       TCU_THROW(NotSupportedError, "Requested 16bit float or 8bit int feature not supported");
-
-               // Vulkan Memory Model features
-               if (!isVulkanMemoryModelFeaturesSupported(context, m_shaderSpec.requestedVulkanFeatures.extVulkanMemoryModel))
-                       TCU_THROW(NotSupportedError, "Requested Vulkan Memory Model feature not supported");
-
-               // FloatControls features
-               if (!isFloatControlsFeaturesSupported(context, m_shaderSpec.requestedVulkanFeatures.floatControlsProperties))
-                       TCU_THROW(NotSupportedError, "Requested Float Controls features not supported");
-
-               if (m_shaderSpec.usesPhysStorageBuffer && !context.isBufferDeviceAddressSupported())
-                       TCU_THROW(NotSupportedError, "Request physical storage buffer feature not supported");
-       }
+       if (m_shaderSpec.usesPhysStorageBuffer && !context.isBufferDeviceAddressSupported())
+               TCU_THROW(NotSupportedError, "Request physical storage buffer feature not supported");
 }
 
 void SpvAsmComputeShaderCase::initPrograms (SourceCollections& programCollection) const
index dc17a3e..0370351 100644 (file)
@@ -307,8 +307,7 @@ void addPointerComparisionComputeGroup(tcu::TestCaseGroup* group)
   spec.assembly = computeSource;
   spec.numWorkGroups = tcu::IVec3(1, 1, 1);
   spec.spirvVersion = SPIRV_VERSION_1_4;
-  spec.requestedVulkanFeatures.extVariablePointers =
-      EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+  spec.requestedVulkanFeatures.extVariablePointers.variablePointersStorageBuffer = true;
   spec.inputs.push_back(Resource(BufferSp(new Int32Buffer(input))));
   spec.outputs.push_back(Resource(BufferSp(new Int32Buffer(expectedOutput))));
   spec.extensions.push_back("VK_KHR_spirv_1_4");
@@ -524,8 +523,7 @@ void addFunctionArgumentReturnValueGroup(tcu::TestCaseGroup* group)
                spec.assembly = shaderTemplate.specialize(specializationMap);
                spec.numWorkGroups = tcu::IVec3(2, 1, 1);
                spec.spirvVersion = SPIRV_VERSION_1_4;
-               spec.requestedVulkanFeatures.extVariablePointers =
-                       EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+               spec.requestedVulkanFeatures.extVariablePointers.variablePointersStorageBuffer = true;
                spec.inputs.push_back(Resource(BufferSp(new Int32Buffer(input))));
                spec.outputs.push_back(
                                                           Resource(BufferSp(new Uint32Buffer(expectedOutput))));
index 7551ede..650f381 100644 (file)
@@ -198,7 +198,8 @@ void SpvAsmFloatControlsExtensionlessCase::checkSupport (Context& context) const
        if (m_fpWideness == 16)
        {
                context.requireDeviceFunctionality("VK_KHR_shader_float16_int8");
-               if (!isFloat16Int8FeaturesSupported(context, EXTFLOAT16INT8FEATURES_FLOAT16))
+               const VkPhysicalDeviceShaderFloat16Int8Features& extensionFeatures = context.getShaderFloat16Int8Features();
+               if (!extensionFeatures.shaderFloat16)
                        TCU_THROW(NotSupportedError, "Floating point number of width 16 bit are not supported");
        }
 
index d0c6041..f96373e 100644 (file)
@@ -3017,7 +3017,7 @@ void TestGroupBuilderBase::setupVulkanFeatures(FloatType          inFloatType,
        features.coreFeatures.shaderFloat64 = float64FeatureRequired;
 
        // request proper float controls features
-       ExtensionFloatControlsFeatures& floatControls = features.floatControlsProperties;
+       vk::VkPhysicalDeviceFloatControlsProperties& floatControls = features.floatControlsProperties;
 
        // rounding mode should obey the destination type
        bool rteRounding = (behaviorFlags & B_RTE_ROUNDING) != 0;
@@ -3620,14 +3620,14 @@ void ComputeTestGroupBuilder::fillShaderSpec(const OperationTestCaseInfo&       testCa
        if (float16FeatureRequired && !testCase.fp16Without16BitStorage)
        {
                csSpec.extensions.push_back("VK_KHR_16bit_storage");
-               csSpec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               csSpec.requestedVulkanFeatures.ext16BitStorage.storageBuffer16BitAccess = true;
                needShaderFloat16 |= testOperation.floatUsage == FLOAT_ARITHMETIC;
        }
        needShaderFloat16 |= usesFP16Constants;
        if (needShaderFloat16)
        {
                csSpec.extensions.push_back("VK_KHR_shader_float16_int8");
-               csSpec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+               csSpec.requestedVulkanFeatures.extFloat16Int8.shaderFloat16 = true;
        }
        if (float64FeatureRequired)
                csSpec.requestedVulkanFeatures.coreFeatures.shaderFloat64 = VK_TRUE;
@@ -3646,7 +3646,7 @@ void ComputeTestGroupBuilder::fillShaderSpec(const SettingsTestCaseInfo&  testCas
        ValueId         fp32resultValue;
        ValueId         fp64resultValue;
 
-       ExtensionFloatControlsFeatures& floatControls = csSpec.requestedVulkanFeatures.floatControlsProperties;
+       vk::VkPhysicalDeviceFloatControlsProperties& floatControls = csSpec.requestedVulkanFeatures.floatControlsProperties;
        bool fp16Required       = testCaseInfo.fp16Option != SO_UNUSED;
        bool fp32Required       = testCaseInfo.fp32Option != SO_UNUSED;
        bool fp64Required       = testCaseInfo.fp64Option != SO_UNUSED;
@@ -3817,7 +3817,7 @@ void ComputeTestGroupBuilder::fillShaderSpec(const SettingsTestCaseInfo&  testCas
                        saveResult              += fp16Data.snippets->multiStoreResultsFp16Snippet;
 
                        csSpec.extensions.push_back("VK_KHR_shader_float16_int8");
-                       csSpec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+                       csSpec.requestedVulkanFeatures.extFloat16Int8.shaderFloat16 = true;
                }
                else
                {
@@ -3837,7 +3837,7 @@ void ComputeTestGroupBuilder::fillShaderSpec(const SettingsTestCaseInfo&  testCas
                        saveResult              += fp16Data.snippets->multiStoreResultsSnippet;
 
                        csSpec.extensions.push_back("VK_KHR_16bit_storage");
-                       csSpec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+                       csSpec.requestedVulkanFeatures.ext16BitStorage.storageBuffer16BitAccess = true;
                }
 
                fp16Data.values->fillInputData(addArgs, inputData, inputOffset);
@@ -4546,12 +4546,12 @@ InstanceContext GraphicsTestGroupBuilder::createInstanceContext(const OperationT
        if (needsShaderFloat16)
        {
                extensions.push_back("VK_KHR_shader_float16_int8");
-               vulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+               vulkanFeatures.extFloat16Int8.shaderFloat16 = true;
        }
        if (float16FeatureRequired && !testCase.fp16Without16BitStorage)
        {
                extensions.push_back("VK_KHR_16bit_storage");
-               vulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               vulkanFeatures.ext16BitStorage.storageBuffer16BitAccess = true;
        }
 
        InstanceContext ctx(defaultColors,
index 92afa06..7dcb3b6 100644 (file)
@@ -3071,64 +3071,31 @@ TestStatus runAndVerifyDefaultPipeline (Context& context, InstanceContext instan
                }
        }
 
-       // Core features
        {
+               VulkanFeatures localRequired = instance.requestedFeatures;
+
                const VkShaderStageFlags                vertexPipelineStoresAndAtomicsAffected  = vk::VK_SHADER_STAGE_VERTEX_BIT
                                                                                                                                                                | vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT
                                                                                                                                                                | vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT
                                                                                                                                                                | vk::VK_SHADER_STAGE_GEOMETRY_BIT;
-               const char*                                             unsupportedFeature                                              = DE_NULL;
-               vk::VkPhysicalDeviceFeatures    localRequiredCoreFeatures                               = instance.requestedFeatures.coreFeatures;
 
                // reset fragment stores and atomics feature requirement
-               if ((localRequiredCoreFeatures.fragmentStoresAndAtomics != DE_FALSE) &&
+               if ((localRequired.coreFeatures.fragmentStoresAndAtomics != DE_FALSE) &&
                        (instance.customizedStages & vk::VK_SHADER_STAGE_FRAGMENT_BIT) == 0)
                {
-                       localRequiredCoreFeatures.fragmentStoresAndAtomics = DE_FALSE;
+                       localRequired.coreFeatures.fragmentStoresAndAtomics = DE_FALSE;
                }
 
                // reset vertex pipeline stores and atomics feature requirement
-               if (localRequiredCoreFeatures.vertexPipelineStoresAndAtomics != DE_FALSE &&
+               if (localRequired.coreFeatures.vertexPipelineStoresAndAtomics != DE_FALSE &&
                        (instance.customizedStages & vertexPipelineStoresAndAtomicsAffected) == 0)
                {
-                       localRequiredCoreFeatures.vertexPipelineStoresAndAtomics = DE_FALSE;
-               }
-
-               if (!isCoreFeaturesSupported(context, localRequiredCoreFeatures, &unsupportedFeature))
-                       TCU_THROW(NotSupportedError, std::string("At least following requested core feature is not supported: ") + unsupportedFeature);
-       }
-
-       // Extension features
-       {
-               // 8bit storage features
-               {
-                       if (!is8BitStorageFeaturesSupported(context, instance.requestedFeatures.ext8BitStorage))
-                               TCU_THROW(NotSupportedError, "Requested 8bit storage features not supported");
-               }
-
-               // 16bit storage features
-               {
-                       if (!is16BitStorageFeaturesSupported(context, instance.requestedFeatures.ext16BitStorage))
-                               TCU_THROW(NotSupportedError, "Requested 16bit storage features not supported");
+                       localRequired.coreFeatures.vertexPipelineStoresAndAtomics = DE_FALSE;
                }
 
-               // Variable Pointers features
-               {
-                       if (!isVariablePointersFeaturesSupported(context, instance.requestedFeatures.extVariablePointers))
-                               TCU_THROW(NotSupportedError, "Requested Variable Pointer features not supported");
-               }
-
-               // Float16/Int8 shader features
-               {
-                       if (!isFloat16Int8FeaturesSupported(context, instance.requestedFeatures.extFloat16Int8))
-                               TCU_THROW(NotSupportedError, "Requested 16bit float or 8bit int feature not supported");
-               }
-       }
-
-       // FloatControls features
-       {
-               if (!isFloatControlsFeaturesSupported(context, instance.requestedFeatures.floatControlsProperties))
-                       TCU_THROW(NotSupportedError, "Requested Float Controls features not supported");
+               const char* unsupportedFeature = DE_NULL;
+               if (!isVulkanFeaturesSupported(context, localRequired, &unsupportedFeature))
+                       TCU_THROW(NotSupportedError, std::string("At least following requested feature not supported: ") + unsupportedFeature);
        }
 
        // Check Interface Input/Output formats are supported
index 3987515..00fcbcb 100644 (file)
@@ -223,7 +223,7 @@ void addComputeIndexingStructTests (tcu::TestCaseGroup* group)
                                                specs["extensions"]                             = "OpExtension \"SPV_KHR_variable_pointers\"\n                             "
                                                                                                                  "OpExtension \"SPV_KHR_storage_buffer_storage_class\"";
                                                element = 1;
-                                               vulkanFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+                                               vulkanFeatures.extVariablePointers.variablePointersStorageBuffer = true;
                                                spec.extensions.push_back("VK_KHR_variable_pointers");
                                                break;
                                }
@@ -472,7 +472,7 @@ void addGraphicsIndexingStructTests (tcu::TestCaseGroup* group)
                                                fragments["capability"]                         += "OpCapability VariablePointersStorageBuffer";
                                                fragments["extension"]                          = "OpExtension \"SPV_KHR_variable_pointers\"\nOpExtension \"SPV_KHR_storage_buffer_storage_class\"";
                                                extensions.push_back                            ("VK_KHR_variable_pointers");
-                                               vulkanFeatures.extVariablePointers      = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+                                               vulkanFeatures.extVariablePointers.variablePointersStorageBuffer = true;
                                                element = 1;
                                                break;
                                }
@@ -675,7 +675,7 @@ void addComputeIndexingNon16BaseAlignmentTests (tcu::TestCaseGroup* group)
                        "                             OpReturn\n"
                        "                             OpFunctionEnd\n";
 
-       vulkanFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+       vulkanFeatures.extVariablePointers.variablePointersStorageBuffer = true;
        spec.extensions.push_back("VK_KHR_variable_pointers");
 
        inputData.reserve(numInputFloats);
index 319b40b..7018d77 100644 (file)
@@ -1444,7 +1444,7 @@ tcu::TestCaseGroup* createOpAtomicGroup (tcu::TestContext& testCtx, bool useStor
                if (volatileAtomic)
                {
                        spec.extensions.push_back("VK_KHR_vulkan_memory_model");
-                       spec.requestedVulkanFeatures.extVulkanMemoryModel = EXTVULKANMEMORYMODELFEATURES_ENABLE;
+                       spec.requestedVulkanFeatures.extVulkanMemoryModel.vulkanMemoryModel = true;
 
                        // volatile, queuefamily scope
                        specializations["SEMANTICS"] = "%volbit";
@@ -3868,7 +3868,7 @@ tcu::TestCaseGroup* createSpecConstantGroup (tcu::TestContext& testCtx)
                // Special SPIR-V code when using 16-bit floats.
                if (cases[caseNdx].caseFlags & FLAG_F16)
                {
-                       spec.requestedVulkanFeatures.extFloat16Int8     |= EXTFLOAT16INT8FEATURES_FLOAT16;
+                       spec.requestedVulkanFeatures.extFloat16Int8.shaderFloat16 = true;
                        specializations["CAPABILITIES"]                         += "OpCapability Float16\n";                                            // Adds 16-bit float capability
                        specializations["OPTYPE_DEFINITIONS"]           += "%f16 = OpTypeFloat 16\n";                                           // Adds 16-bit float type
                        if (cases[caseNdx].caseFlags & FLAG_CONVERT)
@@ -3878,7 +3878,7 @@ tcu::TestCaseGroup* createSpecConstantGroup (tcu::TestContext& testCtx)
                // Special SPIR-V code when using 8-bit integers.
                if (cases[caseNdx].caseFlags & FLAG_I8)
                {
-                       spec.requestedVulkanFeatures.extFloat16Int8     |= EXTFLOAT16INT8FEATURES_INT8;
+                       spec.requestedVulkanFeatures.extFloat16Int8.shaderInt8 = true;
                        specializations["CAPABILITIES"]                         += "OpCapability Int8\n";                                               // Adds 8-bit integer capability
                        specializations["OPTYPE_DEFINITIONS"]           += "%i8 = OpTypeInt 8 1\n";                                             // Adds 8-bit integer type
                        if (cases[caseNdx].caseFlags & FLAG_CONVERT)
@@ -4134,7 +4134,7 @@ void createOpPhiVartypeTests (de::MovePtr<tcu::TestCaseGroup>& group, tcu::TestC
        specFloat16.inputs.push_back(BufferSp(new Uint32Buffer(inputUints)));
        specFloat16.outputs.push_back(BufferSp(new Uint32Buffer(outputUints)));
        specFloat16.numWorkGroups = IVec3(numElements, 1, 1);
-       specFloat16.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+       specFloat16.requestedVulkanFeatures.extFloat16Int8.shaderFloat16 = true;
 
        specMat4.assembly =
                string(getComputeAsmShaderPreamble()) +
@@ -7109,7 +7109,7 @@ tcu::TestCaseGroup* createFloat16OpConstantCompositeGroup (tcu::TestContext& tes
 
                spec.extensions.push_back("VK_KHR_shader_float16_int8");
 
-               spec.requestedVulkanFeatures.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+               spec.requestedVulkanFeatures.extFloat16Int8.shaderFloat16 = true;
 
                group->addChild(new SpvAsmComputeShaderCase(testCtx, cases[caseNdx].name, cases[caseNdx].name, spec));
        }
@@ -8290,7 +8290,7 @@ tcu::TestCaseGroup* createSpecConstantTests (tcu::TestContext& testCtx)
                // Special SPIR-V code when using 16-bit floats.
                if (cases[caseNdx].caseFlags & FLAG_F16)
                {
-                       requiredFeatures.extFloat16Int8                         |= EXTFLOAT16INT8FEATURES_FLOAT16;
+                       requiredFeatures.extFloat16Int8.shaderFloat16 = true;
                        fragments["capability"]                                         += "OpCapability Float16\n";                                            // Adds 16-bit float capability
                        specializations["OPTYPE_DEFINITIONS"]           += "%f16 = OpTypeFloat 16\n";                                           // Adds 16-bit float type
                        if (cases[caseNdx].caseFlags & FLAG_CONVERT)
@@ -8300,7 +8300,7 @@ tcu::TestCaseGroup* createSpecConstantTests (tcu::TestContext& testCtx)
                // Special SPIR-V code when using 8-bit integers.
                if (cases[caseNdx].caseFlags & FLAG_I8)
                {
-                       requiredFeatures.extFloat16Int8                         |= EXTFLOAT16INT8FEATURES_INT8;
+                       requiredFeatures.extFloat16Int8.shaderInt8 = true;
                        fragments["capability"]                                         += "OpCapability Int8\n";                                               // Adds 8-bit integer capability
                        specializations["OPTYPE_DEFINITIONS"]           += "%i8 = OpTypeInt 8 1\n";                                             // Adds 8-bit integer type
                        if (cases[caseNdx].caseFlags & FLAG_CONVERT)
@@ -8616,7 +8616,7 @@ tcu::TestCaseGroup* createOpPhiTests(tcu::TestContext& testCtx)
 
        extensions4.push_back("VK_KHR_shader_float16_int8");
 
-       vulkanFeatures4.extFloat16Int8  = EXTFLOAT16INT8FEATURES_FLOAT16;
+       vulkanFeatures4.extFloat16Int8.shaderFloat16 = true;
 
        outputColors4[0]                        = RGBA(127, 127, 127, 255);
        outputColors4[1]                        = RGBA(127, 0,   0,   255);
@@ -10384,7 +10384,7 @@ void getVulkanFeaturesAndExtensions (ConversionDataType from, ConversionDataType
        if ((usesInt16(from, to) || usesFloat16(from, to)) && useStorageExt)
        {
                extensions.push_back("VK_KHR_16bit_storage");
-               vulkanFeatures.ext16BitStorage |= EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               vulkanFeatures.ext16BitStorage.storageBuffer16BitAccess = true;
        }
 
        if (usesFloat16(from, to) || usesInt8(from, to))
@@ -10393,15 +10393,15 @@ void getVulkanFeaturesAndExtensions (ConversionDataType from, ConversionDataType
 
                if (usesFloat16(from, to))
                {
-                       vulkanFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_FLOAT16;
+                       vulkanFeatures.extFloat16Int8.shaderFloat16 = true;
                }
 
                if (usesInt8(from, to))
                {
-                       vulkanFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_INT8;
+                       vulkanFeatures.extFloat16Int8.shaderInt8 = true;
 
                        extensions.push_back("VK_KHR_8bit_storage");
-                       vulkanFeatures.ext8BitStorage |= EXT8BITSTORAGEFEATURES_STORAGE_BUFFER;
+                       vulkanFeatures.ext8BitStorage.storageBuffer8BitAccess = true;
                }
        }
 }
@@ -11295,7 +11295,7 @@ tcu::TestCaseGroup* createOpConstantFloat16Tests(tcu::TestContext& testCtx)
        outputColors[3] = RGBA(127, 127, 255, 255);
 
        extensions.push_back("VK_KHR_shader_float16_int8");
-       features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+       features.extFloat16Int8.shaderFloat16 = true;
 
        for (size_t testNdx = 0; testNdx < sizeof(tests) / sizeof(NameConstantsCode); ++testNdx)
        {
@@ -11529,7 +11529,7 @@ tcu::TestCaseGroup* createFloat16LogicalSet (tcu::TestContext& testCtx, const bo
                                features.floatControlsProperties.shaderSignedZeroInfNanPreserveFloat16 = DE_TRUE;
                        }
 
-                       features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+                       features.extFloat16Int8.shaderFloat16 = true;
 
                        finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
                }
@@ -11658,7 +11658,7 @@ tcu::TestCaseGroup* createFloat16LogicalSet (tcu::TestContext& testCtx, const bo
                                features.floatControlsProperties.shaderSignedZeroInfNanPreserveFloat16 = DE_TRUE;
                        }
 
-                       features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+                       features.extFloat16Int8.shaderFloat16 = true;
 
                        finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1), true);
                }
@@ -11864,7 +11864,7 @@ tcu::TestCaseGroup* createFloat16FuncSet (tcu::TestContext& testCtx)
 
                extensions.push_back("VK_KHR_shader_float16_int8");
 
-               features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+               features.extFloat16Int8.shaderFloat16 = true;
 
                finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
        }
@@ -12117,7 +12117,7 @@ tcu::TestCaseGroup* createFloat16VectorExtractSet (tcu::TestContext& testCtx)
 
                extensions.push_back("VK_KHR_shader_float16_int8");
 
-               features.extFloat16Int8         = EXTFLOAT16INT8FEATURES_FLOAT16;
+               features.extFloat16Int8.shaderFloat16 = true;
 
                finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
        }
@@ -12374,7 +12374,7 @@ tcu::TestCaseGroup* createFloat16VectorInsertSet (tcu::TestContext& testCtx)
 
                extensions.push_back("VK_KHR_shader_float16_int8");
 
-               features.extFloat16Int8         = EXTFLOAT16INT8FEATURES_FLOAT16;
+               features.extFloat16Int8.shaderFloat16 = true;
 
                finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
        }
@@ -12754,7 +12754,7 @@ tcu::TestCaseGroup* createFloat16VectorShuffleSet (tcu::TestContext& testCtx)
 
                                extensions.push_back("VK_KHR_shader_float16_int8");
 
-                               features.extFloat16Int8         = EXTFLOAT16INT8FEATURES_FLOAT16;
+                               features.extFloat16Int8.shaderFloat16 = true;
 
                                finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
                        }
@@ -13260,7 +13260,7 @@ tcu::TestCaseGroup* createFloat16CompositeConstructSet (tcu::TestContext& testCt
 
                extensions.push_back("VK_KHR_shader_float16_int8");
 
-               features.extFloat16Int8         = EXTFLOAT16INT8FEATURES_FLOAT16;
+               features.extFloat16Int8.shaderFloat16 = true;
 
                finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
        }
@@ -14190,7 +14190,7 @@ tcu::TestCaseGroup* createFloat16CompositeInsertExtractSet (tcu::TestContext& te
 
                extensions.push_back("VK_KHR_shader_float16_int8");
 
-               features.extFloat16Int8         = EXTFLOAT16INT8FEATURES_FLOAT16;
+               features.extFloat16Int8.shaderFloat16 = true;
 
                finalizeTestsCreation(specResource, fragments, testCtx, *testGroup.get(), testName, features, extensions, IVec3(1, 1, 1));
        }
@@ -18629,7 +18629,7 @@ void createFloat16ArithmeticFuncTest (tcu::TestContext& testCtx, tcu::TestCaseGr
 
        extensions.push_back("VK_KHR_shader_float16_int8");
 
-       features.extFloat16Int8         = EXTFLOAT16INT8FEATURES_FLOAT16;
+       features.extFloat16Int8.shaderFloat16 = true;
 
        finalizeTestsCreation(specResource, fragments, testCtx, testGroup, testName, features, extensions, IVec3(1, 1, 1));
 }
@@ -19941,9 +19941,9 @@ tcu::TestCaseGroup* createBoolMixedBitSizeGroup (tcu::TestContext& testCtx)
                spec.outputs.push_back(BufferSp(new Float32Buffer(outputData)));
                spec.numWorkGroups = IVec3(numElements, 1, 1);
                if (hasFloat16)
-                       spec.requestedVulkanFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_FLOAT16;
+                       spec.requestedVulkanFeatures.extFloat16Int8.shaderFloat16 = true;
                if (hasInt8)
-                       spec.requestedVulkanFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_INT8;
+                       spec.requestedVulkanFeatures.extFloat16Int8.shaderInt8 = true;
                spec.extensions.push_back("VK_KHR_shader_float16_int8");
 
                string testName = "b" + de::toString(cases[caseNdx][0]) + "b" + de::toString(cases[caseNdx][1]) + "b" + de::toString(cases[caseNdx][2]) + "b" + de::toString(cases[caseNdx][3]);
index e2376ea..1806c22 100644 (file)
@@ -205,15 +205,15 @@ void addDotProductExtensionAndFeatures(ComputeShaderSpec &spec,
        DE_ASSERT(!packingInfo.packed || elementSize == 8);
        if ((!packingInfo.packed && elementSize == 8) || outSize == 8)
        {
-               spec.requestedVulkanFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_INT8;
-               spec.requestedVulkanFeatures.ext8BitStorage = EXT8BITSTORAGEFEATURES_STORAGE_BUFFER;
+               spec.requestedVulkanFeatures.extFloat16Int8.shaderInt8 = true;
+               spec.requestedVulkanFeatures.ext8BitStorage.storageBuffer8BitAccess = true;
                spec.extensions.push_back("VK_KHR_8bit_storage");
        }
 
        if (elementSize == 16 || outSize == 16)
        {
-               spec.requestedVulkanFeatures.coreFeatures.shaderInt16 = VK_TRUE;
-               spec.requestedVulkanFeatures.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               spec.requestedVulkanFeatures.coreFeatures.shaderInt16 = true;
+               spec.requestedVulkanFeatures.ext16BitStorage.storageBuffer16BitAccess = true;
                spec.extensions.push_back("VK_KHR_16bit_storage");
        }
 }
index 3f091c9..3d9063c 100644 (file)
@@ -373,7 +373,7 @@ void addComputePointerBufferMemoryTest (tcu::TestCaseGroup* group)
        for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
                expectedOutput.push_back(2.0f);
 
-       requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+       requiredFeatures.extVariablePointers.variablePointersStorageBuffer = true;
 
        spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput)));
 
@@ -502,7 +502,7 @@ void addComputePointerBufferMemoryVariablePointersTest (tcu::TestCaseGroup* grou
        for (deUint32 numIdx = 0; numIdx < numFloats / 2; ++numIdx)
                expectedOutput.push_back(2.0f);
 
-       requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+       requiredFeatures.extVariablePointers.variablePointersStorageBuffer = true;
        spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput)));
        spec.extensions.push_back("VK_KHR_variable_pointers");
 
@@ -674,7 +674,7 @@ void addComputePointerWorkgroupMemoryVariablePointersTest (tcu::TestCaseGroup* g
        }
 
        spec.outputs.push_back(BufferSp(new Float32Buffer(expectedOutput)));
-       requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS;
+       requiredFeatures.extVariablePointers.variablePointers = true;
        spec.extensions.push_back("VK_KHR_variable_pointers");
 
        spec.assembly                                   = shaderSource;
@@ -963,7 +963,7 @@ void addGraphicsPointerBufferMemoryTest (tcu::TestCaseGroup* group)
        extensions.push_back("VK_KHR_variable_pointers");
        requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics    = true;
        requiredFeatures.coreFeatures.fragmentStoresAndAtomics                  = true;
-       requiredFeatures.extVariablePointers                                                    = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+       requiredFeatures.extVariablePointers.variablePointersStorageBuffer = true;
        resources.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput)), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
 
        createTestsForAllStages("buffer_memory", defaultColors, defaultColors, fragments, resources, extensions, group, requiredFeatures);
@@ -1073,7 +1073,7 @@ void addGraphicsPointerBufferMemoryVariablePointersTest (tcu::TestCaseGroup* gro
 
        extensions.push_back("VK_KHR_variable_pointers");
        requiredFeatures.coreFeatures.fragmentStoresAndAtomics                  = true;
-       requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+       requiredFeatures.extVariablePointers.variablePointersStorageBuffer = true;
        requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics = DE_TRUE;
        resources.outputs.push_back(Resource(BufferSp(new Float32Buffer(expectedOutput)), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER));
 
index afccfb9..11d04fd 100644 (file)
@@ -1552,18 +1552,18 @@ void SpvAsmTypeTests<T>::createStageTests (const char*                  testName,
 
        if (uses8bit)
        {
-               requiredFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_INT8;
+               requiredFeatures.extFloat16Int8.shaderInt8 = true;
        }
 
        if (m_inputType == TYPE_I8 || m_inputType == TYPE_U8)
        {
-               requiredFeatures.ext8BitStorage |= EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER;
+               requiredFeatures.ext8BitStorage.storageBuffer8BitAccess = true;
                spirvExtensions                                 += "OpExtension \"SPV_KHR_8bit_storage\"\n";
        }
 
        if (m_inputType == TYPE_I16 || m_inputType == TYPE_U16)
        {
-               requiredFeatures.ext16BitStorage        |= EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               requiredFeatures.ext16BitStorage.storageBuffer16BitAccess = true;
                spirvExtensions                                         += "OpExtension \"SPV_KHR_16bit_storage\"\n";
        }
 
@@ -2310,18 +2310,18 @@ void SpvAsmTypeTests<T>::createSwitchTests (void)
 
        if (uses8bit)
        {
-               requiredFeatures.extFloat16Int8 |= EXTFLOAT16INT8FEATURES_INT8;
+               requiredFeatures.extFloat16Int8.shaderInt8 = true;
        }
 
        if (m_inputType == TYPE_I8 || m_inputType == TYPE_U8)
        {
-               requiredFeatures.ext8BitStorage         |= EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER;
+               requiredFeatures.ext8BitStorage.storageBuffer8BitAccess = true;
                spirvExtensions                                         += "OpExtension \"SPV_KHR_8bit_storage\"\n";
        }
 
        if (m_inputType == TYPE_I16 || m_inputType == TYPE_U16)
        {
-               requiredFeatures.ext16BitStorage        |= EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               requiredFeatures.ext16BitStorage.storageBuffer16BitAccess = true;
                spirvExtensions                                         += "OpExtension \"SPV_KHR_16bit_storage\"\n";
        }
 
index 806c5de..1f5af64 100644 (file)
@@ -48,22 +48,6 @@ std::string VariableLocation::toDescription() const
        return "Set " + de::toString(set) + " and Binding " + de::toString(binding);
 }
 
-bool is8BitStorageFeaturesSupported (const Context& context, Extension8BitStorageFeatures toCheck)
-{
-       VkPhysicalDevice8BitStorageFeaturesKHR extensionFeatures = context.get8BitStorageFeatures();
-
-       if ((toCheck & EXT8BITSTORAGEFEATURES_STORAGE_BUFFER) != 0 && extensionFeatures.storageBuffer8BitAccess == VK_FALSE)
-               return false;
-
-       if ((toCheck & EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER) != 0 && extensionFeatures.uniformAndStorageBuffer8BitAccess == VK_FALSE)
-               return false;
-
-       if ((toCheck & EXT8BITSTORAGEFEATURES_PUSH_CONSTANT) != 0 && extensionFeatures.storagePushConstant8 == VK_FALSE)
-               return false;
-
-       return true;
-}
-
 #define IS_CORE_FEATURE_AVAILABLE(CHECKED, AVAILABLE, FEATURE) \
        if ((CHECKED.FEATURE != DE_FALSE) && (AVAILABLE.FEATURE == DE_FALSE)) { *missingFeature = #FEATURE; return false; }
 
@@ -132,68 +116,66 @@ bool isCoreFeaturesSupported (const Context&                                              context,
        return true;
 }
 
-bool is16BitStorageFeaturesSupported (const Context& context, Extension16BitStorageFeatures toCheck)
+#define IS_AVAIL(EXT_NAME, FEATURE)    \
+       if (toCheck.FEATURE && !extensionFeatures.FEATURE) { *missingFeature = EXT_NAME #FEATURE; return false; }
+
+bool isFloat16Int8FeaturesSupported(const Context& context, const vk::VkPhysicalDeviceShaderFloat16Int8Features& toCheck, const char **missingFeature)
 {
-       const VkPhysicalDevice16BitStorageFeatures& extensionFeatures = context.get16BitStorageFeatures();
+       const VkPhysicalDeviceShaderFloat16Int8Features& extensionFeatures = context.getShaderFloat16Int8Features();
 
-       if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK) != 0 && extensionFeatures.storageBuffer16BitAccess == VK_FALSE)
-               return false;
+       IS_AVAIL("ShaderFloat16Int8.", shaderFloat16);
+       IS_AVAIL("ShaderFloat16Int8.", shaderInt8);
 
-       if ((toCheck & EXT16BITSTORAGEFEATURES_UNIFORM) != 0 && extensionFeatures.uniformAndStorageBuffer16BitAccess == VK_FALSE)
-               return false;
+       return true;
+}
 
-       if ((toCheck & EXT16BITSTORAGEFEATURES_PUSH_CONSTANT) != 0 && extensionFeatures.storagePushConstant16 == VK_FALSE)
-               return false;
+bool is8BitStorageFeaturesSupported(const Context& context, const vk::VkPhysicalDevice8BitStorageFeatures& toCheck, const char **missingFeature)
+{
+       const VkPhysicalDevice8BitStorageFeaturesKHR& extensionFeatures = context.get8BitStorageFeatures();
 
-       if ((toCheck & EXT16BITSTORAGEFEATURES_INPUT_OUTPUT) != 0 && extensionFeatures.storageInputOutput16 == VK_FALSE)
-               return false;
+       IS_AVAIL("8BitStorage.", storageBuffer8BitAccess);
+       IS_AVAIL("8BitStorage.", uniformAndStorageBuffer8BitAccess);
+       IS_AVAIL("8BitStorage.", storagePushConstant8);
 
        return true;
 }
 
-bool isVariablePointersFeaturesSupported (const Context& context, ExtensionVariablePointersFeatures toCheck)
+bool is16BitStorageFeaturesSupported(const Context& context, const vk::VkPhysicalDevice16BitStorageFeatures& toCheck, const char **missingFeature)
 {
-       const VkPhysicalDeviceVariablePointersFeatures& extensionFeatures = context.getVariablePointersFeatures();
+       const VkPhysicalDevice16BitStorageFeatures& extensionFeatures = context.get16BitStorageFeatures();
 
-       if ((toCheck & EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER) != 0 && extensionFeatures.variablePointersStorageBuffer == VK_FALSE)
-               return false;
-
-       if ((toCheck & EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS) != 0 && extensionFeatures.variablePointers == VK_FALSE)
-               return false;
+       IS_AVAIL("16BitStorage.", storageBuffer16BitAccess);
+       IS_AVAIL("16BitStorage.", uniformAndStorageBuffer16BitAccess);
+       IS_AVAIL("16BitStorage.", storagePushConstant16);
+       IS_AVAIL("16BitStorage.", storageInputOutput16);
 
        return true;
 }
 
-bool isFloat16Int8FeaturesSupported (const Context& context, ExtensionFloat16Int8Features toCheck)
+bool isVariablePointersFeaturesSupported(const Context& context, const vk::VkPhysicalDeviceVariablePointersFeatures& toCheck, const char **missingFeature)
 {
-       const VkPhysicalDeviceShaderFloat16Int8Features& extensionFeatures = context.getShaderFloat16Int8Features();
-
-       if ((toCheck & EXTFLOAT16INT8FEATURES_FLOAT16) != 0 && extensionFeatures.shaderFloat16 == VK_FALSE)
-               return false;
+       const VkPhysicalDeviceVariablePointersFeatures& extensionFeatures = context.getVariablePointersFeatures();
 
-       if ((toCheck & EXTFLOAT16INT8FEATURES_INT8) != 0 && extensionFeatures.shaderInt8 == VK_FALSE)
-               return false;
+       IS_AVAIL("VariablePointers.", variablePointersStorageBuffer);
+       IS_AVAIL("VariablePointers.", variablePointers);
 
        return true;
 }
 
-bool isVulkanMemoryModelFeaturesSupported (const Context& context, ExtensionVulkanMemoryModelFeatures toCheck)
+bool isVulkanMemoryModelFeaturesSupported(const Context& context, const vk::VkPhysicalDeviceVulkanMemoryModelFeatures& toCheck, const char **missingFeature)
 {
        const VkPhysicalDeviceVulkanMemoryModelFeaturesKHR& extensionFeatures = context.getVulkanMemoryModelFeatures();
 
-       if ((toCheck & EXTVULKANMEMORYMODELFEATURES_ENABLE) != 0 && extensionFeatures.vulkanMemoryModel == VK_FALSE)
-               return false;
-
-       if ((toCheck & EXTVULKANMEMORYMODELFEATURES_DEVICESCOPE) != 0 && extensionFeatures.vulkanMemoryModelDeviceScope == VK_FALSE)
-               return false;
-
-       if ((toCheck & EXTVULKANMEMORYMODELFEATURES_AVAILABILITYVISIBILITYCHAINS) != 0 && extensionFeatures.vulkanMemoryModelAvailabilityVisibilityChains == VK_FALSE)
-               return false;
+       IS_AVAIL("VulkanMemoryModel.", vulkanMemoryModel);
+       IS_AVAIL("VulkanMemoryModel.", vulkanMemoryModelDeviceScope);
+       IS_AVAIL("VulkanMemoryModel.", vulkanMemoryModelAvailabilityVisibilityChains);
 
        return true;
 }
 
-bool isFloatControlsFeaturesSupported (const Context& context, const ExtensionFloatControlsFeatures& toCheck)
+#undef IS_AVAIL
+
+bool isFloatControlsFeaturesSupported (const Context& context, const vk::VkPhysicalDeviceFloatControlsProperties& toCheck, const char **missingFeature)
 {
        // if all flags are set to false then no float control features are actualy requested by the test
        if ((toCheck.shaderSignedZeroInfNanPreserveFloat16 ||
@@ -213,12 +195,14 @@ bool isFloatControlsFeaturesSupported (const Context& context, const ExtensionFl
                 toCheck.shaderRoundingModeRTZFloat64) == false)
                return true;
 
+       *missingFeature = "Float controls properties";
+
        // return false when float control features are requested and proper extension is not supported
        if (!context.isDeviceFunctionalitySupported("VK_KHR_shader_float_controls"))
                return false;
 
        // perform query to get supported float control properties
-       ExtensionFloatControlsFeatures refControls;
+   vk::VkPhysicalDeviceFloatControlsProperties refControls;
        {
                refControls.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR;
                refControls.pNext = DE_NULL;
@@ -271,6 +255,32 @@ bool isFloatControlsFeaturesSupported (const Context& context, const ExtensionFl
        return !requiredFeaturesNotSupported;
 }
 
+bool isVulkanFeaturesSupported(const Context& context, const VulkanFeatures& requested, const char **missingFeature)
+{
+       if (!isCoreFeaturesSupported(context, requested.coreFeatures, missingFeature))
+               return false;
+
+       if (!is8BitStorageFeaturesSupported(context, requested.ext8BitStorage, missingFeature))
+               return false;
+
+       if (!is16BitStorageFeaturesSupported(context, requested.ext16BitStorage, missingFeature))
+               return false;
+
+       if (!isVariablePointersFeaturesSupported(context, requested.extVariablePointers, missingFeature))
+               return false;
+
+       if (!isFloat16Int8FeaturesSupported(context, requested.extFloat16Int8, missingFeature))
+               return false;
+
+       if (!isVulkanMemoryModelFeaturesSupported(context, requested.extVulkanMemoryModel, missingFeature))
+               return false;
+
+       if (!isFloatControlsFeaturesSupported(context, requested.floatControlsProperties, missingFeature))
+               return false;
+
+       return true;
+}
+
 deUint32 getMinRequiredVulkanVersion (const SpirvVersion version)
 {
        switch(version)
index 41f7ed4..2c3aa01 100644 (file)
@@ -224,71 +224,34 @@ private:
        std::vector<size_t>             sizesBuffer;
 };
 
-enum Extension8BitStorageFeatureBits
-{
-       EXT8BITSTORAGEFEATURES_STORAGE_BUFFER                   = (1u << 1),
-       EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER   = (1u << 2),
-       EXT8BITSTORAGEFEATURES_PUSH_CONSTANT                    = (1u << 3),
-};
-typedef deUint32 Extension8BitStorageFeatures;
-
-enum Extension16BitStorageFeatureBits
-{
-       EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK    = (1u << 1),
-       EXT16BITSTORAGEFEATURES_UNIFORM                                 = (1u << 2),
-       EXT16BITSTORAGEFEATURES_PUSH_CONSTANT                   = (1u << 3),
-       EXT16BITSTORAGEFEATURES_INPUT_OUTPUT                    = (1u << 4),
-};
-typedef deUint32 Extension16BitStorageFeatures;
-
-enum ExtensionVariablePointersFeaturesBits
-{
-       EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER     = (1u << 1),
-       EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS                           = (1u << 2),
-};
-typedef deUint32 ExtensionVariablePointersFeatures;
-
-enum ExtensionFloat16Int8FeaturesBits
-{
-       EXTFLOAT16INT8FEATURES_FLOAT16  = (1u << 1),
-       EXTFLOAT16INT8FEATURES_INT8             = (1u << 2),
-};
-typedef deUint32 ExtensionFloat16Int8Features;
-typedef vk::VkPhysicalDeviceFloatControlsProperties ExtensionFloatControlsFeatures;
-
-enum ExtensionVulkanMemoryModelFeaturesBits
-{
-       EXTVULKANMEMORYMODELFEATURES_ENABLE                                                     = (1u << 1),
-       EXTVULKANMEMORYMODELFEATURES_DEVICESCOPE                                        = (1u << 2),
-       EXTVULKANMEMORYMODELFEATURES_AVAILABILITYVISIBILITYCHAINS       = (1u << 3),
-};
-typedef deUint32 ExtensionVulkanMemoryModelFeatures;
-
 struct VulkanFeatures
 {
-       vk::VkPhysicalDeviceFeatures            coreFeatures;
-       ExtensionFloat16Int8Features            extFloat16Int8;
-       Extension8BitStorageFeatures            ext8BitStorage;
-       Extension16BitStorageFeatures           ext16BitStorage;
-       ExtensionVariablePointersFeatures       extVariablePointers;
-       ExtensionVulkanMemoryModelFeatures      extVulkanMemoryModel;
-       ExtensionFloatControlsFeatures          floatControlsProperties;
-       vk::VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR extIntegerDotProduct;
+       vk::VkPhysicalDeviceFeatures                                                    coreFeatures;
+       vk::VkPhysicalDeviceShaderFloat16Int8Features                   extFloat16Int8;
+       vk::VkPhysicalDevice8BitStorageFeatures                                 ext8BitStorage;
+       vk::VkPhysicalDevice16BitStorageFeatures                                ext16BitStorage;
+       vk::VkPhysicalDeviceVariablePointersFeatures                    extVariablePointers;
+       vk::VkPhysicalDeviceVulkanMemoryModelFeatures                   extVulkanMemoryModel;
+       vk::VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR  extIntegerDotProduct;
+       vk::VkPhysicalDeviceFloatControlsProperties                             floatControlsProperties;
 
        VulkanFeatures                          (void)
-               : extFloat16Int8                (0)
-               , ext8BitStorage                (0)
-               , ext16BitStorage               (0)
-               , extVariablePointers   (0)
-               , extVulkanMemoryModel  (0)
        {
-               deMemset(&coreFeatures, 0, sizeof(coreFeatures));
-               deMemset(&floatControlsProperties, 0, sizeof(ExtensionFloatControlsFeatures));
+               deMemset(&coreFeatures,                         0, sizeof(coreFeatures));
+               deMemset(&extFloat16Int8,                       0, sizeof(vk::VkPhysicalDeviceShaderFloat16Int8Features));
+               deMemset(&ext8BitStorage,                       0, sizeof(vk::VkPhysicalDevice8BitStorageFeatures));
+               deMemset(&ext16BitStorage,                      0, sizeof(vk::VkPhysicalDevice16BitStorageFeatures));
+               deMemset(&extVariablePointers,          0, sizeof(vk::VkPhysicalDeviceVariablePointersFeatures));
+               deMemset(&extVulkanMemoryModel,         0, sizeof(vk::VkPhysicalDeviceVulkanMemoryModelFeatures));
+               deMemset(&floatControlsProperties,      0, sizeof(vk::VkPhysicalDeviceFloatControlsProperties));
                floatControlsProperties.denormBehaviorIndependence      = vk::VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR;
                floatControlsProperties.roundingModeIndependence        = vk::VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR;
        }
 };
 
+// Returns true if the whole VulkanFeatures is supported. If not, missingFeature will contain one feature that was missing.
+bool isVulkanFeaturesSupported(const Context& context, const VulkanFeatures& toCheck, const char** missingFeature);
+
 struct VariableLocation
 {
        deUint32 set;
@@ -301,34 +264,10 @@ struct VariableLocation
        std::string toDescription() const;
 };
 
-// Returns true if the given 8bit storage extension features in `toCheck` are all supported.
-bool is8BitStorageFeaturesSupported (const Context&                                            context,
-                                                                         Extension8BitStorageFeatures          toCheck);
-
-// Returns true if the given 16bit storage extension features in `toCheck` are all supported.
-bool isCoreFeaturesSupported (const Context&                                           context,
-                                                         const vk::VkPhysicalDeviceFeatures&   toCheck,
-                                                         const char**                                                  missingFeature);
-
-// Returns true if the given 16bit storage extension features in `toCheck` are all supported.
-bool is16BitStorageFeaturesSupported (const Context&                           context,
-                                                                         Extension16BitStorageFeatures toCheck);
-
-// Returns true if the given variable pointers extension features in `toCheck` are all supported.
-bool isVariablePointersFeaturesSupported (const Context&                                       context,
-                                                                                 ExtensionVariablePointersFeatures     toCheck);
-
-// Returns true if the given 16bit float/8bit int extension features in `toCheck` are all supported.
-bool isFloat16Int8FeaturesSupported (const Context&                                    context,
-                                                                        ExtensionFloat16Int8Features   toCheck);
-
-// Returns true if the given Vulkan Memory Model extension features in `toCheck` are all supported.
-bool isVulkanMemoryModelFeaturesSupported (const Context&                                              context,
-                                                                                  ExtensionVulkanMemoryModelFeatures   toCheck);
-
 // Returns true if the given float controls features in `toCheck` are all supported.
-bool isFloatControlsFeaturesSupported (const Context&                                                  context,
-                                                                          const ExtensionFloatControlsFeatures&        toCheck);
+bool isFloatControlsFeaturesSupported( const Context&                                                                          context,
+                                                                               const vk::VkPhysicalDeviceFloatControlsProperties&      toCheck,
+                                                                               const char**                                                                            missingFeature);
 
 deUint32 getMinRequiredVulkanVersion (const vk::SpirvVersion version);
 
index 805f9d8..1273ad1 100644 (file)
@@ -200,7 +200,7 @@ void addComputeVariableInitPrivateTest (tcu::TestCaseGroup* group)
                                                                                                          "                   OpStore %" + type + "_global_1 %" + type + "_1\n"
                                                                                                          "     %outputData = OpLoad %" + type + " %outputDataPtr\n";
 
-                               spec.requestedVulkanFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS;
+                               spec.requestedVulkanFeatures.extVariablePointers.variablePointers = true;
                                spec.extensions.push_back("VK_KHR_variable_pointers");
                                break;
                }
index dab28d5..c2a7d03 100644 (file)
@@ -366,16 +366,12 @@ void addPhysicalOrVariablePointersComputeGroup (tcu::TestCaseGroup* group, bool
                const string muxInput2                                  = isSingleInputBuffer   ? " %inloc_a_2i_plus_1 " : " %inloc_b_i ";
 
                // Set the proper extension features required for the test
-               if (physPtrs)
-               {
-                       requiredFeatures.extVariablePointers = 0;
-               }
-               else
+               if (!physPtrs)
                {
                        if (isSingleInputBuffer)
-                               requiredFeatures.extVariablePointers    = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+                               requiredFeatures.extVariablePointers.variablePointersStorageBuffer = true;
                        else
-                               requiredFeatures.extVariablePointers    = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS;
+                               requiredFeatures.extVariablePointers.variablePointers = true;
                }
 
                { // Variable Pointer Reads (using OpSelect)
@@ -958,16 +954,12 @@ void addComplexTypesPhysicalOrVariablePointersComputeGroup (tcu::TestCaseGroup*
        for (int isSingleInputBuffer = 0 ; isSingleInputBuffer < 2; ++isSingleInputBuffer)
        {
                // Set the proper extension features required for the test
-               if (physPtrs)
-               {
-                       requiredFeatures.extVariablePointers = 0;
-               }
-               else
+               if (!physPtrs)
                {
                        if (isSingleInputBuffer)
-                               requiredFeatures.extVariablePointers    = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+                               requiredFeatures.extVariablePointers.variablePointersStorageBuffer = true;
                        else
-                               requiredFeatures.extVariablePointers    = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS;
+                               requiredFeatures.extVariablePointers.variablePointers = true;
                }
 
                for (int selectInputA = 0; selectInputA < 2; ++selectInputA)
@@ -1274,7 +1266,7 @@ void addNullptrVariablePointersComputeGroup (tcu::TestCaseGroup* group)
        VulkanFeatures                                  requiredFeatures;
 
        // Requires the variable pointers feature.
-       requiredFeatures.extVariablePointers    = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS;
+       requiredFeatures.extVariablePointers.variablePointers = true;
 
        const string decorations (
                // Decorations
@@ -1587,9 +1579,9 @@ void addVariablePointersGraphicsGroup (tcu::TestCaseGroup* testGroup)
 
                // Set the proper extension features required for the test
                if (isSingleInputBuffer)
-                       requiredFeatures.extVariablePointers    = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+                       requiredFeatures.extVariablePointers.variablePointersStorageBuffer = true;
                else
-                       requiredFeatures.extVariablePointers    = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS;
+                       requiredFeatures.extVariablePointers.variablePointers = true;
 
                // All of the following tests write their results into an output SSBO, therefore they require the following features.
                requiredFeatures.coreFeatures.vertexPipelineStoresAndAtomics = DE_TRUE;
@@ -1820,7 +1812,7 @@ void addTwoInputBufferReadOnlyVariablePointersGraphicsGroup (tcu::TestCaseGroup*
        getDefaultColors(defaultColors);
 
        // Set the proper extension features required for the tests.
-       requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS;
+       requiredFeatures.extVariablePointers.variablePointers = true;
 
        // Set the required extension.
        extensions.push_back("VK_KHR_variable_pointers");
@@ -2218,7 +2210,7 @@ void addSingleInputBufferReadOnlyVariablePointersGraphicsGroup (tcu::TestCaseGro
 
        // Set the proper extension features required for the tests.
        // The following tests use variable pointers confined withing a single buffer.
-       requiredFeatures.extVariablePointers = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS_STORAGEBUFFER;
+       requiredFeatures.extVariablePointers.variablePointersStorageBuffer = true;
 
        // Set the required extension.
        extensions.push_back("VK_KHR_variable_pointers");
@@ -2651,7 +2643,7 @@ void addNullptrVariablePointersGraphicsGroup (tcu::TestCaseGroup* testGroup)
        extensions.push_back("VK_KHR_variable_pointers");
 
        // Requires the variable pointers feature.
-       requiredFeatures.extVariablePointers    = EXTVARIABLEPOINTERSFEATURES_VARIABLE_POINTERS;
+       requiredFeatures.extVariablePointers.variablePointers = true;
 
        fragments["capability"]         =       "OpCapability VariablePointers                                                  \n";
        fragments["extension"]          =       "OpExtension \"SPV_KHR_variable_pointers\"                              \n"
index 181e1cd..b3961d0 100644 (file)
@@ -335,8 +335,8 @@ void addComputeWorkgroupMemoryTests (tcu::TestCaseGroup* group)
                shaderSpec["extensions"]        = "OpExtension \"SPV_KHR_16bit_storage\"\n";
                shaderSpec["capabilities"]      = "OpCapability StorageUniformBufferBlock16\nOpCapability Float16\n";
 
-               features.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
-               features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_FLOAT16;
+               features.ext16BitStorage.storageBuffer16BitAccess = true;
+               features.extFloat16Int8.shaderFloat16 = true;
 
                vector<deFloat16>       inputData       = getFloat16s(rnd, numElements);
                vector<deFloat16>       outputData;
@@ -425,8 +425,8 @@ void addComputeWorkgroupMemoryTests (tcu::TestCaseGroup* group)
                shaderSpec["extensions"]        = "OpExtension \"SPV_KHR_16bit_storage\"\n";
                shaderSpec["capabilities"]      = "OpCapability Int16\n";
 
-               features.coreFeatures.shaderInt16 = VK_TRUE;
-               features.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               features.coreFeatures.shaderInt16 = true;
+               features.ext16BitStorage.storageBuffer16BitAccess = true;
 
                vector<deInt16>         inputData       = getInt16s(rnd, numElements);
                vector<deInt16>         outputData;
@@ -458,8 +458,8 @@ void addComputeWorkgroupMemoryTests (tcu::TestCaseGroup* group)
                shaderSpec["capabilities"]      = "OpCapability UniformAndStorageBuffer8BitAccess\nOpCapability Int8\n";
                shaderSpec["extensions"]        = "OpExtension \"SPV_KHR_8bit_storage\"\n";
 
-               features.ext8BitStorage = EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER;
-               features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_INT8;
+               features.ext8BitStorage.storageBuffer8BitAccess = true;
+               features.extFloat16Int8.shaderInt8 = true;
 
                vector<deInt8>          inputData       = getInt8s(rnd, numElements);
                vector<deInt8>          outputData;
@@ -555,8 +555,8 @@ void addComputeWorkgroupMemoryTests (tcu::TestCaseGroup* group)
                shaderSpec["capabilities"]      = "OpCapability Int16\n";
                shaderSpec["extensions"]        = "OpExtension \"SPV_KHR_16bit_storage\"\n";
 
-               features.coreFeatures.shaderInt16 = VK_TRUE;
-               features.ext16BitStorage = EXT16BITSTORAGEFEATURES_UNIFORM_BUFFER_BLOCK;
+               features.coreFeatures.shaderInt16 = true;
+               features.ext16BitStorage.storageBuffer16BitAccess = true;
 
                vector<deUint16>        inputData;
                vector<deUint16>        outputData;
@@ -592,8 +592,8 @@ void addComputeWorkgroupMemoryTests (tcu::TestCaseGroup* group)
                shaderSpec["capabilities"]      = "OpCapability UniformAndStorageBuffer8BitAccess\nOpCapability Int8\n";
                shaderSpec["extensions"]        = "OpExtension \"SPV_KHR_8bit_storage\"\n";
 
-               features.ext8BitStorage = EXT8BITSTORAGEFEATURES_UNIFORM_STORAGE_BUFFER;
-               features.extFloat16Int8 = EXTFLOAT16INT8FEATURES_INT8;
+               features.ext8BitStorage.storageBuffer8BitAccess = true;
+               features.extFloat16Int8.shaderInt8 = true;
 
                vector<deUint8>         inputData;
                vector<deUint8>         outputData;