From cef5aa857b95c46e93c0ab1ee106f05d07daa18d Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 20 May 2022 12:30:41 +0100 Subject: [PATCH] Avoid declaring redundant structs for anonymous GL structs --- qrenderdoc/Code/BufferFormatter.cpp | 35 +++++++++++++++++++++-------- qrenderdoc/Code/QRDUtils.h | 5 +++-- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/qrenderdoc/Code/BufferFormatter.cpp b/qrenderdoc/Code/BufferFormatter.cpp index e2a231872..0d18025ba 100644 --- a/qrenderdoc/Code/BufferFormatter.cpp +++ b/qrenderdoc/Code/BufferFormatter.cpp @@ -2231,7 +2231,9 @@ QString BufferFormatter::GetBufferFormatString(Packing::Rules pack, const Shader structName = lit("el"); QList declaredStructs; - format = DeclareStruct(pack, declaredStructs, structName, res.variableType.members, 0, QString()); + QMap anonStructs; + format = DeclareStruct(pack, declaredStructs, anonStructs, structName, res.variableType.members, + 0, QString()); format = QFormatStr("%1\n\n%2\n\n%3 buffer[];").arg(DeclarePacking(pack)).arg(format).arg(structName); } @@ -2472,6 +2474,7 @@ uint32_t BufferFormatter::GetUnpaddedStructAdvance(Packing::Rules pack, } QString BufferFormatter::DeclareStruct(Packing::Rules pack, QList &declaredStructs, + QMap &anonStructs, const QString &name, const rdcarray &members, uint32_t requiredByteStride, QString innerSkippedPrefixString) { @@ -2544,8 +2547,8 @@ QString BufferFormatter::DeclareStruct(Packing::Rules pack, QList &decl if(!declaredStructs.contains(varTypeName)) { declaredStructs.push_back(varTypeName); - declarations += DeclareStruct(pack, declaredStructs, varTypeName, pointeeType.members, - pointeeType.arrayByteStride, QString()) + + declarations += DeclareStruct(pack, declaredStructs, anonStructs, varTypeName, + pointeeType.members, pointeeType.arrayByteStride, QString()) + lit("\n"); } @@ -2557,7 +2560,19 @@ QString BufferFormatter::DeclareStruct(Packing::Rules pack, QList &decl // structs get duplicated if they're used in multiple places, but not much we can do about // that. if(varTypeName.isEmpty() || varTypeName == lit("struct")) - varTypeName = lit("anon%1").arg(declaredStructs.size()); + { + ShaderConstant key; + key.type.members = members[i].type.members; + + if(anonStructs.contains(key)) + { + varTypeName = anonStructs[key]; + } + else + { + varTypeName = anonStructs[key] = lit("struct%1").arg(anonStructs.size() + 1); + } + } varTypeName = varTypeName.replace(QLatin1Char('['), QLatin1Char('_')).replace(QLatin1Char(']'), QString()); @@ -2565,9 +2580,10 @@ QString BufferFormatter::DeclareStruct(Packing::Rules pack, QList &decl if(!declaredStructs.contains(varTypeName)) { declaredStructs.push_back(varTypeName); - declarations += DeclareStruct(pack, declaredStructs, varTypeName, members[i].type.members, - members[i].type.arrayByteStride, QString()) + - lit("\n"); + declarations += + DeclareStruct(pack, declaredStructs, anonStructs, varTypeName, members[i].type.members, + members[i].type.arrayByteStride, QString()) + + lit("\n"); } } @@ -2631,8 +2647,9 @@ QString BufferFormatter::DeclareStruct(Packing::Rules pack, const QString &name, uint32_t requiredByteStride) { QList declaredStructs; - QString structDef = - DeclareStruct(pack, declaredStructs, name, members, requiredByteStride, QString()); + QMap anonStructs; + QString structDef = DeclareStruct(pack, declaredStructs, anonStructs, name, members, + requiredByteStride, QString()); return QFormatStr("%1\n\n%2").arg(DeclarePacking(pack)).arg(structDef); } diff --git a/qrenderdoc/Code/QRDUtils.h b/qrenderdoc/Code/QRDUtils.h index 8c12cefad..6b05a9da0 100644 --- a/qrenderdoc/Code/QRDUtils.h +++ b/qrenderdoc/Code/QRDUtils.h @@ -204,8 +204,9 @@ private: rdcpair *found = NULL); static QString DeclareStruct(Packing::Rules pack, QList &declaredStructs, - const QString &name, const rdcarray &members, - uint32_t requiredByteStride, QString innerSkippedPrefixString); + QMap &anonStructs, const QString &name, + const rdcarray &members, uint32_t requiredByteStride, + QString innerSkippedPrefixString); static uint32_t GetAlignment(Packing::Rules pack, const ShaderConstant &constant); static uint32_t GetUnpaddedStructAdvance(Packing::Rules pack,