summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJean-Michaël Celerier <jean-michael.celerier@kdab.com>2020-03-10 20:18:17 +0100
committerJean-Michaël Celerier <jean-michael.celerier@kdab.com>2020-03-11 06:41:22 +0100
commitd55072a53753228caab9c843e0f40fe2a84070cc (patch)
tree16f1b1517eb7bb4ba9c236f3f6f07c5be70786c7 /src
parent707cfb5884b0a2dacde9b3a7ce47707a5c09744b (diff)
Allow Qt3DWindow to choose which graphics API to use on construction
Change-Id: Id3ff72a2eaa7f85844a546ef55dc3e1b71a14659 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/extras/defaults/qt3dwindow.cpp73
-rw-r--r--src/extras/defaults/qt3dwindow.h3
-rw-r--r--src/plugins/renderers/opengl/renderer/renderer_p.h2
-rw-r--r--src/render/backend/abstractrenderer_p.h7
-rw-r--r--src/render/backend/resourceaccessor.cpp2
-rw-r--r--src/render/frontend/qrenderapi.h61
-rw-r--r--src/render/frontend/qrenderaspect.cpp2
-rw-r--r--src/render/frontend/qrendercapabilities.h2
-rw-r--r--src/render/frontend/render-frontend.pri1
9 files changed, 140 insertions, 13 deletions
diff --git a/src/extras/defaults/qt3dwindow.cpp b/src/extras/defaults/qt3dwindow.cpp
index f555308a6..eb0961113 100644
--- a/src/extras/defaults/qt3dwindow.cpp
+++ b/src/extras/defaults/qt3dwindow.cpp
@@ -65,6 +65,10 @@
#include <QEvent>
+#if QT_CONFIG(vulkan)
+#include <QVulkanInstance>
+#endif
+
static void initResources()
{
#ifdef QT_STATIC
@@ -91,7 +95,7 @@ Qt3DWindowPrivate::Qt3DWindowPrivate()
{
}
-Qt3DWindow::Qt3DWindow(QScreen *screen)
+Qt3DWindow::Qt3DWindow(QScreen *screen, Qt3DRender::API api)
: QWindow(*new Qt3DWindowPrivate(), nullptr)
{
Q_D(Qt3DWindow);
@@ -101,7 +105,72 @@ Qt3DWindow::Qt3DWindow(QScreen *screen)
if (!d->parentWindow)
d->connectToScreen(screen ? screen : d->topLevelScreen.data());
- setSurfaceType(QSurface::OpenGLSurface);
+ // If the user pass an API through the environment, we use that over the one passed as argument.
+ const auto userRequestedApi = qgetenv("QT3D_RHI_DEFAULT_API").toLower();
+ if (!userRequestedApi.isEmpty()) {
+ if (userRequestedApi == QByteArrayLiteral("opengl")) {
+ api = Qt3DRender::API::OpenGL;
+ } else if (userRequestedApi == QByteArrayLiteral("vulkan")) {
+ api = Qt3DRender::API::Vulkan;
+ } else if (userRequestedApi == QByteArrayLiteral("metal")) {
+ api = Qt3DRender::API::Metal;
+ } else if (userRequestedApi == QByteArrayLiteral("d3d11")) {
+ api = Qt3DRender::API::DirectX;
+ } else if (userRequestedApi == QByteArrayLiteral("null")) {
+ api = Qt3DRender::API::Null;
+ }
+ }
+
+ // We have to set the environment so that the backend is able to read it.
+ // Qt6: FIXME
+ switch (api)
+ {
+ case Qt3DRender::API::OpenGL:
+ qputenv("QT3D_RHI_DEFAULT_API", "opengl");
+ setSurfaceType(QSurface::OpenGLSurface);
+ break;
+ case Qt3DRender::API::DirectX:
+ qputenv("QT3D_RHI_DEFAULT_API", "d3d11");
+ setSurfaceType(QSurface::OpenGLSurface);
+ break;
+ case Qt3DRender::API::Null:
+ qputenv("QT3D_RHI_DEFAULT_API", "null");
+ setSurfaceType(QSurface::OpenGLSurface);
+ break;
+ case Qt3DRender::API::Metal:
+ qputenv("QT3D_RHI_DEFAULT_API", "metal");
+ setSurfaceType(QSurface::MetalSurface);
+ break;
+#if QT_CONFIG(vulkan)
+ case Qt3DRender::API::Vulkan:
+ {
+ static QVulkanInstance inst;
+#ifndef Q_OS_ANDROID
+ inst.setLayers(QByteArrayList() << "VK_LAYER_LUNARG_standard_validation");
+#else
+ inst.setLayers(QByteArrayList()
+ << "VK_LAYER_GOOGLE_threading"
+ << "VK_LAYER_LUNARG_parameter_validation"
+ << "VK_LAYER_LUNARG_object_tracker"
+ << "VK_LAYER_LUNARG_core_validation"
+ << "VK_LAYER_LUNARG_image"
+ << "VK_LAYER_LUNARG_swapchain"
+ << "VK_LAYER_GOOGLE_unique_objects");
+#endif
+ inst.setExtensions(QByteArrayList()
+ << "VK_KHR_get_physical_device_properties2");
+ Q_ASSERT (inst.create());
+ setVulkanInstance(&inst);
+
+ qputenv("QT3D_RHI_DEFAULT_API", "vulkan");
+ setSurfaceType(QSurface::VulkanSurface);
+ break;
+ }
+#endif
+ default:
+ break;
+ }
+
resize(1024, 768);
diff --git a/src/extras/defaults/qt3dwindow.h b/src/extras/defaults/qt3dwindow.h
index bf4f44ff0..0d277e119 100644
--- a/src/extras/defaults/qt3dwindow.h
+++ b/src/extras/defaults/qt3dwindow.h
@@ -52,6 +52,7 @@
#define QT3DWINDOW_H
#include <Qt3DExtras/qt3dextras_global.h>
+#include <Qt3DRender/qrenderapi.h>
#include <QtGui/QWindow>
QT_BEGIN_NAMESPACE
@@ -90,7 +91,7 @@ class Q_3DEXTRASSHARED_EXPORT Qt3DWindow : public QWindow
{
Q_OBJECT
public:
- Qt3DWindow(QScreen *screen = nullptr);
+ Qt3DWindow(QScreen *screen = nullptr, Qt3DRender::API = Qt3DRender::API::OpenGL);
~Qt3DWindow();
void registerAspect(Qt3DCore::QAbstractAspect *aspect);
diff --git a/src/plugins/renderers/opengl/renderer/renderer_p.h b/src/plugins/renderers/opengl/renderer/renderer_p.h
index 93faf982d..42251cacb 100644
--- a/src/plugins/renderers/opengl/renderer/renderer_p.h
+++ b/src/plugins/renderers/opengl/renderer/renderer_p.h
@@ -174,7 +174,7 @@ public:
~Renderer();
void dumpInfo() const override;
- API api() const override { return AbstractRenderer::OpenGL; }
+ API api() const override { return Qt3DRender::API::OpenGL; }
qint64 time() const override;
void setTime(qint64 time) override;
diff --git a/src/render/backend/abstractrenderer_p.h b/src/render/backend/abstractrenderer_p.h
index 020aa6c9f..4fa9dca55 100644
--- a/src/render/backend/abstractrenderer_p.h
+++ b/src/render/backend/abstractrenderer_p.h
@@ -54,6 +54,7 @@
#include <QtCore/qmutex.h>
#include <Qt3DRender/private/qt3drender_global_p.h>
#include <Qt3DRender/private/handle_types_p.h>
+#include <Qt3DRender/qrenderapi.h>
#include <Qt3DCore/qaspectjob.h>
#include <Qt3DCore/qnodeid.h>
#include <QtGui/qsurfaceformat.h>
@@ -97,12 +98,6 @@ class Q_3DRENDERSHARED_PRIVATE_EXPORT AbstractRenderer
public:
virtual ~AbstractRenderer() {}
- enum API {
- OpenGL,
- Vulkan,
- DirectX
- };
-
// Changes made to backend nodes are reported to the Renderer
enum BackendNodeDirtyFlag {
TransformDirty = 1 << 0,
diff --git a/src/render/backend/resourceaccessor.cpp b/src/render/backend/resourceaccessor.cpp
index ebc55c7ca..e6ed4262b 100644
--- a/src/render/backend/resourceaccessor.cpp
+++ b/src/render/backend/resourceaccessor.cpp
@@ -80,7 +80,7 @@ bool ResourceAccessor::accessResource(ResourceType type,
Q_FALLTHROUGH();
case RenderBackendResourceAccessor::OGLTextureRead:
{
- if (m_renderer->api() != AbstractRenderer::OpenGL) {
+ if (m_renderer->api() != API::OpenGL) {
qWarning() << "Renderer plugin is not compatible with Scene2D";
return false;
}
diff --git a/src/render/frontend/qrenderapi.h b/src/render/frontend/qrenderapi.h
new file mode 100644
index 000000000..fc046642a
--- /dev/null
+++ b/src/render/frontend/qrenderapi.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DRENDER_QRENDERAPI_H
+#define QT3DRENDER_QRENDERAPI_H
+
+#include <Qt3DRender/qt3drender_global.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender {
+
+enum class API {
+ OpenGL,
+ Vulkan,
+ DirectX,
+ Metal,
+ Null
+};
+
+} // namespace Qt3Drender
+
+QT_END_NAMESPACE
+
+#endif // QT3DRENDER_QRENDERAPI_H
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 9d5058ec8..a0b8ab8f3 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -532,7 +532,7 @@ QRenderAspect::~QRenderAspect()
// Called by Scene3DRenderer only
void QRenderAspectPrivate::renderInitialize(QOpenGLContext *context)
{
- if (m_renderer->api() == Render::AbstractRenderer::OpenGL)
+ if (m_renderer->api() == API::OpenGL)
m_renderer->setOpenGLContext(context);
m_renderer->initialize();
}
diff --git a/src/render/frontend/qrendercapabilities.h b/src/render/frontend/qrendercapabilities.h
index 14e233f59..2470922af 100644
--- a/src/render/frontend/qrendercapabilities.h
+++ b/src/render/frontend/qrendercapabilities.h
@@ -87,7 +87,7 @@ class Q_3DRENDERSHARED_EXPORT QRenderCapabilities : public QObject
public:
enum API {
OpenGL = QSurfaceFormat::OpenGL,
- OpenGLES = QSurfaceFormat::OpenGLES,
+ OpenGLES = QSurfaceFormat::OpenGLES
};
Q_ENUM(API)
diff --git a/src/render/frontend/render-frontend.pri b/src/render/frontend/render-frontend.pri
index 694b5cfc1..dfcece93f 100644
--- a/src/render/frontend/render-frontend.pri
+++ b/src/render/frontend/render-frontend.pri
@@ -29,6 +29,7 @@ HEADERS += \
$$PWD/qrenderpluginfactory_p.h \
$$PWD/qrenderpluginfactoryif_p.h \
$$PWD/qlevelofdetailboundingsphere.h \
+ $$PWD/qrenderapi.h \
$$PWD/qrendercapabilities.h \
$$PWD/qrendercapabilities_p.h