From 84cf9a4f3343df8a646a07bc445c2417b87c945d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaj=20Gr=C3=B6nholm?= Date: Wed, 29 Jan 2020 10:45:53 +0200 Subject: Stereoscopic rendering optimizations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Avoid some extra work while rendering in stereoscopic modes. Task-number: QT3DS-4044 Change-Id: Ia8f6bf07e4063f2da2054e4f384e28abe0a4b077 Reviewed-by: Tomi Korpipää Reviewed-by: Miikka Heikkinen --- src/engine/Qt3DSRenderRuntimeBinding.cpp | 48 ++++++++------ src/runtimerender/Qt3DSRenderContextCore.cpp | 99 ++++++++++++++-------------- 2 files changed, 79 insertions(+), 68 deletions(-) (limited to 'src') 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 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 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; } -- cgit v1.2.3