From 8bd98cbfc441b306ac431b73ff6f524a12e0cf3d Mon Sep 17 00:00:00 2001 From: Razakhel Date: Sat, 2 Nov 2024 14:20:25 +0100 Subject: [PATCH] [XR/XrSession] Requesting frame rendering returns whether it has been - This is used afterward to avoid copying the frame to the window - It happens for the first few frames, notably when the session hasn't been started yet (the RenderSystem is updated while the XrSystem still hasn't been) --- include/RaZ/XR/XrSession.hpp | 2 +- include/RaZ/XR/XrSystem.hpp | 2 +- src/RaZ/Render/RenderSystem.cpp | 5 ++++- src/RaZ/XR/XrSession.cpp | 6 ++++-- src/RaZ/XR/XrSystem.cpp | 4 ++-- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/RaZ/XR/XrSession.hpp b/include/RaZ/XR/XrSession.hpp index cdebe431..87a41118 100644 --- a/include/RaZ/XR/XrSession.hpp +++ b/include/RaZ/XR/XrSession.hpp @@ -42,7 +42,7 @@ class XrSession { void begin(unsigned int viewConfigType); void end(); - void renderFrame(const std::vector& viewConfigViews, + bool renderFrame(const std::vector& viewConfigViews, unsigned int viewConfigType, unsigned int environmentBlendMode, const ViewRenderFunc& viewRenderFunc); diff --git a/include/RaZ/XR/XrSystem.hpp b/include/RaZ/XR/XrSystem.hpp index bdb56924..684322de 100644 --- a/include/RaZ/XR/XrSystem.hpp +++ b/include/RaZ/XR/XrSystem.hpp @@ -26,7 +26,7 @@ class XrSystem final : public System { private: Vec2u recoverOptimalViewSize() const; - void renderFrame(const ViewRenderFunc& viewRenderFunc); + bool renderFrame(const ViewRenderFunc& viewRenderFunc); void recoverViewConfigurations(); void recoverEnvironmentBlendModes(); diff --git a/src/RaZ/Render/RenderSystem.cpp b/src/RaZ/Render/RenderSystem.cpp index 429a8661..6d80ce75 100644 --- a/src/RaZ/Render/RenderSystem.cpp +++ b/src/RaZ/Render/RenderSystem.cpp @@ -297,7 +297,7 @@ void RenderSystem::renderXrFrame() { ZoneScopedN("RenderSystem::renderXrFrame"); TracyGpuZone("RenderSystem::renderXrFrame") - m_xrSystem->renderFrame([this] (Vec3f position, Quaternionf rotation, ViewFov viewFov) { + const bool hasRendered = m_xrSystem->renderFrame([this] (Vec3f position, Quaternionf rotation, ViewFov viewFov) { if (m_cameraEntity) { const auto& camTransform = m_cameraEntity->getComponent(); position = camTransform.getRotation() * position + camTransform.getPosition(); @@ -342,6 +342,9 @@ void RenderSystem::renderXrFrame() { }); #if !defined(RAZ_NO_WINDOW) + if (!hasRendered) + return; + // TODO: the copied color buffer must be the one from the render pass executed last const Framebuffer& geomFramebuffer = m_renderGraph.m_geometryPass.getFramebuffer(); copyToWindow(geomFramebuffer.getColorBuffer(0), geomFramebuffer.getDepthBuffer(), m_window->getWidth(), m_window->getHeight()); diff --git a/src/RaZ/XR/XrSession.cpp b/src/RaZ/XR/XrSession.cpp index f8798951..61117654 100644 --- a/src/RaZ/XR/XrSession.cpp +++ b/src/RaZ/XR/XrSession.cpp @@ -232,14 +232,14 @@ void XrSession::end() { Logger::debug("[XrSession] Ended session"); } -void XrSession::renderFrame(const std::vector& viewConfigViews, +bool XrSession::renderFrame(const std::vector& viewConfigViews, unsigned int viewConfigType, unsigned int environmentBlendMode, const ViewRenderFunc& viewRenderFunc) { ZoneScopedN("XrSession::renderFrame"); if (!m_isRunning) - return; + return false; XrFrameWaitInfo frameWaitInfo {}; frameWaitInfo.type = XR_TYPE_FRAME_WAIT_INFO; @@ -275,6 +275,8 @@ void XrSession::renderFrame(const std::vector& viewConf frameEndInfo.layers = renderLayerInfo.layers.data(); checkLog(xrEndFrame(m_handle, &frameEndInfo), "Failed to end the XR frame", m_instance); } + + return !renderLayerInfo.layers.empty(); } XrSession::~XrSession() { diff --git a/src/RaZ/XR/XrSystem.cpp b/src/RaZ/XR/XrSystem.cpp index 0d7a144e..1d177b7f 100644 --- a/src/RaZ/XR/XrSystem.cpp +++ b/src/RaZ/XR/XrSystem.cpp @@ -117,8 +117,8 @@ Vec2u XrSystem::recoverOptimalViewSize() const { return optimalViewSize; } -void XrSystem::renderFrame(const ViewRenderFunc& viewRenderFunc) { - m_session.renderFrame(m_viewConfigViews, m_viewConfigType, m_environmentBlendMode, viewRenderFunc); +bool XrSystem::renderFrame(const ViewRenderFunc& viewRenderFunc) { + return m_session.renderFrame(m_viewConfigViews, m_viewConfigType, m_environmentBlendMode, viewRenderFunc); } void XrSystem::recoverViewConfigurations() {