Enable extended_dynamic_state tests for VK1.3

The partial promotion of the 2 extended dynamic state extensions meant
that the tests were not being run on VK 1.3 core if the extension was
not also exposed.

This change has the tests checkSupport always based off the feature
struct, with the framework extended to fill in the extension features on
core implementations. This is consistent with how unsupported extensions
are normally handled (the framework fills in an empty feature struct, so
they can always be used to determine test support).

Components: Vulkan, Framework
VK-GL-CTS issue: 3937
Affects: dEQP-VK.pipeline.*.extended_dynamic_state.*

Change-Id: Ifc3e821a50e55e54cc0bbd938d2080e526a7b55f
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeatures.cpp b/external/vulkancts/framework/vulkan/vkDeviceFeatures.cpp
index 6f7794f..903ea23 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeatures.cpp
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeatures.cpp
@@ -144,6 +144,32 @@
 					}
 					m_features.push_back(p);
 				}
+				else
+				{
+#ifndef CTS_USES_VULKANSC
+					// Some non-standard promotions may need feature structs filled in anyway.
+					if (!strcmp(featureName, "VK_EXT_extended_dynamic_state") && vk13Supported)
+					{
+						FeatureStructWrapperBase *p = (*featureStructCreationData.creatorFunction)();
+						if (p == DE_NULL)
+							continue;
+
+						auto f = reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *>(p->getFeatureTypeRaw());
+						f->extendedDynamicState = true;
+						m_features.push_back(p);
+					}
+					if (!strcmp(featureName, "VK_EXT_extended_dynamic_state2") && vk13Supported)
+					{
+						FeatureStructWrapperBase *p = (*featureStructCreationData.creatorFunction)();
+						if (p == DE_NULL)
+							continue;
+
+						auto f = reinterpret_cast<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *>(p->getFeatureTypeRaw());
+						f->extendedDynamicState2 = true;
+						m_features.push_back(p);
+					}
+#endif	// CTS_USES_VULKANSC
+				}
 			}
 
 			vki.getPhysicalDeviceFeatures2(physicalDevice, &m_coreFeatures2);
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp
index ed1d83c..3398476 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp
@@ -1075,43 +1075,33 @@
 		return dynamicStates;
 	}
 
-	// Returns the list of extensions needed by this config.
-	std::vector<std::string> getRequiredExtensions () const
+	bool testEDS() const
 	{
-		std::vector<std::string> extensions;
+		return (cullModeConfig.dynamicValue
+			|| frontFaceConfig.dynamicValue
+			|| topologyConfig.dynamicValue
+			|| viewportConfig.dynamicValue
+			|| scissorConfig.dynamicValue
+			|| strideConfig.dynamicValue
+			|| depthTestEnableConfig.dynamicValue
+			|| depthWriteEnableConfig.dynamicValue
+			|| depthCompareOpConfig.dynamicValue
+			|| depthBoundsTestEnableConfig.dynamicValue
+			|| stencilTestEnableConfig.dynamicValue
+			|| stencilOpConfig.dynamicValue);
+	}
 
-		if (cullModeConfig.dynamicValue
-		    || frontFaceConfig.dynamicValue
-		    || topologyConfig.dynamicValue
-		    || viewportConfig.dynamicValue
-		    || scissorConfig.dynamicValue
-		    || strideConfig.dynamicValue
-		    || depthTestEnableConfig.dynamicValue
-		    || depthWriteEnableConfig.dynamicValue
-		    || depthCompareOpConfig.dynamicValue
-		    || depthBoundsTestEnableConfig.dynamicValue
-		    || stencilTestEnableConfig.dynamicValue
-		    || stencilOpConfig.dynamicValue)
-		{
-			extensions.push_back("VK_EXT_extended_dynamic_state");
-		}
+	bool testEDS2() const
+	{
+		return (rastDiscardEnableConfig.dynamicValue
+			|| depthBiasEnableConfig.dynamicValue
+			|| primRestartEnableConfig.dynamicValue
+			|| useExtraDynPCPPipeline);
+	}
 
-		if (vertexGenerator.dynamicValue)
-		{
-			extensions.push_back("VK_EXT_vertex_input_dynamic_state");
-		}
-
-		if (patchControlPointsConfig.dynamicValue
-		    || rastDiscardEnableConfig.dynamicValue
-		    || depthBiasEnableConfig.dynamicValue
-		    || logicOpConfig.dynamicValue
-		    || primRestartEnableConfig.dynamicValue
-			|| useExtraDynPCPPipeline)
-		{
-			extensions.push_back("VK_EXT_extended_dynamic_state2");
-		}
-
-		return extensions;
+	bool testVertexDynamic() const
+	{
+		return static_cast<bool>(vertexGenerator.dynamicValue);
 	}
 
 private:
@@ -1200,22 +1190,25 @@
 	const auto&	vki				= context.getInstanceInterface();
 	const auto	physicalDevice	= context.getPhysicalDevice();
 
-	// Check extension support.
-	const auto requiredExtensions = m_testConfig.getRequiredExtensions();
-	for (const auto& extension : requiredExtensions)
-		context.requireDeviceFunctionality(extension);
+	// Check feature support.
+	const auto& edsFeatures = context.getExtendedDynamicStateFeaturesEXT();
+	const auto& eds2Features = context.getExtendedDynamicState2FeaturesEXT();
+	const auto& viFeatures = context.getVertexInputDynamicStateFeaturesEXT();
 
-	// Needed for extended state included as part of VK_EXT_extended_dynamic_state2.
-	if (de::contains(begin(requiredExtensions), end(requiredExtensions), "VK_EXT_extended_dynamic_state2"))
-	{
-		const auto& eds2Features = context.getExtendedDynamicState2FeaturesEXT();
+	if (m_testConfig.testEDS() && !edsFeatures.extendedDynamicState)
+		TCU_THROW(NotSupportedError, "extendedDynamicState is not supported");
 
-		if (m_testConfig.testLogicOp() && !eds2Features.extendedDynamicState2LogicOp)
-			TCU_THROW(NotSupportedError, "VK_EXT_extended_dynamic_state2 : changing LogicOp dynamically is not supported");
+	if (m_testConfig.testEDS2() && !eds2Features.extendedDynamicState2)
+		TCU_THROW(NotSupportedError, "extendedDynamicState2 is not supported");
 
-		if ((m_testConfig.testPatchControlPoints() || m_testConfig.useExtraDynPCPPipeline) && !eds2Features.extendedDynamicState2PatchControlPoints)
-			TCU_THROW(NotSupportedError, "VK_EXT_extended_dynamic_state2 : changing patch control points dynamically is not supported");
-	}
+	if (m_testConfig.testLogicOp() && !eds2Features.extendedDynamicState2LogicOp)
+		TCU_THROW(NotSupportedError, "extendedDynamicState2LogicOp is not supported");
+
+	if ((m_testConfig.testPatchControlPoints() || m_testConfig.useExtraDynPCPPipeline) && !eds2Features.extendedDynamicState2PatchControlPoints)
+		TCU_THROW(NotSupportedError, "extendedDynamicState2PatchControlPoints is not supported");
+
+	if (m_testConfig.testVertexDynamic() && !viFeatures.vertexInputDynamicState)
+		TCU_THROW(NotSupportedError, "vertexInputDynamicState is not supported");
 
 	// Check the number of viewports needed and the corresponding limits.
 	const auto&	viewportConfig	= m_testConfig.viewportConfig;