diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-07-30 11:48:23 +0200 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2020-08-05 22:14:14 +0100 |
commit | 56894e7a31ae2bd5433873a7035a74057747bcf2 (patch) | |
tree | 438e6845d08663e46b70f4478e0d13f172257d7f /tests/manual | |
parent | 7047a70835bcb7ff9ef429f08e855f53e275ade4 (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.pro | 6 | ||||
-rw-r--r-- | tests/manual/rhi/CMakeLists.txt | 35 | ||||
-rw-r--r-- | tests/manual/rhi/rhi.pro | 13 | ||||
-rw-r--r-- | tests/manual/rhi/simple-rhi-cpp/CMakeLists.txt | 33 | ||||
-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) | bin | 11386 -> 11386 bytes | |||
-rw-r--r-- | tests/manual/rhi/simple-rhi-cpp/simple-rhi-cpp.pro | 10 | ||||
-rw-r--r-- | tests/manual/rhi/ubo/CMakeLists.txt | 40 | ||||
-rw-r--r-- | tests/manual/rhi/ubo/main.cpp | 63 | ||||
-rw-r--r-- | tests/manual/rhi/ubo/main.qml | 246 | ||||
-rw-r--r-- | tests/manual/rhi/ubo/ubo.pro | 10 |
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 Binary files differindex 19eecfabf..19eecfabf 100644 --- a/tests/manual/rhi/qtlogo.png +++ b/tests/manual/rhi/simple-rhi-cpp/qtlogo.png 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 |