From 15cbeef054fefb16aacd1e5327f1fa0286c569c2 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 8 Feb 2021 12:26:13 +0000 Subject: [PATCH] Fix offset calculation with declaring nested buffers in format string * When calculating the size for a struct member we need to properly recurse --- qrenderdoc/Code/BufferFormatter.cpp | 36 ++++++++++++++++++----------- qrenderdoc/Code/QRDUtils.h | 3 +++ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/qrenderdoc/Code/BufferFormatter.cpp b/qrenderdoc/Code/BufferFormatter.cpp index 7fa7ab066..2991a009a 100644 --- a/qrenderdoc/Code/BufferFormatter.cpp +++ b/qrenderdoc/Code/BufferFormatter.cpp @@ -772,12 +772,33 @@ uint32_t BufferFormatter::GetVarSize(const ShaderConstant &var) size = var.type.descriptor.matrixByteStride * var.type.descriptor.columns; } + if(!var.type.members.empty()) + size = GetStructVarSize(var.type.members); + if(var.type.descriptor.elements > 1) size *= var.type.descriptor.elements; return size; } +uint32_t BufferFormatter::GetStructVarSize(const rdcarray &members) +{ + uint32_t lastMemberStart = 0; + + const ShaderConstant *lastChild = &members.back(); + + lastMemberStart += lastChild->byteOffset; + while(!lastChild->type.members.isEmpty()) + { + lastMemberStart += (qMax(lastChild->type.descriptor.elements, 1U) - 1) * + lastChild->type.descriptor.arrayByteStride; + lastChild = &lastChild->type.members.back(); + lastMemberStart += lastChild->byteOffset; + } + + return lastMemberStart + GetVarSize(*lastChild); +} + QString BufferFormatter::DeclarePaddingBytes(uint32_t bytes) { if(bytes == 0) @@ -922,20 +943,7 @@ QString BufferFormatter::DeclareStruct(QList &declaredStructs, const QS if(requiredByteStride > 0) { - uint32_t lastMemberStart = 0; - - const ShaderConstant *lastChild = &members.back(); - - lastMemberStart += lastChild->byteOffset; - while(!lastChild->type.members.isEmpty()) - { - lastMemberStart += (qMax(lastChild->type.descriptor.elements, 1U) - 1) * - lastChild->type.descriptor.arrayByteStride; - lastChild = &lastChild->type.members.back(); - lastMemberStart += lastChild->byteOffset; - } - - const uint32_t structEnd = lastMemberStart + GetVarSize(*lastChild); + const uint32_t structEnd = GetStructVarSize(members); if(requiredByteStride > structEnd) ret += lit(" ") + DeclarePaddingBytes(requiredByteStride - structEnd); diff --git a/qrenderdoc/Code/QRDUtils.h b/qrenderdoc/Code/QRDUtils.h index b2cffe307..0f1010cca 100644 --- a/qrenderdoc/Code/QRDUtils.h +++ b/qrenderdoc/Code/QRDUtils.h @@ -101,6 +101,9 @@ public: static QString DeclareStruct(const QString &name, const rdcarray &members, uint32_t requiredByteStride); + + static uint32_t GetStructVarSize(const rdcarray &members); + static QString DeclarePaddingBytes(uint32_t bytes); };