diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-01-10 21:34:10 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-01-10 21:34:10 +0100 |
commit | b0e11393968ceaad8c35e7df528c73a5e6111f32 (patch) | |
tree | 38ba2cd55e2c605225d583225814ada8b995d743 | |
parent | 55b52c47030c759f8b38013eb873c0b161d0e426 (diff) | |
parent | 82eb8b44e0a3d1dc586acc52132be2b05102900c (diff) |
Merge remote-tracking branch 'origin/5.12' into dev
Conflicts:
.qmake.conf
Change-Id: Ie8a4bf768bffba61dca9e315151c035be7b48723
-rw-r--r-- | src/extras/defaults/qmetalroughmaterial.cpp | 24 | ||||
-rw-r--r-- | src/extras/defaults/qmetalroughmaterial_p.h | 4 | ||||
-rw-r--r-- | src/render/framegraph/qrendercapture.cpp | 3 | ||||
-rw-r--r-- | src/render/jobs/abstractpickingjob.cpp | 11 | ||||
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer.cpp | 3 | ||||
-rw-r--r-- | src/render/renderers/opengl/renderer/renderview.cpp | 7 | ||||
-rw-r--r-- | tests/auto/render/qrendercapture/tst_qrendercapture.cpp | 19 | ||||
-rw-r--r-- | tests/auto/render/renderer/tst_renderer.cpp | 2 | ||||
-rw-r--r-- | tests/manual/picking-qml/main.qml | 26 |
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] + } + } + } } } }, |