summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/extras/defaults/qmetalroughmaterial.cpp24
-rw-r--r--src/extras/defaults/qmetalroughmaterial_p.h4
-rw-r--r--src/render/framegraph/qrendercapture.cpp3
-rw-r--r--src/render/jobs/abstractpickingjob.cpp11
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp3
-rw-r--r--src/render/renderers/opengl/renderer/renderview.cpp7
-rw-r--r--tests/auto/render/qrendercapture/tst_qrendercapture.cpp19
-rw-r--r--tests/auto/render/renderer/tst_renderer.cpp2
-rw-r--r--tests/manual/picking-qml/main.qml26
9 files changed, 62 insertions, 37 deletions
diff --git a/src/extras/defaults/qmetalroughmaterial.cpp b/src/extras/defaults/qmetalroughmaterial.cpp
index de21268f1..f52437769 100644
--- a/src/extras/defaults/qmetalroughmaterial.cpp
+++ b/src/extras/defaults/qmetalroughmaterial.cpp
@@ -61,8 +61,6 @@ namespace Qt3DExtras {
QMetalRoughMaterialPrivate::QMetalRoughMaterialPrivate()
: QMaterialPrivate()
- , m_environmentIrradianceTexture(new QTexture2D())
- , m_environmentSpecularTexture(new QTexture2D())
, m_baseColorParameter(new QParameter(QStringLiteral("baseColor"), QColor("grey")))
, m_metalnessParameter(new QParameter(QStringLiteral("metalness"), 0.0f))
, m_roughnessParameter(new QParameter(QStringLiteral("roughness"), 0.0f))
@@ -72,8 +70,6 @@ QMetalRoughMaterialPrivate::QMetalRoughMaterialPrivate()
, m_ambientOcclusionMapParameter(new QParameter(QStringLiteral("ambientOcclusionMap"), QVariant()))
, m_normalMapParameter(new QParameter(QStringLiteral("normalMap"), QVariant()))
, m_textureScaleParameter(new QParameter(QStringLiteral("texCoordScale"), 1.0f))
- , m_environmentIrradianceParameter(new QParameter(QStringLiteral("envLight.irradiance"), m_environmentIrradianceTexture))
- , m_environmentSpecularParameter(new QParameter(QStringLiteral("envLight.specular"), m_environmentSpecularTexture))
, m_metalRoughEffect(new QEffect())
, m_metalRoughGL3Technique(new QTechnique())
, m_metalRoughGL3RenderPass(new QRenderPass())
@@ -85,17 +81,6 @@ QMetalRoughMaterialPrivate::QMetalRoughMaterialPrivate()
, m_metalRoughES3ShaderBuilder(new QShaderProgramBuilder())
, m_filterKey(new QFilterKey)
{
- m_environmentIrradianceTexture->setMagnificationFilter(QAbstractTexture::Linear);
- m_environmentIrradianceTexture->setMinificationFilter(QAbstractTexture::LinearMipMapLinear);
- m_environmentIrradianceTexture->setWrapMode(QTextureWrapMode(QTextureWrapMode::Repeat));
- m_environmentIrradianceTexture->setGenerateMipMaps(true);
- m_environmentIrradianceTexture->setMaximumAnisotropy(16.0f);
-
- m_environmentSpecularTexture->setMagnificationFilter(QAbstractTexture::Linear);
- m_environmentSpecularTexture->setMinificationFilter(QAbstractTexture::LinearMipMapLinear);
- m_environmentSpecularTexture->setWrapMode(QTextureWrapMode(QTextureWrapMode::Repeat));
- m_environmentSpecularTexture->setGenerateMipMaps(true);
- m_environmentSpecularTexture->setMaximumAnisotropy(16.0f);
}
void QMetalRoughMaterialPrivate::init()
@@ -163,15 +148,6 @@ void QMetalRoughMaterialPrivate::init()
m_metalRoughEffect->addParameter(m_roughnessParameter);
m_metalRoughEffect->addParameter(m_textureScaleParameter);
- // Note that even though those parameters are not exposed in the API,
- // they need to be kept around for now due to a bug in some drivers/GPUs
- // (at least Intel) which cause issues with unbound textures even if you
- // don't try to sample from them.
- // Can probably go away once we generate the shaders and deal in this
- // case in a better way.
- m_metalRoughEffect->addParameter(m_environmentIrradianceParameter);
- m_metalRoughEffect->addParameter(m_environmentSpecularParameter);
-
q->setEffect(m_metalRoughEffect);
}
diff --git a/src/extras/defaults/qmetalroughmaterial_p.h b/src/extras/defaults/qmetalroughmaterial_p.h
index e12df1a8b..4d8b68320 100644
--- a/src/extras/defaults/qmetalroughmaterial_p.h
+++ b/src/extras/defaults/qmetalroughmaterial_p.h
@@ -81,8 +81,6 @@ public:
void handleTextureScaleChanged(const QVariant &var);
- Qt3DRender::QAbstractTexture *m_environmentIrradianceTexture;
- Qt3DRender::QAbstractTexture *m_environmentSpecularTexture;
Qt3DRender::QParameter *m_baseColorParameter;
Qt3DRender::QParameter *m_metalnessParameter;
Qt3DRender::QParameter *m_roughnessParameter;
@@ -92,8 +90,6 @@ public:
Qt3DRender::QParameter *m_ambientOcclusionMapParameter;
Qt3DRender::QParameter *m_normalMapParameter;
Qt3DRender::QParameter *m_textureScaleParameter;
- Qt3DRender::QParameter *m_environmentIrradianceParameter;
- Qt3DRender::QParameter *m_environmentSpecularParameter;
Qt3DRender::QEffect *m_metalRoughEffect;
Qt3DRender::QTechnique *m_metalRoughGL3Technique;
Qt3DRender::QRenderPass *m_metalRoughGL3RenderPass;
diff --git a/src/render/framegraph/qrendercapture.cpp b/src/render/framegraph/qrendercapture.cpp
index d5b6d63ae..5bda569f9 100644
--- a/src/render/framegraph/qrendercapture.cpp
+++ b/src/render/framegraph/qrendercapture.cpp
@@ -252,9 +252,6 @@ QRenderCapturePrivate::QRenderCapturePrivate()
*/
QRenderCapturePrivate::~QRenderCapturePrivate()
{
- Q_Q(QRenderCapture);
- for (QRenderCaptureReply *reply : qAsConst(m_waitingReplies))
- reply->disconnect(q);
}
/*!
diff --git a/src/render/jobs/abstractpickingjob.cpp b/src/render/jobs/abstractpickingjob.cpp
index ccb190cff..74e6a7f80 100644
--- a/src/render/jobs/abstractpickingjob.cpp
+++ b/src/render/jobs/abstractpickingjob.cpp
@@ -122,15 +122,22 @@ RayCasting::QRay3D AbstractPickingJob::rayForViewportAndCamera(const PickingUtil
const QPoint &pos) const
{
static RayCasting::QRay3D invalidRay({}, {}, 0.f);
+
+ if (!vca.area.isValid())
+ return invalidRay;
+
Matrix4x4 viewMatrix;
Matrix4x4 projectionMatrix;
Render::CameraLens::viewMatrixForCamera(m_manager->renderNodesManager(),
vca.cameraId,
viewMatrix,
projectionMatrix);
+ // Returns viewport rect in GL coordinates (y inverted)
const QRect viewport = windowViewport(vca.area, vca.viewport);
+ // In GL the y is inverted compared to Qt
+ const QPoint glCorrectPos = QPoint(pos.x(), vca.area.height() - pos.y());
- if (vca.area.isValid() && !viewport.contains(pos))
+ if (!viewport.contains(glCorrectPos))
return invalidRay;
if (vca.surface) {
QSurface *surface = nullptr;
@@ -148,8 +155,6 @@ RayCasting::QRay3D AbstractPickingJob::rayForViewportAndCamera(const PickingUtil
return invalidRay;
}
- // In GL the y is inverted compared to Qt
- const QPoint glCorrectPos = QPoint(pos.x(), vca.area.isValid() ? vca.area.height() - pos.y() : pos.y());
const auto ray = intersectionRay(glCorrectPos, viewMatrix, projectionMatrix, viewport);
return ray;
}
diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp
index 9aed183b0..4abe62bab 100644
--- a/src/render/renderers/opengl/renderer/renderer.cpp
+++ b/src/render/renderers/opengl/renderer/renderer.cpp
@@ -1797,7 +1797,8 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs()
renderBinJobs.push_back(m_updateShaderDataTransformJob);
}
- if (dirtyBitsForFrame & AbstractRenderer::GeometryDirty) {
+ if (dirtyBitsForFrame & AbstractRenderer::GeometryDirty ||
+ dirtyBitsForFrame & AbstractRenderer::BuffersDirty) {
renderBinJobs.push_back(m_calculateBoundingVolumeJob);
renderBinJobs.push_back(m_updateMeshTriangleListJob);
}
diff --git a/src/render/renderers/opengl/renderer/renderview.cpp b/src/render/renderers/opengl/renderer/renderview.cpp
index 39fed2294..3aa45c836 100644
--- a/src/render/renderers/opengl/renderer/renderview.cpp
+++ b/src/render/renderers/opengl/renderer/renderview.cpp
@@ -1065,6 +1065,13 @@ void RenderView::setShaderAndUniforms(RenderCommand *command,
setDefaultUniformBlockShaderDataValue(command->m_parameterPack, shader, shaderData, QStringLiteral("envLight"));
envLightCount = 1;
}
+ } else {
+ // with some drivers, samplers (like the envbox sampler) need to be bound even though
+ // they may not be actually used, otherwise draw calls can fail
+ static const int irradianceId = StringToInt::lookupId(QLatin1String("envLight.irradiance"));
+ static const int specularId = StringToInt::lookupId(QLatin1String("envLight.specular"));
+ setUniformValue(command->m_parameterPack, irradianceId, m_renderer->submissionContext()->maxTextureUnitsCount());
+ setUniformValue(command->m_parameterPack, specularId, m_renderer->submissionContext()->maxTextureUnitsCount());
}
setUniformValue(command->m_parameterPack, StringToInt::lookupId(QStringLiteral("envLightCount")), envLightCount);
}
diff --git a/tests/auto/render/qrendercapture/tst_qrendercapture.cpp b/tests/auto/render/qrendercapture/tst_qrendercapture.cpp
index b2144d500..2fab1e837 100644
--- a/tests/auto/render/qrendercapture/tst_qrendercapture.cpp
+++ b/tests/auto/render/qrendercapture/tst_qrendercapture.cpp
@@ -34,6 +34,8 @@
#include <Qt3DRender/QRenderCapture>
#include <Qt3DRender/private/qrendercapture_p.h>
+#include <QPointer>
+
#include "testpostmanarbiter.h"
class MyRenderCapture : public Qt3DRender::QRenderCapture
@@ -129,6 +131,23 @@ private Q_SLOTS:
// THEN
renderCapture->sceneChangeEvent(e); // Should not reset
}
+
+ void crashOnRenderCaptureDeletion()
+ {
+ // GIVEN
+ QScopedPointer<Qt3DRender::QRenderCapture> renderCapture(new Qt3DRender::QRenderCapture());
+ QPointer<Qt3DRender::QRenderCaptureReply> renderCaptureReply(renderCapture->requestCapture());
+
+ // THEN
+ QVERIFY(renderCaptureReply);
+
+ // WHEN
+ renderCapture.reset();
+
+ // THEN (Should not crash and delete reply)
+ QVERIFY(!renderCaptureReply);
+ }
+
};
QTEST_MAIN(tst_QRenderCapture)
diff --git a/tests/auto/render/renderer/tst_renderer.cpp b/tests/auto/render/renderer/tst_renderer.cpp
index bd1f7185e..c89805464 100644
--- a/tests/auto/render/renderer/tst_renderer.cpp
+++ b/tests/auto/render/renderer/tst_renderer.cpp
@@ -235,6 +235,8 @@ private Q_SLOTS:
1 + // cleanupJob
1 + // VAOGatherer
1 + // updateSkinningPaletteJob
+ 1 + // CalculateBoundingVolumeJob
+ 1 + // UpdateMeshTriangleListJob
1); // BufferGathererJob
renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
diff --git a/tests/manual/picking-qml/main.qml b/tests/manual/picking-qml/main.qml
index c020d5817..5ca50be0b 100644
--- a/tests/manual/picking-qml/main.qml
+++ b/tests/manual/picking-qml/main.qml
@@ -79,7 +79,19 @@ Entity {
id: camera2
projectionType: CameraLens.PerspectiveProjection
fieldOfView: 45
- aspectRatio: _view.width * 0.5 / _view.height
+ aspectRatio: _view.width * 0.5 / (_view.height * 0.5)
+ nearPlane : 0.1
+ farPlane : 1000.0
+ position: Qt.vector3d( 40.0, 5.0, -20.0 )
+ upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
+ viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
+ }
+
+ Camera {
+ id: camera3
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ aspectRatio: _view.width * 0.5 / (_view.height * 0.5)
nearPlane : 0.1
farPlane : 1000.0
position: Qt.vector3d( 40.0, 5.0, -20.0 )
@@ -113,7 +125,7 @@ Entity {
}
Viewport {
- normalizedRect: Qt.rect(0.5, 0.0, 0.5, 1.0)
+ normalizedRect: Qt.rect(0.5, 0.0, 0.5, 0.5)
CameraSelector {
camera: camera2
LayerFilter {
@@ -122,6 +134,16 @@ Entity {
}
}
}
+ Viewport {
+ normalizedRect: Qt.rect(0.5, 0.5, 0.5, 0.5)
+ CameraSelector {
+ camera: camera3
+ LayerFilter {
+ // To show Debug volumes
+ layers: [sceneRoot.contentLayer, sceneRoot.debugLayer]
+ }
+ }
+ }
}
}
},