From 52876429aa63ac7b0713e350c487717977890290 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Atsushi Date: Fri, 24 Jun 2022 16:41:56 +0900 Subject: 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 Change-Id: I489691caeba2772f544fe1e4716053caf9492696 Reviewed-by: Paul Lemire (cherry picked from commit ebc966272a8aee4b783645d52f13a88b652200b9) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/renderers/opengl/renderer/renderer.cpp | 3 +++ src/plugins/renderers/opengl/renderer/renderer_p.h | 1 + src/plugins/renderers/rhi/renderer/renderer.cpp | 3 +++ src/plugins/renderers/rhi/renderer/renderer_p.h | 1 + 4 files changed, 8 insertions(+) diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp index aaec6ad7b..9c3cd934f 100644 --- a/src/plugins/renderers/opengl/renderer/renderer.cpp +++ b/src/plugins/renderers/opengl/renderer/renderer.cpp @@ -1643,6 +1643,7 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const std::vector static_cast(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()); } @@ -1753,7 +1754,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 pendingCaptureIds = Qt3DCore::moveAndClear(m_pendingRenderCaptureSendRequests); + lock.unlock(); for (const Qt3DCore::QNodeId &id : pendingCaptureIds) { auto *backend = static_cast (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 78dfbe2a5..151d2a5cf 100644 --- a/src/plugins/renderers/opengl/renderer/renderer_p.h +++ b/src/plugins/renderers/opengl/renderer/renderer_p.h @@ -359,6 +359,7 @@ private: RenderableEntityFilterPtr m_renderableEntityFilterJob; ComputableEntityFilterPtr m_computableEntityFilterJob; + QMutex m_pendingRenderCaptureSendRequestsMutex; std::vector 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 cfffd064c..8f4df706d 100644 --- a/src/plugins/renderers/rhi/renderer/renderer.cpp +++ b/src/plugins/renderers/rhi/renderer/renderer.cpp @@ -2199,8 +2199,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 pendingCaptureIds = Qt3DCore::moveAndClear(m_pendingRenderCaptureSendRequests); + lock.unlock(); for (const Qt3DCore::QNodeId &id : qAsConst(pendingCaptureIds)) { auto *backend = static_cast( m_nodesManager->frameGraphManager()->lookupNode(id)); @@ -2786,6 +2788,7 @@ bool Renderer::executeCommandsSubmission(const RHIPassInfo &passInfo) Render::RenderCapture *renderCapture = static_cast(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 1c89bd52b..f60ee0ba0 100644 --- a/src/plugins/renderers/rhi/renderer/renderer_p.h +++ b/src/plugins/renderers/rhi/renderer/renderer_p.h @@ -360,6 +360,7 @@ private: RenderableEntityFilterPtr m_renderableEntityFilterJob; ComputableEntityFilterPtr m_computableEntityFilterJob; + QMutex m_pendingRenderCaptureSendRequestsMutex; std::vector m_pendingRenderCaptureSendRequests; SynchronizerJobPtr m_bufferGathererJob; -- cgit v1.2.3