summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/backend/renderview.cpp20
-rw-r--r--src/render/framegraph/qrendercapture.cpp30
-rw-r--r--src/render/framegraph/qrendercapture_p.h5
-rw-r--r--src/render/framegraph/rendercapture.cpp1
-rw-r--r--src/render/framegraph/rendercapture_p.h2
-rw-r--r--src/render/graphicshelpers/graphicscontext.cpp6
-rw-r--r--src/render/materialsystem/qparameter.cpp2
-rw-r--r--src/render/texture/qtexture.cpp2
8 files changed, 56 insertions, 12 deletions
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 73cdbb6da..16e548062 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -146,6 +146,13 @@ static QRectF resolveViewport(const QRectF &fractionalViewport, const QSize &sur
fractionalViewport.height() * surfaceSize.height());
}
+static QMatrix4x4 getProjectionMatrix(const CameraLens *lens)
+{
+ if (!lens)
+ qWarning() << "[Qt3D Renderer] No Camera Lens found. Add a CameraSelector to your Frame Graph or make sure that no entities will be rendered.";
+ return lens ? lens->projection() : QMatrix4x4();
+}
+
UniformValue RenderView::standardUniformValue(RenderView::StandardUniform standardUniformType, const QMatrix4x4 &model) const
{
switch (standardUniformType) {
@@ -154,11 +161,11 @@ UniformValue RenderView::standardUniformValue(RenderView::StandardUniform standa
case ViewMatrix:
return UniformValue(m_data.m_viewMatrix);
case ProjectionMatrix:
- return UniformValue(m_data.m_renderCameraLens->projection());
+ return UniformValue(getProjectionMatrix(m_data.m_renderCameraLens));
case ModelViewMatrix:
return UniformValue(m_data.m_viewMatrix * model);
case ViewProjectionMatrix:
- return UniformValue(m_data.m_renderCameraLens->projection() * m_data.m_viewMatrix);
+ return UniformValue(getProjectionMatrix(m_data.m_renderCameraLens) * m_data.m_viewMatrix);
case ModelViewProjectionMatrix:
return UniformValue(m_data.m_viewProjectionMatrix * model);
case InverseModelMatrix:
@@ -166,15 +173,12 @@ UniformValue RenderView::standardUniformValue(RenderView::StandardUniform standa
case InverseViewMatrix:
return UniformValue(m_data.m_viewMatrix.inverted());
case InverseProjectionMatrix: {
- QMatrix4x4 projection;
- if (m_data.m_renderCameraLens)
- projection = m_data.m_renderCameraLens->projection();
- return UniformValue(projection.inverted());
+ return UniformValue(getProjectionMatrix(m_data.m_renderCameraLens).inverted());
}
case InverseModelViewMatrix:
return UniformValue((m_data.m_viewMatrix * model).inverted());
case InverseViewProjectionMatrix: {
- const QMatrix4x4 viewProjectionMatrix = m_data.m_renderCameraLens->projection() * m_data.m_viewMatrix;
+ const QMatrix4x4 viewProjectionMatrix = getProjectionMatrix(m_data.m_renderCameraLens) * m_data.m_viewMatrix;
return UniformValue(viewProjectionMatrix.inverted());
}
case InverseModelViewProjectionMatrix:
@@ -194,7 +198,7 @@ UniformValue RenderView::standardUniformValue(RenderView::StandardUniform standa
return UniformValue(viewportMatrix.inverted());
}
case Exposure:
- return UniformValue(m_data.m_renderCameraLens->exposure());
+ return UniformValue(m_data.m_renderCameraLens ? m_data.m_renderCameraLens->exposure() : 0.0f);
case Gamma:
return UniformValue(m_gamma);
case Time:
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"));
diff --git a/src/render/framegraph/qrendercapture_p.h b/src/render/framegraph/qrendercapture_p.h
index 3b045ae3b..4e509cc59 100644
--- a/src/render/framegraph/qrendercapture_p.h
+++ b/src/render/framegraph/qrendercapture_p.h
@@ -51,6 +51,8 @@
#include <Qt3DRender/qrendercapture.h>
#include <Qt3DRender/private/qframegraphnode_p.h>
+#include <QtCore/qmutex.h>
+
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
@@ -59,11 +61,14 @@ class QRenderCapturePrivate : public QFrameGraphNodePrivate
{
public:
QRenderCapturePrivate();
+ ~QRenderCapturePrivate();
QVector<QRenderCaptureReply *> m_waitingReplies;
+ QMutex m_mutex;
QRenderCaptureReply *createReply(int captureId);
QRenderCaptureReply *takeReply(int captureId);
void setImage(QRenderCaptureReply *reply, const QImage &image);
+ void replyDestroyed(QRenderCaptureReply *reply);
Q_DECLARE_PUBLIC(QRenderCapture)
};
diff --git a/src/render/framegraph/rendercapture.cpp b/src/render/framegraph/rendercapture.cpp
index 188f3dbe6..d25a01b1f 100644
--- a/src/render/framegraph/rendercapture.cpp
+++ b/src/render/framegraph/rendercapture.cpp
@@ -59,6 +59,7 @@ void RenderCapture::requestCapture(const QRenderCaptureRequest &request)
// called by render view initializer job
bool RenderCapture::wasCaptureRequested() const
{
+ QMutexLocker lock(&m_mutex);
return m_requestedCaptures.size() > 0 && isEnabled();
}
diff --git a/src/render/framegraph/rendercapture_p.h b/src/render/framegraph/rendercapture_p.h
index cf650b64d..8c9f4a31d 100644
--- a/src/render/framegraph/rendercapture_p.h
+++ b/src/render/framegraph/rendercapture_p.h
@@ -75,7 +75,7 @@ private:
QVector<QRenderCaptureRequest> m_requestedCaptures;
QVector<RenderCaptureDataPtr> m_renderCaptureData;
- QMutex m_mutex;
+ mutable QMutex m_mutex;
};
} // Render
diff --git a/src/render/graphicshelpers/graphicscontext.cpp b/src/render/graphicshelpers/graphicscontext.cpp
index 0798d6a0c..582d22b63 100644
--- a/src/render/graphicshelpers/graphicscontext.cpp
+++ b/src/render/graphicshelpers/graphicscontext.cpp
@@ -1828,8 +1828,11 @@ QImage GraphicsContext::readFramebuffer(const QRect &rect)
GLint samples = 0;
m_gl->functions()->glGetIntegerv(GL_SAMPLES, &samples);
- if (samples > 0 && !m_glHelper->supportsFeature(GraphicsHelperInterface::BlitFramebuffer))
+ if (samples > 0 && !m_glHelper->supportsFeature(GraphicsHelperInterface::BlitFramebuffer)) {
+ qWarning () << Q_FUNC_INFO << "Unable to capture multisampled framebuffer; "
+ "Required feature BlitFramebuffer is missing.";
return img;
+ }
img = QImage(rect.width(), rect.height(), imageFormat);
@@ -1850,6 +1853,7 @@ QImage GraphicsContext::readFramebuffer(const QRect &rect)
if (status != GL_FRAMEBUFFER_COMPLETE) {
gl->glDeleteRenderbuffers(1, &rb);
gl->glDeleteFramebuffers(1, &fbo);
+ qWarning () << Q_FUNC_INFO << "Copy-framebuffer not complete: " << status;
return img;
}
diff --git a/src/render/materialsystem/qparameter.cpp b/src/render/materialsystem/qparameter.cpp
index 2ca7d176b..64c672737 100644
--- a/src/render/materialsystem/qparameter.cpp
+++ b/src/render/materialsystem/qparameter.cpp
@@ -88,7 +88,7 @@
\endcode
When it comes to texture support, the Parameter value should be set to the
- appropriate Texture subclass that matches the sampler type of the shader
+ appropriate \l {Qt3DRender::QAbstractTexture}{Texture} subclass that matches the sampler type of the shader
uniform.
\code
diff --git a/src/render/texture/qtexture.cpp b/src/render/texture/qtexture.cpp
index a8feccb77..26dfe4d1d 100644
--- a/src/render/texture/qtexture.cpp
+++ b/src/render/texture/qtexture.cpp
@@ -703,7 +703,7 @@ QTextureImageDataPtr TextureLoadingHelper::loadTextureData(const QUrl &url, bool
if (!f.open(QIODevice::ReadOnly))
qWarning() << "Failed to open" << source;
else
- textureData = loadTextureData(&f, QFileInfo(source).suffix(), allow3D, mirrored);
+ textureData = loadTextureData(&f, QFileInfo(source).suffix().toLower(), allow3D, mirrored);
}
return textureData;
}