summaryrefslogtreecommitdiffstats
path: root/tests/manual
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-07-30 11:48:23 +0200
committerMike Krus <mike.krus@kdab.com>2020-08-05 22:14:14 +0100
commit56894e7a31ae2bd5433873a7035a74057747bcf2 (patch)
tree438e6845d08663e46b70f4478e0d13f172257d7f /tests/manual
parent7047a70835bcb7ff9ef429f08e855f53e275ade4 (diff)
Complete UBO/SSBO support
Up until now, we would expect Parameters to be a single value mapping to one of the UBO's member This patch adds handling for the following cases: - A parameter can now reference a UBO Buffer This allows filling all the members of a UBO block at once Note: Since we internally create a single UBO for all commands sharing the same pipeline, we will copy the content of the user provided UBO at the proper position inside the larger single UBO. - A parameter can now reference a ShaderData This allows to fill a struct member of a UBO block - SSBOs are now handled when creating the ShaderResourceBindinds We don't do any magic with these, a RHI SSBO maps to a Qt3D Buffer Change-Id: I68f9e527a0b0137f460cb3a99c469318f2ee5d98 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'tests/manual')
-rw-r--r--tests/manual/manual.pro6
-rw-r--r--tests/manual/rhi/CMakeLists.txt35
-rw-r--r--tests/manual/rhi/rhi.pro13
-rw-r--r--tests/manual/rhi/simple-rhi-cpp/CMakeLists.txt33
-rw-r--r--tests/manual/rhi/simple-rhi-cpp/main.cpp (renamed from tests/manual/rhi/main.cpp)0
-rw-r--r--tests/manual/rhi/simple-rhi-cpp/qtlogo.png (renamed from tests/manual/rhi/qtlogo.png)bin11386 -> 11386 bytes
-rw-r--r--tests/manual/rhi/simple-rhi-cpp/simple-rhi-cpp.pro10
-rw-r--r--tests/manual/rhi/ubo/CMakeLists.txt40
-rw-r--r--tests/manual/rhi/ubo/main.cpp63
-rw-r--r--tests/manual/rhi/ubo/main.qml246
-rw-r--r--tests/manual/rhi/ubo/ubo.pro10
11 files changed, 413 insertions, 43 deletions
diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro
index c64044464..1a5689bc6 100644
--- a/tests/manual/manual.pro
+++ b/tests/manual/manual.pro
@@ -12,9 +12,13 @@ SUBDIRS += \
raster-cpp \
qtbug-72236 \
manual-renderloop \
- rhi \
boundingvolumes
+QT_FOR_CONFIG += 3drender-private
+qtConfig(qt3d-rhi-renderer): {
+ SUBDIRS += \
+ rhi
+}
qtHaveModule(multimedia): {
SUBDIRS += \
diff --git a/tests/manual/rhi/CMakeLists.txt b/tests/manual/rhi/CMakeLists.txt
index 08074d3a7..57860bc67 100644
--- a/tests/manual/rhi/CMakeLists.txt
+++ b/tests/manual/rhi/CMakeLists.txt
@@ -1,33 +1,2 @@
-# Generated from rhi.pro.
-
-#####################################################################
-## rhi Binary:
-#####################################################################
-
-qt_add_manual_test(rhi
- GUI
- SOURCES
- main.cpp
- PUBLIC_LIBRARIES
- Qt::3DCore
- Qt::3DExtras
- Qt::3DInput
- Qt::3DRender
- Qt::Gui
-)
-
-# Resources:
-set(qmake_immediate_resource_files
- "qtlogo.png"
-)
-
-qt_add_resource(rhi "qmake_immediate"
- PREFIX
- "/"
- FILES
- ${qmake_immediate_resource_files}
-)
-
-
-## Scopes:
-#####################################################################
+add_subdirectory(simple-rhi-cpp)
+add_subdirectory(ubo)
diff --git a/tests/manual/rhi/rhi.pro b/tests/manual/rhi/rhi.pro
index 94e560391..fcccdbacb 100644
--- a/tests/manual/rhi/rhi.pro
+++ b/tests/manual/rhi/rhi.pro
@@ -1,10 +1,5 @@
-!include( ../manual.pri ) {
- error( "Couldn't find the manual.pri file!" )
-}
+TEMPLATE = subdirs
-QT += 3dcore 3drender 3dinput 3dextras
-
-SOURCES += \
- main.cpp
-
-RESOURCES += qtlogo.png
+SUBDIRS += \
+ simple-rhi-cpp \
+ ubo
diff --git a/tests/manual/rhi/simple-rhi-cpp/CMakeLists.txt b/tests/manual/rhi/simple-rhi-cpp/CMakeLists.txt
new file mode 100644
index 000000000..5d2f3338b
--- /dev/null
+++ b/tests/manual/rhi/simple-rhi-cpp/CMakeLists.txt
@@ -0,0 +1,33 @@
+# Generated from simple-rhi-cpp.pro.
+
+#####################################################################
+## simple-rhi-cpp Binary:
+#####################################################################
+
+qt_add_manual_test(simple-rhi-cpp
+ GUI
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ Qt::3DCore
+ Qt::3DExtras
+ Qt::3DInput
+ Qt::3DRender
+ Qt::Gui
+)
+
+# Resources:
+set(qmake_immediate_resource_files
+ "qtlogo.png"
+)
+
+qt_add_resource(simple-rhi-cpp "qmake_immediate"
+ PREFIX
+ "/"
+ FILES
+ ${qmake_immediate_resource_files}
+)
+
+
+## Scopes:
+#####################################################################
diff --git a/tests/manual/rhi/main.cpp b/tests/manual/rhi/simple-rhi-cpp/main.cpp
index 123647ac1..123647ac1 100644
--- a/tests/manual/rhi/main.cpp
+++ b/tests/manual/rhi/simple-rhi-cpp/main.cpp
diff --git a/tests/manual/rhi/qtlogo.png b/tests/manual/rhi/simple-rhi-cpp/qtlogo.png
index 19eecfabf..19eecfabf 100644
--- a/tests/manual/rhi/qtlogo.png
+++ b/tests/manual/rhi/simple-rhi-cpp/qtlogo.png
Binary files differ
diff --git a/tests/manual/rhi/simple-rhi-cpp/simple-rhi-cpp.pro b/tests/manual/rhi/simple-rhi-cpp/simple-rhi-cpp.pro
new file mode 100644
index 000000000..2d5a4a97c
--- /dev/null
+++ b/tests/manual/rhi/simple-rhi-cpp/simple-rhi-cpp.pro
@@ -0,0 +1,10 @@
+!include( ../../manual.pri ) {
+ error( "Couldn't find the manual.pri file!" )
+}
+
+QT += 3dcore 3drender 3dinput 3dextras
+
+SOURCES += \
+ main.cpp
+
+RESOURCES += qtlogo.png
diff --git a/tests/manual/rhi/ubo/CMakeLists.txt b/tests/manual/rhi/ubo/CMakeLists.txt
new file mode 100644
index 000000000..24fa81a95
--- /dev/null
+++ b/tests/manual/rhi/ubo/CMakeLists.txt
@@ -0,0 +1,40 @@
+#####################################################################
+## ubo Binary:
+#####################################################################
+
+qt_add_manual_test(ubo
+ GUI
+ SOURCES
+ main.cpp
+ PUBLIC_LIBRARIES
+ Qt::3DCore
+ Qt::3DExtras
+ Qt::3DInput
+ Qt::3DRender
+ Qt::3DQuick
+ Qt::3DQuickExtras
+ Qt::Gui
+ Qt::Qml
+ Qt::Quick
+)
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Qml)
+find_package(Qt6 COMPONENTS Quick)
+
+# Resources:
+set(qmake_immediate_resource_files
+ "main.qml"
+)
+
+qt_add_resource(ubo "qmake_immediate"
+ PREFIX
+ "/"
+ FILES
+ ${qmake_immediate_resource_files}
+)
+
+
+## Scopes:
+#####################################################################
diff --git a/tests/manual/rhi/ubo/main.cpp b/tests/manual/rhi/ubo/main.cpp
new file mode 100644
index 000000000..8e7ebae6a
--- /dev/null
+++ b/tests/manual/rhi/ubo/main.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGuiApplication>
+#include <Qt3DQuickExtras/qt3dquickwindow.h>
+
+int main(int ac, char **av)
+{
+ qputenv("QT3D_RENDERER", "rhi");
+ QGuiApplication app(ac, av);
+ Qt3DExtras::Quick::Qt3DQuickWindow view;
+ view.setSource(QUrl("qrc:/main.qml"));
+ view.show();
+
+ return app.exec();
+}
diff --git a/tests/manual/rhi/ubo/main.qml b/tests/manual/rhi/ubo/main.qml
new file mode 100644
index 000000000..b658a55b7
--- /dev/null
+++ b/tests/manual/rhi/ubo/main.qml
@@ -0,0 +1,246 @@
+/****************************************************************************
+**
+** 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15 as QQ2
+import Qt3D.Core 2.15
+import Qt3D.Render 2.15
+import Qt3D.Input 2.15
+import Qt3D.Extras 2.15
+
+Entity {
+ id: sceneRoot
+
+ Camera {
+ id: camera
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ aspectRatio: 16/9
+ nearPlane : 0.1
+ farPlane : 1000.0
+ position: Qt.vector3d( 0.0, 0.0, -40.0 )
+ upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
+ viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
+ }
+
+ OrbitCameraController {
+ camera: camera
+ }
+
+ components: [
+ RenderSettings {
+ activeFrameGraph: ForwardRenderer {
+ clearColor: Qt.rgba(0, 0.5, 1, 1)
+ camera: camera
+ showDebugOverlay: true
+ }
+ },
+ // Event Source will be set by the Qt3DQuickWindow
+ InputSettings { }
+ ]
+
+ Material {
+ id: material
+ effect: Effect {
+ techniques: [
+ Technique {
+ filterKeys: FilterKey {
+ name: "renderingStyle"
+ value: "forward"
+ }
+ graphicsApiFilter {
+ api: GraphicsApiFilter.RHI
+ majorVersion: 1
+ minorVersion: 0
+ }
+ renderPasses: RenderPass {
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: "
+ #version 450
+
+ layout(location = 0) in vec3 vertexPosition;
+
+ layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+ };
+
+ layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+ };
+
+ void main()
+ {
+ gl_Position = modelViewProjection * vec4(vertexPosition, 1.0);
+ }
+ "
+
+ fragmentShaderCode: "
+ #version 450
+
+ layout(location = 0) out vec4 fragColor;
+
+ layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+ };
+
+ struct MyStruct {
+ vec4 factor;
+ };
+
+ layout(std140, binding = 2) uniform CustomUBO1 {
+ vec4 baseColor;
+ };
+
+ layout(std140, binding = 3) uniform CustomUBO2 {
+ MyStruct innerStruct;
+ vec4 accentColor;
+ };
+
+ void main()
+ {
+ fragColor = baseColor * abs(sin(time)) + accentColor * innerStruct.factor;
+ }
+ "
+ }
+ }
+ }
+ ]
+ }
+
+ parameters: [
+ // User provided UBO
+ Parameter {
+ name: "CustomUBO1"
+ value: Buffer {
+ data: {
+ var bufferData = new Float32Array(4);
+ bufferData[0] = 0.5;
+ bufferData[1] = 0.5;
+ bufferData[2] = 0.5;
+ bufferData[3] = 1.0;
+ return bufferData
+ }
+ }
+ },
+ // Regular parameter that maps to UBO member
+ Parameter {
+ name: "accentColor"
+ value: "yellow"
+ },
+ Parameter {
+ name: "innerStruct"
+ value: ShaderData {
+ property vector4d factor: Qt.vector4d(0.5, 0.5, 0.5, 0.0)
+ }
+ }
+ ]
+ }
+
+ TorusMesh {
+ id: torusMesh
+ radius: 5
+ minorRadius: 1
+ rings: 100
+ slices: 20
+ }
+
+ Transform {
+ id: torusTransform
+ scale3D: Qt.vector3d(1.5, 1, 0.5)
+ rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 45)
+ }
+
+ Entity {
+ id: torusEntity
+ components: [ torusMesh, material, torusTransform ]
+ }
+
+ // QQ2.NumberAnimation {
+ // target: torusTransform
+ // property: "userAngle"
+ // duration: 10000
+ // from: 0
+ // to: 360
+
+ // loops: QQ2.Animation.Infinite
+ // running: true
+ // }
+}
diff --git a/tests/manual/rhi/ubo/ubo.pro b/tests/manual/rhi/ubo/ubo.pro
new file mode 100644
index 000000000..6fb2c223d
--- /dev/null
+++ b/tests/manual/rhi/ubo/ubo.pro
@@ -0,0 +1,10 @@
+!include( ../../manual.pri ) {
+ error( "Couldn't find the manual.pri file!" )
+}
+
+QT += 3dcore 3drender 3dinput 3dextras
+
+SOURCES += \
+ main.cpp
+
+RESOURCES += main.qml