summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2020-01-29 10:45:53 +0200
committerKaj Grönholm <kaj.gronholm@qt.io>2020-02-20 12:26:24 +0200
commit84cf9a4f3343df8a646a07bc445c2417b87c945d (patch)
tree2a37e87c5759bf3c116538936d68bb32c589e338
parent6b69e1e46197fd4113e7001042765386c3b7356d (diff)
Stereoscopic rendering optimizations
Avoid some extra work while rendering in stereoscopic modes. Task-number: QT3DS-4044 Change-Id: Ia8f6bf07e4063f2da2054e4f384e28abe0a4b077 Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r--src/engine/Qt3DSRenderRuntimeBinding.cpp48
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.cpp99
2 files changed, 79 insertions, 68 deletions
diff --git a/src/engine/Qt3DSRenderRuntimeBinding.cpp b/src/engine/Qt3DSRenderRuntimeBinding.cpp
index e830e0f..7535af6 100644
--- a/src/engine/Qt3DSRenderRuntimeBinding.cpp
+++ b/src/engine/Qt3DSRenderRuntimeBinding.cpp
@@ -1511,26 +1511,30 @@ struct Qt3DSRenderSceneManager : public Q3DStudio::ISceneManager,
m_Scenes[idx].second->TransferDirtyProperties();
}
- if (theFirstScene && theFirstScene->m_Presentation) {
- m_LastRenderedScene = theFirstScene;
- if (theFirstScene->m_Presentation->m_Scene
- && theFirstScene->m_Presentation->m_Scene->m_UseClearColor) {
- m_Context->m_Context->SetSceneColor(
- theFirstScene->m_Presentation->m_Scene->m_ClearColor);
- } else
- m_Context->m_Context->SetSceneColor(QT3DSVec4(0.0f, 0.0f, 0.0f, 0.0f));
-
- // Setup the render rotation *before* rendering so that the magic can happen on begin
- // render.
- if (m_Context->m_RenderRotationsEnabled)
- m_Context->m_Context->SetRenderRotation(
- theFirstScene->m_Presentation->m_PresentationRotation);
- else
- m_Context->m_Context->SetRenderRotation(RenderRotationValues::NoRotation);
+ if (m_Context->m_Context->GetStereoView() != StereoViews::Right) {
+ if (theFirstScene && theFirstScene->m_Presentation) {
+ m_LastRenderedScene = theFirstScene;
+ if (theFirstScene->m_Presentation->m_Scene
+ && theFirstScene->m_Presentation->m_Scene->m_UseClearColor) {
+ m_Context->m_Context->SetSceneColor(
+ theFirstScene->m_Presentation->m_Scene->m_ClearColor);
+ } else {
+ m_Context->m_Context->SetSceneColor(QT3DSVec4(0.0f, 0.0f, 0.0f, 0.0f));
+ }
- m_Context->m_Context->SetPresentationDimensions(QSize(
- int(theFirstScene->m_Presentation->m_PresentationDimensions.x),
- int(theFirstScene->m_Presentation->m_PresentationDimensions.y)));
+ // Setup the render rotation *before* rendering so that the magic
+ // can happen on begin render.
+ if (m_Context->m_RenderRotationsEnabled) {
+ m_Context->m_Context->SetRenderRotation(
+ theFirstScene->m_Presentation->m_PresentationRotation);
+ } else {
+ m_Context->m_Context->SetRenderRotation(RenderRotationValues::NoRotation);
+ }
+
+ m_Context->m_Context->SetPresentationDimensions(QSize(
+ int(theFirstScene->m_Presentation->m_PresentationDimensions.x),
+ int(theFirstScene->m_Presentation->m_PresentationDimensions.y)));
+ }
}
m_Context->m_Context->BeginFrame(firstFrame);
@@ -1554,7 +1558,11 @@ struct Qt3DSRenderSceneManager : public Q3DStudio::ISceneManager,
if (theFirstScene)
theFirstScene->Render();
- m_Context->m_Context->EndFrame();
+ if (m_Context->m_Context->GetStereoMode() == StereoModes::Mono
+ || m_Context->m_Context->GetStereoView() == StereoViews::Right) {
+ // For stereo, run endframe only after right eye
+ m_Context->m_Context->EndFrame();
+ }
return wasDirty;
}
diff --git a/src/runtimerender/Qt3DSRenderContextCore.cpp b/src/runtimerender/Qt3DSRenderContextCore.cpp
index 50042d1..484a805 100644
--- a/src/runtimerender/Qt3DSRenderContextCore.cpp
+++ b/src/runtimerender/Qt3DSRenderContextCore.cpp
@@ -667,56 +667,58 @@ struct SRenderContext : public IQt3DSRenderContext
void BeginFrame(bool firstFrame) override
{
- m_PreRenderPresentationDimensions = m_PresentationDimensions;
- QSize thePresentationDimensions(m_PreRenderPresentationDimensions);
- NVRenderRect theContextViewport(GetContextViewport());
- m_PerFrameAllocator.reset();
- IRenderList &theRenderList(*m_RenderList);
- theRenderList.BeginFrame();
- if (m_Viewport.hasValue()) {
- theRenderList.SetScissorTestEnabled(true);
- theRenderList.SetScissorRect(theContextViewport);
- } else {
- theRenderList.SetScissorTestEnabled(false);
- }
- bool renderOffscreen = m_Rotation != RenderRotationValues::NoRotation;
- eastl::pair<NVRenderRect, NVRenderRect> thePresViewportAndOuterViewport =
- GetPresentationViewportAndOuterViewport();
- NVRenderRect theOuterViewport = thePresViewportAndOuterViewport.second;
- // Calculate the presentation viewport perhaps with the window width and height swapped.
- NVRenderRect thePresentationViewport = thePresViewportAndOuterViewport.first;
- m_PresentationViewport = thePresentationViewport;
- m_PresentationScale = QT3DSVec2(
- (QT3DSF32)thePresentationViewport.m_Width / (QT3DSF32)thePresentationDimensions.width(),
- (QT3DSF32)thePresentationViewport.m_Height / (QT3DSF32)thePresentationDimensions.height());
- QSize fboDimensions;
- if (thePresentationViewport.m_Width > 0 && thePresentationViewport.m_Height > 0) {
- if (renderOffscreen == false) {
- m_PresentationDimensions = QSize(thePresentationViewport.m_Width,
- thePresentationViewport.m_Height);
- m_RenderList->SetViewport(thePresentationViewport);
- if (thePresentationViewport.m_X || thePresentationViewport.m_Y
- || thePresentationViewport.m_Width != (QT3DSI32)theOuterViewport.m_Width
- || thePresentationViewport.m_Height != (QT3DSI32)theOuterViewport.m_Height) {
- m_RenderList->SetScissorRect(thePresentationViewport);
- m_RenderList->SetScissorTestEnabled(true);
- }
+ if (m_StereoView != StereoViews::Right) {
+ m_PreRenderPresentationDimensions = m_PresentationDimensions;
+ QSize thePresentationDimensions(m_PreRenderPresentationDimensions);
+ NVRenderRect theContextViewport(GetContextViewport());
+ m_PerFrameAllocator.reset();
+ IRenderList &theRenderList(*m_RenderList);
+ theRenderList.BeginFrame();
+ if (m_Viewport.hasValue()) {
+ theRenderList.SetScissorTestEnabled(true);
+ theRenderList.SetScissorRect(theContextViewport);
} else {
- QT3DSU32 imageWidth = ITextRenderer::NextMultipleOf4(thePresentationViewport.m_Width);
- QT3DSU32 imageHeight =
- ITextRenderer::NextMultipleOf4(thePresentationViewport.m_Height);
- fboDimensions = QSize(imageWidth, imageHeight);
- m_PresentationDimensions = QSize(thePresentationViewport.m_Width,
- thePresentationViewport.m_Height);
- NVRenderRect theSceneViewport = NVRenderRect(0, 0, imageWidth, imageHeight);
- m_RenderList->SetScissorTestEnabled(false);
- m_RenderList->SetViewport(theSceneViewport);
+ theRenderList.SetScissorTestEnabled(false);
+ }
+ bool renderOffscreen = m_Rotation != RenderRotationValues::NoRotation;
+ eastl::pair<NVRenderRect, NVRenderRect> thePresViewportAndOuterViewport =
+ GetPresentationViewportAndOuterViewport();
+ NVRenderRect theOuterViewport = thePresViewportAndOuterViewport.second;
+ // Calculate the presentation viewport perhaps with the window width and height swapped.
+ NVRenderRect thePresentationViewport = thePresViewportAndOuterViewport.first;
+ m_PresentationViewport = thePresentationViewport;
+ m_PresentationScale = QT3DSVec2(
+ (QT3DSF32)thePresentationViewport.m_Width / (QT3DSF32)thePresentationDimensions.width(),
+ (QT3DSF32)thePresentationViewport.m_Height / (QT3DSF32)thePresentationDimensions.height());
+ QSize fboDimensions;
+ if (thePresentationViewport.m_Width > 0 && thePresentationViewport.m_Height > 0) {
+ if (renderOffscreen == false) {
+ m_PresentationDimensions = QSize(thePresentationViewport.m_Width,
+ thePresentationViewport.m_Height);
+ m_RenderList->SetViewport(thePresentationViewport);
+ if (thePresentationViewport.m_X || thePresentationViewport.m_Y
+ || thePresentationViewport.m_Width != (QT3DSI32)theOuterViewport.m_Width
+ || thePresentationViewport.m_Height != (QT3DSI32)theOuterViewport.m_Height) {
+ m_RenderList->SetScissorRect(thePresentationViewport);
+ m_RenderList->SetScissorTestEnabled(true);
+ }
+ } else {
+ QT3DSU32 imageWidth = ITextRenderer::NextMultipleOf4(thePresentationViewport.m_Width);
+ QT3DSU32 imageHeight =
+ ITextRenderer::NextMultipleOf4(thePresentationViewport.m_Height);
+ fboDimensions = QSize(imageWidth, imageHeight);
+ m_PresentationDimensions = QSize(thePresentationViewport.m_Width,
+ thePresentationViewport.m_Height);
+ NVRenderRect theSceneViewport = NVRenderRect(0, 0, imageWidth, imageHeight);
+ m_RenderList->SetScissorTestEnabled(false);
+ m_RenderList->SetViewport(theSceneViewport);
+ }
}
- }
- m_BeginFrameResult = SBeginFrameResult(
- renderOffscreen, m_PresentationDimensions, m_RenderList->IsScissorTestEnabled(),
- m_RenderList->GetScissor(), m_RenderList->GetViewport(), fboDimensions);
+ m_BeginFrameResult = SBeginFrameResult(
+ renderOffscreen, m_PresentationDimensions, m_RenderList->IsScissorTestEnabled(),
+ m_RenderList->GetScissor(), m_RenderList->GetViewport(), fboDimensions);
+ }
m_Renderer->BeginFrame();
m_OffscreenRenderManager->BeginFrame();
@@ -724,7 +726,8 @@ struct SRenderContext : public IQt3DSRenderContext
m_TextRenderer->BeginFrame();
if (m_TextTextureCache)
m_TextTextureCache->BeginFrame();
- m_ImageBatchLoader->BeginFrame(firstFrame);
+ if (m_StereoView != StereoViews::Right)
+ m_ImageBatchLoader->BeginFrame(firstFrame);
}
QT3DSVec2 GetPresentationScaleFactor() const override { return m_PresentationScale; }