aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2024-05-02 13:42:21 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2024-05-07 11:41:55 +0200
commit31980a6537b0d6452e7893e7ba336d4fd0604e50 (patch)
treeb150d6ad0f9fba6a4bc3f18635d6a7d54bf9cf75
parent8acd93a4b78bb114c3d300c830f7aa4585fb2ab6 (diff)
Start enabling postproc effects in multiview mode
Won't work still, but for reasons different than before. Plus some qmlxr test assets. Change-Id: Ia7a81b0310d4006b14354e5d897493a73b142537 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r--src/quick3d/qquick3dscenerenderer.cpp6
-rw-r--r--src/runtimerender/qssgrhieffectsystem.cpp10
-rw-r--r--src/runtimerender/qssgrhieffectsystem_p.h3
-rw-r--r--tests/manual/qmlxr/testscenes/effect.qml77
-rw-r--r--tests/manual/qmlxr/testscenes/maps/checkers2.pngbin0 -> 192 bytes
-rw-r--r--tests/manual/qmlxr/testscenes/spiral.frag15
-rw-r--r--tests/manual/qmlxr/testscenes/spiral.vert6
-rw-r--r--tools/shadergen/genshaders.cpp3
8 files changed, 113 insertions, 7 deletions
diff --git a/src/quick3d/qquick3dscenerenderer.cpp b/src/quick3d/qquick3dscenerenderer.cpp
index 992935e8..5576b0da 100644
--- a/src/quick3d/qquick3dscenerenderer.cpp
+++ b/src/quick3d/qquick3dscenerenderer.cpp
@@ -297,7 +297,7 @@ QRhiTexture *QQuick3DSceneRenderer::renderToRhiTexture(QQuickWindow *qw)
// renderer needs to know the value.
rhiCtxD->setMainPassSampleCount(m_msaaRenderBuffer ? m_msaaRenderBuffer->sampleCount() : 1);
- rhiCtxD->setMainPassViewCount(1); // ### multiview for postproc effects?
+ // mainPassViewCount is left unchanged
int ssaaAdjustedWidth = m_surfaceSize.width();
int ssaaAdjustedHeight = m_surfaceSize.height();
@@ -1483,7 +1483,11 @@ void QQuick3DSGDirectRenderer::prepare()
if (m_renderer->m_postProcessingStack) {
if (renderPending) {
renderPending = false;
+ // Make sure stuff on the rhiContext is set before invoking
+ // renderToRhiTexture() since the effect system may rely on some of it.
+ queryMainRenderPassDescriptorAndCommandBuffer(m_window, m_renderer->m_sgContext->rhiContext().get());
m_rhiTexture = m_renderer->renderToRhiTexture(m_window);
+ // Set up the main render target again, the effect stuff may have changed some settings (e.g. the sample count).
queryMainRenderPassDescriptorAndCommandBuffer(m_window, m_renderer->m_sgContext->rhiContext().get());
const auto &quadRenderer = m_renderer->m_sgContext->renderer()->rhiQuadRenderer();
quadRenderer->prepareQuad(m_renderer->m_sgContext->rhiContext().get(), nullptr);
diff --git a/src/runtimerender/qssgrhieffectsystem.cpp b/src/runtimerender/qssgrhieffectsystem.cpp
index 834f30ee..965437e2 100644
--- a/src/runtimerender/qssgrhieffectsystem.cpp
+++ b/src/runtimerender/qssgrhieffectsystem.cpp
@@ -381,7 +381,8 @@ QSSGRhiShaderPipelinePtr QSSGRhiEffectSystem::buildShaderForEffect(const QSSGBin
QSSGProgramGenerator &generator,
QSSGShaderLibraryManager &shaderLib,
QSSGShaderCache &shaderCache,
- bool isYUpInFramebuffer)
+ bool isYUpInFramebuffer,
+ int viewCount)
{
const auto &key = inCmd.m_shaderPathKey;
qCDebug(lcEffectSystem) << " generating new shader pipeline for: " << key;
@@ -407,7 +408,7 @@ QSSGRhiShaderPipelinePtr QSSGRhiEffectSystem::buildShaderForEffect(const QSSGBin
shaderLib,
shaderCache,
QSSGRhiShaderPipeline::UsedWithoutIa,
- 1, // ### multiview for postproc effects?
+ viewCount,
false);
}
@@ -420,7 +421,8 @@ void QSSGRhiEffectSystem::bindShaderCmd(const QSSGBindShader *inCmd, const QSSGR
m_pendingClears.clear();
m_currentShaderPipeline = nullptr;
- QRhi *rhi = m_sgContext->rhiContext()->rhi();
+ const auto &rhiCtx = m_sgContext->rhiContext();
+ QRhi *rhi = rhiCtx->rhi();
const auto &shaderLib = m_sgContext->shaderLibraryManager();
const auto &shaderCache = m_sgContext->shaderCache();
@@ -486,7 +488,7 @@ void QSSGRhiEffectSystem::bindShaderCmd(const QSSGBindShader *inCmd, const QSSGR
Q_TRACE_SCOPE(QSSG_generateShader);
Q_QUICK3D_PROFILE_START(QQuick3DProfiler::Quick3DGenerateShader);
const auto &generator = m_sgContext->shaderProgramGenerator();
- if (auto stages = buildShaderForEffect(*inCmd, *generator, *shaderLib, *shaderCache, rhi->isYUpInFramebuffer())) {
+ if (auto stages = buildShaderForEffect(*inCmd, *generator, *shaderLib, *shaderCache, rhi->isYUpInFramebuffer(), rhiCtx->mainPassViewCount())) {
m_shaderPipelines.insert(cacheKey, stages);
m_currentShaderPipeline = stages.get();
}
diff --git a/src/runtimerender/qssgrhieffectsystem_p.h b/src/runtimerender/qssgrhieffectsystem_p.h
index 102a27ca..64c3b2b4 100644
--- a/src/runtimerender/qssgrhieffectsystem_p.h
+++ b/src/runtimerender/qssgrhieffectsystem_p.h
@@ -78,7 +78,8 @@ public:
QSSGProgramGenerator &generator,
QSSGShaderLibraryManager &shaderLib,
QSSGShaderCache &shaderCache,
- bool isYUpInFramebuffer);
+ bool isYUpInFramebuffer,
+ int viewCount);
private:
void releaseResources();
diff --git a/tests/manual/qmlxr/testscenes/effect.qml b/tests/manual/qmlxr/testscenes/effect.qml
new file mode 100644
index 00000000..564d8cee
--- /dev/null
+++ b/tests/manual/qmlxr/testscenes/effect.qml
@@ -0,0 +1,77 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick3D
+
+Node {
+ property vector3d qmlxr_originPosition: Qt.vector3d(0, 200, 300)
+ property vector3d qmlxr_originRotation: Qt.vector3d(-20, 0, 0)
+
+ property SceneEnvironment qmlxr_environment: SceneEnvironment {
+ clearColor: "skyblue"
+ backgroundMode: SceneEnvironment.Color
+
+ effects: [ spiralEffect ]
+ }
+
+ Effect {
+ id: spiralEffect
+ passes: Pass {
+ shaders: [
+ Shader {
+ stage: Shader.Vertex
+ shader: "spiral.vert"
+ },
+ Shader {
+ stage: Shader.Fragment
+ shader: "spiral.frag"
+ }
+ ]
+ }
+ }
+
+ DirectionalLight {
+ eulerRotation.x: -20
+ eulerRotation.y: 20
+ ambientColor: Qt.rgba(0.8, 0.8, 0.8, 1.0);
+ }
+
+ Texture {
+ id: checkers
+ source: "maps/checkers2.png"
+ scaleU: 20
+ scaleV: 20
+ tilingModeHorizontal: Texture.Repeat
+ tilingModeVertical: Texture.Repeat
+ }
+
+ Model {
+ source: "#Rectangle"
+ scale.x: 10
+ scale.y: 10
+ eulerRotation.x: -90
+ materials: [ DefaultMaterial { diffuseMap: checkers } ]
+ }
+
+ Model {
+ source: "#Cone"
+ position: Qt.vector3d(100, 0, -200)
+ scale.y: 3
+ materials: [ DefaultMaterial { diffuseColor: "green" } ]
+ }
+
+ Model {
+ id: sphere
+ source: "#Sphere"
+ position: Qt.vector3d(-100, 200, -200)
+ materials: [ DefaultMaterial { diffuseColor: "#808000" } ]
+ }
+
+ Model {
+ source: "#Cube"
+ position.y: 50
+ eulerRotation.y: 20
+ materials: [ DefaultMaterial { diffuseColor: "gray" } ]
+ }
+}
diff --git a/tests/manual/qmlxr/testscenes/maps/checkers2.png b/tests/manual/qmlxr/testscenes/maps/checkers2.png
new file mode 100644
index 00000000..b23f805e
--- /dev/null
+++ b/tests/manual/qmlxr/testscenes/maps/checkers2.png
Binary files differ
diff --git a/tests/manual/qmlxr/testscenes/spiral.frag b/tests/manual/qmlxr/testscenes/spiral.frag
new file mode 100644
index 00000000..d951cadc
--- /dev/null
+++ b/tests/manual/qmlxr/testscenes/spiral.frag
@@ -0,0 +1,15 @@
+VARYING vec2 center_vec;
+
+void MAIN()
+{
+ float radius = 0.25;
+ float dist_to_center = length(center_vec) / radius;
+ vec2 texcoord = INPUT_UV;
+ if (dist_to_center <= 1.0) {
+ float rotation_amount = (1.0 - dist_to_center) * (1.0 - dist_to_center);
+ float r = radians(360.0) * rotation_amount / 4.0;
+ mat2 rotation = mat2(cos(r), sin(r), -sin(r), cos(r));
+ texcoord = vec2(0.5, 0.5) + rotation * (INPUT_UV - vec2(0.5, 0.5));
+ }
+ FRAGCOLOR = texture(INPUT, texcoord);
+}
diff --git a/tests/manual/qmlxr/testscenes/spiral.vert b/tests/manual/qmlxr/testscenes/spiral.vert
new file mode 100644
index 00000000..81a034f0
--- /dev/null
+++ b/tests/manual/qmlxr/testscenes/spiral.vert
@@ -0,0 +1,6 @@
+VARYING vec2 center_vec;
+void MAIN()
+{
+ center_vec = INPUT_UV - vec2(0.5, 0.5);
+ center_vec.y *= INPUT_SIZE.y / INPUT_SIZE.x;
+}
diff --git a/tools/shadergen/genshaders.cpp b/tools/shadergen/genshaders.cpp
index d561349c..5d87a180 100644
--- a/tools/shadergen/genshaders.cpp
+++ b/tools/shadergen/genshaders.cpp
@@ -313,7 +313,8 @@ bool GenShaders::process(const MaterialParser::SceneData &sceneData,
*shaderProgramGenerator,
*shaderLibraryManager,
*shaderCache,
- isYUpInFramebuffer);
+ isYUpInFramebuffer,
+ 1); // no multiview support here yet
if (shaderPipeline) {
const auto &key = bindShaderCommand.m_shaderPathKey;
const QSSGShaderFeatures features = shaderLibraryManager->getShaderMetaData(key, QSSGShaderCache::ShaderType::Fragment).features;