From ba5208efaa4676c1ee0ce199074f74d6fdceb22b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 14 Mar 2018 00:06:38 +0100 Subject: [PATCH] GL: Fix bug where we could crash if a readback happened at the same time as a buffer expansion. --- ext/native/thin3d/GLRenderManager.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ext/native/thin3d/GLRenderManager.cpp b/ext/native/thin3d/GLRenderManager.cpp index 31e571c295..d5f648b86a 100644 --- a/ext/native/thin3d/GLRenderManager.cpp +++ b/ext/native/thin3d/GLRenderManager.cpp @@ -455,15 +455,18 @@ void GLRenderManager::Run(int frame) { BeginSubmitFrame(frame); FrameData &frameData = frameData_[frame]; - for (auto iter : frameData.activePushBuffers) { - iter->Flush(); - iter->UnmapDevice(); - } auto &stepsOnThread = frameData_[frame].steps; auto &initStepsOnThread = frameData_[frame].initSteps; // queueRunner_.LogSteps(stepsOnThread); queueRunner_.RunInitSteps(initStepsOnThread); + + // Run this after RunInitSteps so any fresh GLRBuffers for the pushbuffers can get created. + for (auto iter : frameData.activePushBuffers) { + iter->Flush(); + iter->UnmapDevice(); + } + queueRunner_.RunSteps(stepsOnThread); stepsOnThread.clear(); initStepsOnThread.clear(); @@ -601,6 +604,7 @@ void GLPushBuffer::Flush() { if (!buffers_[buf_].deviceMemory && writePtr_) { auto &info = buffers_[buf_]; if (info.flushOffset != 0) { + assert(info.buffer->buffer); glBindBuffer(target_, info.buffer->buffer); glBufferSubData(target_, 0, info.flushOffset, info.localMemory); }