summaryrefslogtreecommitdiffstats
path: root/src/render/framegraph/qrendercapture.cpp
diff options
context:
space:
mode:
authorAndy Nichols <andy.nichols@qt.io>2017-07-11 14:17:28 +0200
committerAndy Nichols <andy.nichols@qt.io>2017-07-11 14:17:28 +0200
commit2dd6aa017685bd76f3a315871d07fdaef0e6d5f1 (patch)
tree3ee522501db89ab9d295bd169298497c0d86309e /src/render/framegraph/qrendercapture.cpp
parent06fa003da1dc6bc16616f3e687de8513d8b40a1c (diff)
parentcadfd44c77de9ad3d66e936df140e4ba6efb0d74 (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Diffstat (limited to 'src/render/framegraph/qrendercapture.cpp')
-rw-r--r--src/render/framegraph/qrendercapture.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/render/framegraph/qrendercapture.cpp b/src/render/framegraph/qrendercapture.cpp
index ff0a5c739..66c518506 100644
--- a/src/render/framegraph/qrendercapture.cpp
+++ b/src/render/framegraph/qrendercapture.cpp
@@ -41,6 +41,7 @@
#include <Qt3DRender/qframegraphnodecreatedchange.h>
#include <QPointer>
+#include <QMutexLocker>
QT_BEGIN_NAMESPACE
@@ -240,8 +241,19 @@ QRenderCapturePrivate::QRenderCapturePrivate()
/*!
* \internal
*/
+QRenderCapturePrivate::~QRenderCapturePrivate()
+{
+ Q_Q(QRenderCapture);
+ for (QRenderCaptureReply *reply : m_waitingReplies)
+ reply->disconnect(q);
+}
+
+/*!
+ * \internal
+ */
QRenderCaptureReply *QRenderCapturePrivate::createReply(int captureId)
{
+ QMutexLocker lock(&m_mutex);
QRenderCaptureReply *reply = new QRenderCaptureReply();
reply->d_func()->m_captureId = captureId;
m_waitingReplies.push_back(reply);
@@ -254,6 +266,7 @@ QRenderCaptureReply *QRenderCapturePrivate::createReply(int captureId)
QRenderCaptureReply *QRenderCapturePrivate::takeReply(int captureId)
{
QRenderCaptureReply *reply = nullptr;
+ QMutexLocker lock(&m_mutex);
for (int i = 0; i < m_waitingReplies.size(); ++i) {
if (m_waitingReplies[i]->d_func()->m_captureId == captureId) {
reply = m_waitingReplies[i];
@@ -274,6 +287,15 @@ void QRenderCapturePrivate::setImage(QRenderCaptureReply *reply, const QImage &i
}
/*!
+ * \internal
+ */
+void QRenderCapturePrivate::replyDestroyed(QRenderCaptureReply *reply)
+{
+ QMutexLocker lock(&m_mutex);
+ m_waitingReplies.removeAll(reply);
+}
+
+/*!
* The constructor creates an instance with the specified \a parent.
*/
QRenderCapture::QRenderCapture(Qt3DCore::QNode *parent)
@@ -293,6 +315,10 @@ QRenderCaptureReply *QRenderCapture::requestCapture(int captureId, const QRect &
{
Q_D(QRenderCapture);
QRenderCaptureReply *reply = d->createReply(captureId);
+ reply->setParent(this);
+ QObject::connect(reply, &QObject::destroyed, this, [&, reply, d] (QObject *) {
+ d->replyDestroyed(reply);
+ });
Qt3DCore::QPropertyUpdatedChangePtr change(new Qt3DCore::QPropertyUpdatedChange(id()));
change->setPropertyName(QByteArrayLiteral("renderCaptureRequest"));
@@ -314,6 +340,10 @@ QRenderCaptureReply *QRenderCapture::requestCapture(const QRect &rect)
Q_D(QRenderCapture);
static int captureId = 1;
QRenderCaptureReply *reply = d->createReply(captureId);
+ reply->setParent(this);
+ QObject::connect(reply, &QObject::destroyed, this, [&, reply, d] (QObject *) {
+ d->replyDestroyed(reply);
+ });
Qt3DCore::QPropertyUpdatedChangePtr change(new Qt3DCore::QPropertyUpdatedChange(id()));
change->setPropertyName(QByteArrayLiteral("renderCaptureRequest"));