diff options
author | YAMAMOTO Atsushi <atsushi.yamamoto@signal-slot.co.jp> | 2022-06-24 16:41:56 +0900 |
---|---|---|
committer | YAMAMOTO Atsushi <atsushi.yamamoto@signal-slot.co.jp> | 2022-06-29 18:39:53 +0900 |
commit | ebc966272a8aee4b783645d52f13a88b652200b9 (patch) | |
tree | 7b446c1cc21e484cf409901194cc79e6e4e5ed1f | |
parent | 60d957b8a0530646028a01b28fa44230726c75a5 (diff) |
Fix 3D Render Capture crashed issue
m_pendingRenderCaptureSendRequests is touched by different threads
from Renderer::jobsDone and Renderer::executeCommandsSubmission.
It causes Assert and crashes and shuould be protected with mutex.
Task-number: QTBUG-104592
Pick-to: 6.2 6.3 6.4
Change-Id: I489691caeba2772f544fe1e4716053caf9492696
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
4 files changed, 8 insertions, 0 deletions
diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp index efccc7e44..13eb85d6f 100644 --- a/src/plugins/renderers/opengl/renderer/renderer.cpp +++ b/src/plugins/renderers/opengl/renderer/renderer.cpp @@ -1607,6 +1607,7 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const std::vector static_cast<Render::RenderCapture*>(m_nodesManager->frameGraphManager()->lookupNode(renderView->renderCaptureNodeId())); renderCapture->addRenderCapture(request.captureId, image); const QNodeId renderCaptureId = renderView->renderCaptureNodeId(); + QMutexLocker lock(&m_pendingRenderCaptureSendRequestsMutex); if (!Qt3DCore::contains(m_pendingRenderCaptureSendRequests, renderCaptureId)) m_pendingRenderCaptureSendRequests.push_back(renderView->renderCaptureNodeId()); } @@ -1717,7 +1718,9 @@ void Renderer::jobsDone(Qt3DCore::QAspectManager *manager) // called in main thread once all jobs are done running // sync captured renders to frontend + QMutexLocker lock(&m_pendingRenderCaptureSendRequestsMutex); const std::vector<Qt3DCore::QNodeId> pendingCaptureIds = Qt3DCore::moveAndClear(m_pendingRenderCaptureSendRequests); + lock.unlock(); for (const Qt3DCore::QNodeId &id : pendingCaptureIds) { auto *backend = static_cast<Qt3DRender::Render::RenderCapture *> (m_nodesManager->frameGraphManager()->lookupNode(id)); diff --git a/src/plugins/renderers/opengl/renderer/renderer_p.h b/src/plugins/renderers/opengl/renderer/renderer_p.h index a80653209..58b55cc0b 100644 --- a/src/plugins/renderers/opengl/renderer/renderer_p.h +++ b/src/plugins/renderers/opengl/renderer/renderer_p.h @@ -323,6 +323,7 @@ private: RenderableEntityFilterPtr m_renderableEntityFilterJob; ComputableEntityFilterPtr m_computableEntityFilterJob; + QMutex m_pendingRenderCaptureSendRequestsMutex; std::vector<Qt3DCore::QNodeId> m_pendingRenderCaptureSendRequests; void performDraw(const RenderCommand *command); diff --git a/src/plugins/renderers/rhi/renderer/renderer.cpp b/src/plugins/renderers/rhi/renderer/renderer.cpp index ea4f864fa..5d25e3257 100644 --- a/src/plugins/renderers/rhi/renderer/renderer.cpp +++ b/src/plugins/renderers/rhi/renderer/renderer.cpp @@ -2163,8 +2163,10 @@ void Renderer::jobsDone(Qt3DCore::QAspectManager *manager) // called in main thread once all jobs are done running // sync captured renders to frontend + QMutexLocker lock(&m_pendingRenderCaptureSendRequestsMutex); const std::vector<Qt3DCore::QNodeId> pendingCaptureIds = Qt3DCore::moveAndClear(m_pendingRenderCaptureSendRequests); + lock.unlock(); for (const Qt3DCore::QNodeId &id : qAsConst(pendingCaptureIds)) { auto *backend = static_cast<Qt3DRender::Render::RenderCapture *>( m_nodesManager->frameGraphManager()->lookupNode(id)); @@ -2750,6 +2752,7 @@ bool Renderer::executeCommandsSubmission(const RHIPassInfo &passInfo) Render::RenderCapture *renderCapture = static_cast<Render::RenderCapture*>(m_nodesManager->frameGraphManager()->lookupNode(renderCaptureId)); renderCapture->addRenderCapture(request.captureId, image); + QMutexLocker lock(&m_pendingRenderCaptureSendRequestsMutex); if (!Qt3DCore::contains(m_pendingRenderCaptureSendRequests, renderCaptureId)) m_pendingRenderCaptureSendRequests.push_back(renderCaptureId); }; diff --git a/src/plugins/renderers/rhi/renderer/renderer_p.h b/src/plugins/renderers/rhi/renderer/renderer_p.h index d8783fcc9..463aec7d3 100644 --- a/src/plugins/renderers/rhi/renderer/renderer_p.h +++ b/src/plugins/renderers/rhi/renderer/renderer_p.h @@ -324,6 +324,7 @@ private: RenderableEntityFilterPtr m_renderableEntityFilterJob; ComputableEntityFilterPtr m_computableEntityFilterJob; + QMutex m_pendingRenderCaptureSendRequestsMutex; std::vector<Qt3DCore::QNodeId> m_pendingRenderCaptureSendRequests; SynchronizerJobPtr m_bufferGathererJob; |