summaryrefslogtreecommitdiffstats
path: root/src/tools/qvkgen/qvkgen.cpp
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2022-02-08 17:26:46 +0100
committerMarc Mutz <marc.mutz@qt.io>2022-02-16 16:49:16 +0100
commitf310f426d09ba76fce72648d0a46aeaeaddefbf1 (patch)
tree52064090e8ceeee3f3e32a7ef23afa0f5c9b38cb /src/tools/qvkgen/qvkgen.cpp
parent58173027b374146e9de16c84b9fe83101884a360 (diff)
qvkgen: optimize generated string tables
Use qOffsetStringArray instead of array-of-const-char* to hold strings. Saves 174 relocations, as well as over 4KiB in combined TEXT and DATA size on optimized Linux GCC 11.2 C++20 AMD64 builds. Pick-to: 6.3 Task-number: QTBUG-100536 Change-Id: I5849168d0340f78664e566920f92ad136f9dc435 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/tools/qvkgen/qvkgen.cpp')
-rw-r--r--src/tools/qvkgen/qvkgen.cpp37
1 files changed, 17 insertions, 20 deletions
diff --git a/src/tools/qvkgen/qvkgen.cpp b/src/tools/qvkgen/qvkgen.cpp
index 798cbb7932..8b59d8880c 100644
--- a/src/tools/qvkgen/qvkgen.cpp
+++ b/src/tools/qvkgen/qvkgen.cpp
@@ -509,22 +509,25 @@ bool genVulkanFunctionsPC(const QList<VkSpecParser::Command> &commands,
return false;
}
- static const char *s =
+ static const char s[] =
"%s\n"
"#include \"qvulkanfunctions_p.h\"\n"
"#include \"qvulkaninstance.h\"\n"
"\n"
+"#include <QtCore/private/qoffsetstringarray_p.h>\n"
+"\n"
"QT_BEGIN_NAMESPACE\n"
"\n%s"
"QVulkanFunctionsPrivate::QVulkanFunctionsPrivate(QVulkanInstance *inst)\n"
"{\n"
-" static const char *funcNames[] = {\n"
+" static constexpr auto funcNames = qOffsetStringArray(\n"
"%s\n"
-" };\n"
-" for (int i = 0; i < %d; ++i) {\n"
-" m_funcs[i] = inst->getInstanceProcAddr(funcNames[i]);\n"
+" );\n"
+" static_assert(std::extent_v<decltype(m_funcs)> == size_t(funcNames.count()));\n"
+" for (int i = 0; i < funcNames.count(); ++i) {\n"
+" m_funcs[i] = inst->getInstanceProcAddr(funcNames.at(i));\n"
" if (i < %d && !m_funcs[i])\n"
-" qWarning(\"QVulkanFunctions: Failed to resolve %%s\", funcNames[i]);\n"
+" qWarning(\"QVulkanFunctions: Failed to resolve %%s\", funcNames.at(i));\n"
" }\n"
"}\n"
"\n%s"
@@ -532,13 +535,14 @@ bool genVulkanFunctionsPC(const QList<VkSpecParser::Command> &commands,
"{\n"
" QVulkanFunctions *f = inst->functions();\n"
" Q_ASSERT(f);\n\n"
-" static const char *funcNames[] = {\n"
+" static constexpr auto funcNames = qOffsetStringArray(\n"
"%s\n"
-" };\n"
-" for (int i = 0; i < %d; ++i) {\n"
-" m_funcs[i] = f->vkGetDeviceProcAddr(device, funcNames[i]);\n"
+" );\n"
+" static_assert(std::extent_v<decltype(m_funcs)> == size_t(funcNames.count()));\n"
+" for (int i = 0; i < funcNames.count(); ++i) {\n"
+" m_funcs[i] = f->vkGetDeviceProcAddr(device, funcNames.at(i));\n"
" if (i < %d && !m_funcs[i])\n"
-" qWarning(\"QVulkanDeviceFunctions: Failed to resolve %%s\", funcNames[i]);\n"
+" qWarning(\"QVulkanDeviceFunctions: Failed to resolve %%s\", funcNames.at(i));\n"
" }\n"
"}\n"
"\n"
@@ -547,9 +551,7 @@ bool genVulkanFunctionsPC(const QList<VkSpecParser::Command> &commands,
QString devCmdWrapperStr;
QString instCmdWrapperStr;
int devIdx = 0;
- int devCount = 0;
int instIdx = 0;
- int instCount = 0;
QString devCmdNamesStr;
QString instCmdNamesStr;
int vulkan10DevCount = 0;
@@ -575,11 +577,6 @@ bool genVulkanFunctionsPC(const QList<VkSpecParser::Command> &commands,
*dst += QStringLiteral(" \"");
*dst += c.cmd.name;
*dst += QStringLiteral("\",\n");
-
- if (c.deviceLevel)
- devCount += 1;
- else
- instCount += 1;
}
if (version == QStringLiteral("VK_VERSION_1_0")) {
vulkan10InstCount = instIdx;
@@ -597,9 +594,9 @@ bool genVulkanFunctionsPC(const QList<VkSpecParser::Command> &commands,
const QString str =
QString::asprintf(s, preamble.get(licHeaderFn).constData(),
instCmdWrapperStr.toUtf8().constData(),
- instCmdNamesStr.toUtf8().constData(), instCount, vulkan10InstCount,
+ instCmdNamesStr.toUtf8().constData(), vulkan10InstCount,
devCmdWrapperStr.toUtf8().constData(),
- devCmdNamesStr.toUtf8().constData(), devCount, vulkan10DevCount);
+ devCmdNamesStr.toUtf8().constData(), vulkan10DevCount);
f.write(str.toUtf8());