Expose the Vulkan 1.4 core API

Non-trivial update this time. Recent vk.xml adds the option of listing
"vulkiansc" in the api attribute, which we did not handle before in
qvkgen for command elements at all, and was not treated as a
comma-separated list for feature elements. Fix these up.

Also add 1.4 in QVulkanDefaultInstance, so that 1.4 goes into
VkApplicationInfo.apiVersion, when available, incl. in Qt Quick.

[ChangeLog][QtGui] QVulkanFunctions and QVulkanDeviceFunctions are
updated to expose the Vulkan 1.4 API as long as Qt is built against
Vulkan 1.4 headers.

[ChangeLog][Third-Party Code] Updated vk.xml to 1.4.308.

Change-Id: I8bc4bb578575bcbb189286a26617cd0052241be5
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
Laszlo Agocs 2025-02-14 13:16:26 +01:00 committed by Laszlo Agocs
parent 53fb13456f
commit ff7dfd7216
4 changed files with 10613 additions and 2106 deletions

View File

@ -8,12 +8,12 @@
"Files": "vk.xml",
"Homepage": "https://www.khronos.org/",
"PURL": "pkg:github/KhronosGroup/Vulkan-Docs@v$<VERSION>?download_url=https://github.com/KhronosGroup/Vulkan-Docs/blob/v1.3.223/xml/vk.xml",
"CPE": "cpe:2.3:a:khronos:vulkan:1.3.223:*:*:*:*:*:*:*",
"Version": "1.3.223",
"PURL": "pkg:github/KhronosGroup/Vulkan-Docs@v$<VERSION>?download_url=https://github.com/KhronosGroup/Vulkan-Docs/blob/v1.4.308/xml/vk.xml",
"CPE": "cpe:2.3:a:khronos:vulkan:1.4.308:*:*:*:*:*:*:*",
"Version": "1.4.308",
"License": "Apache License 2.0 or MIT License",
"LicenseId": "Apache-2.0 OR MIT",
"LicenseFile": "LICENSE.txt",
"Copyright": "Copyright (c) 2015-2022 The Khronos Group Inc."
"Copyright": "Copyright (c) 2015-2025 The Khronos Group Inc."
}
]

View File

@ -38,8 +38,8 @@ QVulkanInstance *QVulkanDefaultInstance::instance()
s_vulkanInstance = new QVulkanInstance;
// With a Vulkan implementation >= 1.1 we can check what
// vkEnumerateInstanceVersion() says and request 1.3/1.2/1.1 based on the
// result. To prevent future surprises, be conservative and ignore any > 1.3
// vkEnumerateInstanceVersion() says and request 1.4-1.1 based on the
// result. To prevent future surprises, be conservative and ignore any > 1.4
// versions for now. For 1.0 implementations nothing will be requested, the
// default 0 in VkApplicationInfo means 1.0.
//
@ -54,7 +54,9 @@ QVulkanInstance *QVulkanDefaultInstance::instance()
// be able to make an appropriate setApiVersion() call on it.
const QVersionNumber supportedVersion = s_vulkanInstance->supportedApiVersion();
if (supportedVersion >= QVersionNumber(1, 3))
if (supportedVersion >= QVersionNumber(1, 4))
s_vulkanInstance->setApiVersion(QVersionNumber(1, 4));
else if (supportedVersion >= QVersionNumber(1, 3))
s_vulkanInstance->setApiVersion(QVersionNumber(1, 3));
else if (supportedVersion >= QVersionNumber(1, 2))
s_vulkanInstance->setApiVersion(QVersionNumber(1, 2));

File diff suppressed because it is too large Load Diff

View File

@ -13,7 +13,8 @@ static const QStringList VERSIONS = {
QStringLiteral("VK_VERSION_1_0"), // must be the first and always present
QStringLiteral("VK_VERSION_1_1"),
QStringLiteral("VK_VERSION_1_2"),
QStringLiteral("VK_VERSION_1_3")
QStringLiteral("VK_VERSION_1_3"),
QStringLiteral("VK_VERSION_1_4")
};
class VkSpecParser
@ -102,7 +103,7 @@ void VkSpecParser::parseFeature()
else if (attr.name() == QStringLiteral("name"))
versionName = attr.value().toString().trimmed();
}
const bool isVulkan = api == QStringLiteral("vulkan");
const bool isVulkan = api.split(',').contains(QStringLiteral("vulkan"));
while (!m_reader.atEnd()) {
m_reader.readNext();
@ -144,7 +145,7 @@ void VkSpecParser::parseCommands()
return;
if (m_reader.isStartElement() && m_reader.name() == QStringLiteral("command")) {
const Command c = parseCommand();
if (!c.cmd.name.isEmpty()) // skip aliases
if (!c.cmd.name.isEmpty()) // skip aliases and commands for another api
m_commands.append(c);
}
}
@ -160,6 +161,17 @@ VkSpecParser::Command VkSpecParser::parseCommand()
// <param optional="true">const <type>VkAllocationCallbacks</type>* <name>pAllocator</name></param>
// <param><type>VkInstance</type>* <name>pInstance</name></param>
QString api;
for (const QXmlStreamAttribute &attr : m_reader.attributes()) {
if (attr.name() == QStringLiteral("api"))
api = attr.value().toString().trimmed();
}
// skip commands with api="vulkansc", but the api attribute is optional
if (!api.isEmpty() && !api.split(',').contains(QStringLiteral("vulkan"))) {
skip();
return c;
}
while (!m_reader.atEnd()) {
m_reader.readNext();
if (m_reader.isEndElement() && m_reader.name() == QStringLiteral("command"))