From 865fd9e5774fc778ac72c0e80d2637ab9af603ae Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 4 Aug 2026 23:15:06 +1000 Subject: [PATCH] StateWrapper: Save contiguous FIFOQueue bytes in one memcpy() Faster, yay. --- src/util/state_wrapper.h | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/util/state_wrapper.h b/src/util/state_wrapper.h index f7de3c8f1..e41882c06 100644 --- a/src/util/state_wrapper.h +++ b/src/util/state_wrapper.h @@ -146,10 +146,30 @@ public: } else { - for (u32 i = 0; i < size; i++) + if (size == 0) + return; + if ((m_error = (m_error || ((m_size - m_pos) < (size * sizeof(T)))))) [[unlikely]] + return; + + if constexpr (std::is_standard_layout_v && std::is_trivial_v) + { + const u32 contig_size = data->GetContiguousSize(); + if (contig_size > 0) + { + const u32 contig_bytes = contig_size * sizeof(T); + std::memcpy(&m_data[m_pos], data->GetReadPointer(), contig_bytes); + m_pos += contig_bytes; + } + for (u32 i = contig_size; i < size; i++) + { + std::memcpy(&m_data[m_pos], &data->Peek(i), sizeof(T)); + m_pos += sizeof(T); + } + } + else { - T temp(data->Peek(i)); - Do(&temp); + for (u32 i = 0; i < size; i++) + Do(const_cast(&data->Peek(i))); } } }