Load/Save ShaderVariableBuffer::memberIndexes in one memcpy

ShaderVariableBuffer::memberIndexes is std::vector<unsigned int>, and
can be quite huge (164 on some programs in blade_and_soul_revolution).
Right now it is calling readInt for individual index and then push_back.
This causes vector to be copied as it grows size. This CL makes one
memcpy for entire vector and increase size only once.

Bug: b/275102061
Change-Id: I983ad289b126dbfd430cf94a3772c2bfd93cb1c6
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4775835
Reviewed-by: Roman Lavrov <romanl@google.com>
Commit-Queue: Charlie Lao <cclao@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
This commit is contained in:
Charlie Lao
2023-08-11 12:51:21 -07:00
committed by Angle LUCI CQ
parent 745023ef84
commit 61a5707f86

View File

@@ -451,9 +451,10 @@ void WriteShaderVariableBuffer(BinaryOutputStream *stream, const ShaderVariableB
stream->writeInt(var.dataSize);
stream->writeInt(var.memberIndexes.size());
for (unsigned int memberCounterIndex : var.memberIndexes)
if (!var.memberIndexes.empty())
{
stream->writeInt(memberCounterIndex);
stream->writeBytes(reinterpret_cast<const unsigned char *>(var.memberIndexes.data()),
sizeof(*var.memberIndexes.data()) * var.memberIndexes.size());
}
}
@@ -464,10 +465,13 @@ void LoadShaderVariableBuffer(BinaryInputStream *stream, ShaderVariableBuffer *v
var->binding = stream->readInt<int>();
var->dataSize = stream->readInt<unsigned int>();
ASSERT(var->memberIndexes.empty());
size_t numMembers = stream->readInt<size_t>();
for (size_t blockMemberIndex = 0; blockMemberIndex < numMembers; blockMemberIndex++)
if (numMembers > 0)
{
var->memberIndexes.push_back(stream->readInt<unsigned int>());
var->memberIndexes.resize(numMembers);
stream->readBytes(reinterpret_cast<unsigned char *>(var->memberIndexes.data()),
sizeof(unsigned int) * var->memberIndexes.size());
}
}