From f310f426d09ba76fce72648d0a46aeaeaddefbf1 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 8 Feb 2022 17:26:46 +0100 Subject: [PATCH] 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 Reviewed-by: Thiago Macieira Reviewed-by: Qt CI Bot --- src/tools/qvkgen/qvkgen.cpp | 37 +++++++++++++++++-------------------- 1 file 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 &commands, return false; } - static const char *s = + static const char s[] = "%s\n" "#include \"qvulkanfunctions_p.h\"\n" "#include \"qvulkaninstance.h\"\n" "\n" +"#include \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 == 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 &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 == 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 &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 &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 &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());