Auto-generate knownConformanceVersions

gen_framework.py script now also generates
vkKnownConformanceVersions.inl . This file is
generated by grabing all git tags using
"git ls-remote -t" and then removing
from the list branches that were withdrawn.

Components: Framework

VK-GL-CTS issue: 1953

Affects: dEQP-VK.api.driver_properties.conformance_version

Change-Id: I29edb021049acc921b67c028d861b51cc0975e8f
(cherry picked from commit acbb6c6380b286d3b89a4079a6170c70b481d07e)
diff --git a/external/vulkancts/framework/vulkan/generated/vulkan/vkKnownConformanceVersions.inl b/external/vulkancts/framework/vulkan/generated/vulkan/vkKnownConformanceVersions.inl
new file mode 100644
index 0000000..f994332
--- /dev/null
+++ b/external/vulkancts/framework/vulkan/generated/vulkan/vkKnownConformanceVersions.inl
@@ -0,0 +1,25 @@
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ * This file was generated by /scripts/gen_framework.py
+ */
+
+static const VkConformanceVersion knownConformanceVersions[]
+{
+#ifndef CTS_USES_VULKANSC
+	makeConformanceVersion(1, 3, 6, 0),
+	makeConformanceVersion(1, 3, 5, 2),
+	makeConformanceVersion(1, 3, 5, 1),
+	makeConformanceVersion(1, 3, 5, 0),
+	makeConformanceVersion(1, 3, 4, 1),
+	makeConformanceVersion(1, 3, 4, 0),
+	makeConformanceVersion(1, 3, 3, 1),
+	makeConformanceVersion(1, 3, 3, 0),
+	makeConformanceVersion(1, 3, 2, 0),
+	makeConformanceVersion(1, 3, 1, 1),
+	makeConformanceVersion(1, 3, 1, 0),
+#else
+	makeConformanceVersion(1, 0, 1, 1),
+	makeConformanceVersion(1, 0, 1, 0),
+	makeConformanceVersion(1, 0, 0, 0),
+#endif // CTS_USES_VULKANSC
+};
diff --git a/external/vulkancts/framework/vulkan/generated/vulkansc/vkKnownConformanceVersions.inl b/external/vulkancts/framework/vulkan/generated/vulkansc/vkKnownConformanceVersions.inl
new file mode 100644
index 0000000..f994332
--- /dev/null
+++ b/external/vulkancts/framework/vulkan/generated/vulkansc/vkKnownConformanceVersions.inl
@@ -0,0 +1,25 @@
+/* WARNING: This is auto-generated file. Do not modify, since changes will
+ * be lost! Modify the generating script instead.
+ * This file was generated by /scripts/gen_framework.py
+ */
+
+static const VkConformanceVersion knownConformanceVersions[]
+{
+#ifndef CTS_USES_VULKANSC
+	makeConformanceVersion(1, 3, 6, 0),
+	makeConformanceVersion(1, 3, 5, 2),
+	makeConformanceVersion(1, 3, 5, 1),
+	makeConformanceVersion(1, 3, 5, 0),
+	makeConformanceVersion(1, 3, 4, 1),
+	makeConformanceVersion(1, 3, 4, 0),
+	makeConformanceVersion(1, 3, 3, 1),
+	makeConformanceVersion(1, 3, 3, 0),
+	makeConformanceVersion(1, 3, 2, 0),
+	makeConformanceVersion(1, 3, 1, 1),
+	makeConformanceVersion(1, 3, 1, 0),
+#else
+	makeConformanceVersion(1, 0, 1, 1),
+	makeConformanceVersion(1, 0, 1, 0),
+	makeConformanceVersion(1, 0, 0, 0),
+#endif // CTS_USES_VULKANSC
+};
diff --git a/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp
index 83319ce..7cfde11 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp
@@ -47,68 +47,6 @@
 	TEST_TYPE_VERSION,
 };
 
-static const VkConformanceVersion knownConformanceVersions[] =
-{
-#ifndef CTS_USES_VULKANSC
-	makeConformanceVersion(1, 3, 6, 0),
-	makeConformanceVersion(1, 3, 5, 2),
-	makeConformanceVersion(1, 3, 5, 1),
-	makeConformanceVersion(1, 3, 5, 0),
-	makeConformanceVersion(1, 3, 4, 1),
-	makeConformanceVersion(1, 3, 4, 0),
-	makeConformanceVersion(1, 3, 3, 1),
-	makeConformanceVersion(1, 3, 3, 0),
-	makeConformanceVersion(1, 3, 2, 0),
-	makeConformanceVersion(1, 3, 1, 1),
-	makeConformanceVersion(1, 3, 1, 0),
-	makeConformanceVersion(1, 3, 0, 0),
-	makeConformanceVersion(1, 2, 8, 0),
-	makeConformanceVersion(1, 2, 7, 2),
-	makeConformanceVersion(1, 2, 7, 1),
-	makeConformanceVersion(1, 2, 7, 0),
-	makeConformanceVersion(1, 2, 6, 2),
-	makeConformanceVersion(1, 2, 6, 1),
-	makeConformanceVersion(1, 2, 6, 0),
-	makeConformanceVersion(1, 2, 5, 2),
-	makeConformanceVersion(1, 2, 5, 1),
-	makeConformanceVersion(1, 2, 5, 0),
-	makeConformanceVersion(1, 2, 4, 1),
-	makeConformanceVersion(1, 2, 4, 0),
-	makeConformanceVersion(1, 2, 3, 3),
-	makeConformanceVersion(1, 2, 3, 2),
-	makeConformanceVersion(1, 2, 3, 1),
-	makeConformanceVersion(1, 2, 3, 0),
-	makeConformanceVersion(1, 2, 2, 2),
-	makeConformanceVersion(1, 2, 2, 1),
-	makeConformanceVersion(1, 2, 2, 0),
-	makeConformanceVersion(1, 2, 1, 2),
-	makeConformanceVersion(1, 2, 1, 1),
-	makeConformanceVersion(1, 2, 1, 0),
-	makeConformanceVersion(1, 2, 0, 2),
-	makeConformanceVersion(1, 2, 0, 1),
-	makeConformanceVersion(1, 2, 0, 0),
-	makeConformanceVersion(1, 1, 6, 3),
-	makeConformanceVersion(1, 1, 6, 2),
-	makeConformanceVersion(1, 1, 6, 1),
-	makeConformanceVersion(1, 1, 6, 0),
-	makeConformanceVersion(1, 1, 5, 2),
-	makeConformanceVersion(1, 1, 5, 1),
-	makeConformanceVersion(1, 1, 5, 0),
-	makeConformanceVersion(1, 1, 4, 3),
-	makeConformanceVersion(1, 1, 4, 2),
-	makeConformanceVersion(1, 1, 4, 1),
-	makeConformanceVersion(1, 1, 4, 0),
-	makeConformanceVersion(1, 1, 3, 3),
-	makeConformanceVersion(1, 1, 3, 2),
-	makeConformanceVersion(1, 1, 3, 1),
-	makeConformanceVersion(1, 1, 3, 0),
-#else
-	makeConformanceVersion(1, 0, 1, 1),
-	makeConformanceVersion(1, 0, 1, 0),
-	makeConformanceVersion(1, 0, 0, 0),
-#endif // CTS_USES_VULKANSC
-};
-
 DE_INLINE bool isNullTerminated(const char* str, const deUint32 maxSize)
 {
 	return deStrnlen(str, maxSize) < maxSize;
@@ -159,6 +97,9 @@
 
 void testVersion (const VkPhysicalDeviceDriverProperties& deviceDriverProperties, deUint32 usedApiVersion)
 {
+
+#include "vkKnownConformanceVersions.inl"
+
 	const deUint32 apiMajorVersion = VK_API_VERSION_MAJOR(usedApiVersion);
 	const deUint32 apiMinorVersion = VK_API_VERSION_MINOR(usedApiVersion);
 
diff --git a/external/vulkancts/scripts/gen_framework.py b/external/vulkancts/scripts/gen_framework.py
index 3d3f935..4c66d69 100755
--- a/external/vulkancts/scripts/gen_framework.py
+++ b/external/vulkancts/scripts/gen_framework.py
@@ -26,6 +26,7 @@
 import glob
 import json
 import argparse
+import datetime
 from lxml import etree
 
 scriptPath = os.path.join(os.path.dirname(__file__), "..", "..", "..", "scripts")
@@ -3560,6 +3561,52 @@
 
 	writeInlFile(filename, INL_HEADER, stream)
 
+def writeConformanceVersions(filename):
+    # get list of all vulkan/vulkansc tags from git
+	listOfTags = os.popen("git ls-remote -t").read()
+	vkMatches = re.findall("vulkan-cts-(\d).(\d).(\d).(\d)", listOfTags, re.M)
+	scMatches = re.findall("vulkansc-cts-(\d).(\d).(\d).(\d)", listOfTags, re.M)
+	if len(vkMatches) == 0 or len(scMatches) == 0:
+		return
+	# read all text files in doc folder and find withdrawn cts versions (branches)
+	withdrawnVkBranches = set()
+	withdrawnScBranches = set()
+	today = datetime.date.today()
+	for fileName in glob.glob(os.path.join(os.path.dirname(__file__), "..", "doc", "*.txt")):
+		if "withdrawal" not in fileName:
+			continue
+		fileContent	= readFile(fileName)
+        # get date when releases are withdrawn
+		match = re.search(r"(20\d\d)-(\d\d)-(\d\d).+ withdrawn", fileContent, re.IGNORECASE)
+		if match is not None:
+            # check if announcement refers to date in the past
+			if today > datetime.date(int(match[1]), int(match[2]), int(match[3])):
+				# get names of withdrawn branches
+				vkBranchMatches = re.findall("vulkan(\w\w)?-cts-(\d).(\d).(\d).(\d)", fileContent, re.M)
+				for v in vkBranchMatches:
+					selectedSet = withdrawnScBranches if v[0] == "sc" else withdrawnVkBranches
+					selectedSet.add((v[1], v[2], v[3], v[4]))
+	# define helper function that will be used to add entries for both vk and sc
+	def appendToStream(stream, versionsToAdd, maxWithdrawnVersion):
+		addedVersions = set()
+		for v in reversed(versionsToAdd):
+			# add only unique versions; ignore duplicates (e.g. with "-rc1", "-rc2" postfix);
+            # also add versions that are greater then maximal withdrawn version
+			if v in addedVersions or v <= maxWithdrawnVersion:
+				continue
+			addedVersions.add(v)
+			stream.append(f'\tmakeConformanceVersion({v[0]}, {v[1]}, {v[2]}, {v[3]}),')
+    # save array with versions
+	stream = ['static const VkConformanceVersion knownConformanceVersions[]',\
+			  '{',\
+			  '#ifndef CTS_USES_VULKANSC']
+	appendToStream(stream, vkMatches, max(withdrawnVkBranches))
+	stream.append('#else')
+	appendToStream(stream, scMatches, tuple('0'*4) if len(withdrawnScBranches) == 0 else max(withdrawnScBranches))
+	stream.append('#endif // CTS_USES_VULKANSC')
+	stream.append('};')
+	writeInlFile(filename, INL_HEADER, stream)
+
 def parseCmdLineArgs():
 	parser = argparse.ArgumentParser(description = "Generate Vulkan INL files",
 									 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
@@ -3651,6 +3698,7 @@
 	writeApiExtensionDependencyInfo			(api, os.path.join(outputPath, "vkApiExtensionDependencyInfo.inl"))
 	writeEntryPointValidation				(api, os.path.join(outputPath, "vkEntryPointValidation.inl"))
 	writeGetDeviceProcAddr					(api, os.path.join(outputPath, "vkGetDeviceProcAddr.inl"))
+	writeConformanceVersions                (     os.path.join(outputPath, "vkKnownConformanceVersions.inl"))
 
 	# NOTE: when new files are generated then they should also be added to the
 	# vk-gl-cts\external\vulkancts\framework\vulkan\CMakeLists.txt outputs list