From 7bad9214a861debbda0f48c9eea965eb5d2faf42 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Fri, 26 Aug 2022 11:51:03 +0200 Subject: [PATCH] Export correct range for binary dumps as well. --- qrenderdoc/Windows/BufferViewer.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/qrenderdoc/Windows/BufferViewer.cpp b/qrenderdoc/Windows/BufferViewer.cpp index 377a7d544..f3a03013b 100644 --- a/qrenderdoc/Windows/BufferViewer.cpp +++ b/qrenderdoc/Windows/BufferViewer.cpp @@ -5312,15 +5312,19 @@ void BufferViewer::exportData(const BufferExport ¶ms) // in memory. ResourceId buff = m_BufferID; - static const uint64_t chunkSize = 4 * 1024 * 1024; - for(uint64_t byteOffset = m_ByteOffset; byteOffset < m_ObjectByteSize; - byteOffset += chunkSize) + static const uint64_t maxChunkSize = 4 * 1024 * 1024; + const uint64_t byteEnd = + std::min(m_ObjectByteSize, m_ByteOffset + config.buffers[0]->size()); + + for(uint64_t byteOffset = m_ByteOffset; byteOffset < byteEnd;) { + const uint64_t chunkSize = std::min(byteEnd - byteOffset, maxChunkSize); // it's fine to block invoke, because this is on the export thread - m_Ctx.Replay().BlockInvoke([buff, f, byteOffset](IReplayController *r) { + m_Ctx.Replay().BlockInvoke([buff, f, byteOffset, chunkSize](IReplayController *r) { bytebuf chunk = r->GetBufferData(buff, byteOffset, chunkSize); f->write((const char *)chunk.data(), (qint64)chunk.size()); }); + byteOffset += chunkSize; } } }