summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2020-08-10 09:44:21 +0300
committerKaj Grönholm <kaj.gronholm@qt.io>2020-08-12 11:11:12 +0300
commit9a4d4f829867f82110c734a8780e0bd4a7f44be7 (patch)
tree62659829166804c44f5fd4c61abe6173bdb4382e
parent9f5140ba5fccda4d3c2e7061ce9bb4518149c370 (diff)
Fix stereoscopic rendering with subpresentations
Viewports of subpresentations should not be reduced in stereoscopic modes. Task-number: QT3DS-4141 Change-Id: Ie96ff296bec2d11b215f36e08df23911f18fbba2 Reviewed-by: Antti Määttä <antti.maatta@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--src/runtimerender/Qt3DSRenderSubpresentation.cpp2
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderScene.cpp1
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderScene.h1
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp6
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp10
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h4
6 files changed, 18 insertions, 6 deletions
diff --git a/src/runtimerender/Qt3DSRenderSubpresentation.cpp b/src/runtimerender/Qt3DSRenderSubpresentation.cpp
index 8b13361..834d773 100644
--- a/src/runtimerender/Qt3DSRenderSubpresentation.cpp
+++ b/src/runtimerender/Qt3DSRenderSubpresentation.cpp
@@ -81,6 +81,7 @@ namespace render {
const SRenderInstanceId instanceId)
{
NVRenderRect theViewportSize(inRenderContext.GetViewport());
+ m_Presentation.m_Scene->m_IsSubPresentationScene = true;
m_Presentation.m_Scene->Render(
QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height),
m_RenderContext, inClearColorBuffer, instanceId);
@@ -96,6 +97,7 @@ namespace render {
Q_UNUSED(inEnvironment);
Q_UNUSED(inPresScale);
NVRenderRect theViewportSize(inRenderContext.GetViewport());
+ m_Presentation.m_Scene->m_IsSubPresentationScene = true;
m_Presentation.m_Scene->RenderWithClear(
QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height),
m_RenderContext, inClearBuffer, inClearColor, id);
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp b/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp
index afe68d5..3d14f9c 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp
+++ b/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp
@@ -42,6 +42,7 @@ SScene::SScene()
, m_ClearColor(0.0f)
, m_UseClearColor(true)
, m_Dirty(true)
+ , m_IsSubPresentationScene(false)
{
}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderScene.h b/src/runtimerender/graphobjects/Qt3DSRenderScene.h
index 00a4591..a2f86b9 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderScene.h
+++ b/src/runtimerender/graphobjects/Qt3DSRenderScene.h
@@ -47,6 +47,7 @@ namespace render {
QT3DSVec4 m_ClearColor;
bool m_UseClearColor;
bool m_Dirty;
+ bool m_IsSubPresentationScene;
enum RenderClearCommand {
ClearIsOptional = 0,
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
index 3c6e1c3..9f06764 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
@@ -2090,10 +2090,12 @@ void SLayerRenderData::RunRenderPass(TRenderRenderableFunction inRenderFn,
// transform.
QT3DSMat44 theFinalMVP(QT3DSMat44::createIdentity());
SCamera theTempCamera;
+ // When layer & scene are part of subpresentation, ignore stereoscopic viewport adjustments
+ bool noStereo = m_Layer.m_Scene && m_Layer.m_Scene->m_IsSubPresentationScene;
NVRenderRect theLayerViewport(
- thePrepResult.GetLayerToPresentationViewport().ToIntegerRect());
+ thePrepResult.GetLayerToPresentationViewport(noStereo).ToIntegerRect());
NVRenderRect theLayerClip(
- thePrepResult.GetLayerToPresentationScissorRect().ToIntegerRect());
+ thePrepResult.GetLayerToPresentationScissorRect(noStereo).ToIntegerRect());
{
QT3DSMat33 ignored;
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp
index c28585e..a9c7f4c 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp
@@ -207,8 +207,11 @@ NVRenderRectF SLayerRenderHelper::GetLayerRenderViewport() const
return m_Viewport;
}
-NVRenderRectF SLayerRenderHelper::GetLayerToPresentationViewport() const
+NVRenderRectF SLayerRenderHelper::GetLayerToPresentationViewport(bool noStereo) const
{
+ if (noStereo)
+ return m_Viewport;
+
if (m_StereoMode == StereoModes::LeftRight) {
if (m_StereoView == StereoViews::Left) {
return NVRenderRectF(m_Viewport.m_X, m_Viewport.m_Y, m_Viewport.m_Width/2,
@@ -231,8 +234,11 @@ NVRenderRectF SLayerRenderHelper::GetLayerToPresentationViewport() const
return m_Viewport;
}
-NVRenderRectF SLayerRenderHelper::GetLayerToPresentationScissorRect() const
+NVRenderRectF SLayerRenderHelper::GetLayerToPresentationScissorRect(bool noStereo) const
{
+ if (noStereo)
+ return m_Scissor;
+
if (m_StereoMode == StereoModes::LeftRight) {
if (m_StereoView == StereoViews::Left) {
return NVRenderRectF(m_Scissor.m_X, m_Scissor.m_Y,
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h
index 59f4e08..7d2254a 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h
@@ -108,10 +108,10 @@ namespace render {
// Does not differ whether offscreen or not, simply states how this layer maps to the
// presentation
NVRenderRectF getOriginalLayerToPresentationViewport() const;
- NVRenderRectF GetLayerToPresentationViewport() const;
+ NVRenderRectF GetLayerToPresentationViewport(bool noStereo = false) const;
// Does not differ whether offscreen or not, scissor rect of how this layer maps to
// presentation.
- NVRenderRectF GetLayerToPresentationScissorRect() const;
+ NVRenderRectF GetLayerToPresentationScissorRect(bool noStereo = false) const;
QSize GetTextureDimensions() const;