From fb875b94de26c9900d38f412ce96af9860a248b3 Mon Sep 17 00:00:00 2001 From: Lubos Date: Sun, 4 Sep 2022 14:01:17 +0200 Subject: [PATCH] OpenXR - Multipass rendering fixed --- Common/GPU/OpenGL/GLQueueRunner.cpp | 6 +++-- Common/GPU/OpenGL/GLQueueRunner.h | 2 +- Common/GPU/OpenGL/GLRenderManager.cpp | 37 ++++++++++++--------------- Common/GPU/OpenGL/GLRenderManager.h | 1 - 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index f29ffbe2cd..502d656e39 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -642,7 +642,7 @@ retry_depth: currentReadHandle_ = fbo->handle; } -void GLQueueRunner::RunSteps(const std::vector &steps, bool skipGLCalls) { +void GLQueueRunner::RunSteps(const std::vector &steps, bool skipGLCalls, bool keepSteps) { if (skipGLCalls) { // Dry run for (size_t i = 0; i < steps.size(); i++) { @@ -724,7 +724,9 @@ void GLQueueRunner::RunSteps(const std::vector &steps, bool skipGLCal glPopDebugGroup(); #endif - delete steps[i]; + if (!keepSteps) { + delete steps[i]; + } } CHECK_GL_ERROR_IF_DEBUG(); } diff --git a/Common/GPU/OpenGL/GLQueueRunner.h b/Common/GPU/OpenGL/GLQueueRunner.h index a01fad23ab..1e009787ae 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.h +++ b/Common/GPU/OpenGL/GLQueueRunner.h @@ -363,7 +363,7 @@ public: void RunInitSteps(const std::vector &steps, bool skipGLCalls); - void RunSteps(const std::vector &steps, bool skipGLCalls); + void RunSteps(const std::vector &steps, bool skipGLCalls, bool keepSteps = false); void LogSteps(const std::vector &steps); void CreateDeviceObjects(); diff --git a/Common/GPU/OpenGL/GLRenderManager.cpp b/Common/GPU/OpenGL/GLRenderManager.cpp index 6aebd20a70..8b8e190801 100644 --- a/Common/GPU/OpenGL/GLRenderManager.cpp +++ b/Common/GPU/OpenGL/GLRenderManager.cpp @@ -558,7 +558,9 @@ void GLRenderManager::EndSubmitFrame(int frame) { } // Render thread -void GLRenderManager::Render(int frame) { +void GLRenderManager::Run(int frame) { + BeginSubmitFrame(frame); + FrameData &frameData = frameData_[frame]; @@ -566,30 +568,12 @@ void GLRenderManager::Render(int frame) { auto &initStepsOnThread = frameData_[frame].initSteps; // queueRunner_.LogSteps(stepsOnThread); queueRunner_.RunInitSteps(initStepsOnThread, skipGLCalls_); - initStepsOnThread.clear(); - - // Run this after RunInitSteps so any fresh GLRBuffers for the pushbuffers can get created. - if (!skipGLCalls_) { - for (auto iter : frameData.activePushBuffers) { - iter->Flush(); - iter->UnmapDevice(); - } - } - - queueRunner_.RunSteps(stepsOnThread, skipGLCalls_); - - stepsOnThread.clear(); if (!skipGLCalls_) { for (auto iter : frameData.activePushBuffers) { iter->MapDevice(bufferStrategy_); } } -} - -// Render thread -void GLRenderManager::Run(int frame) { - BeginSubmitFrame(frame); if (IsVRBuild()) { if (PreVRRender()) { @@ -599,15 +583,26 @@ void GLRenderManager::Run(int frame) { } for (int i = 0; i < passes; i++) { PreVRFrameRender(i); - Render(frame); + queueRunner_.RunSteps(stepsOnThread, skipGLCalls_, i < passes - 1); PostVRFrameRender(); } PostVRRender(); } } else { - Render(frame); + queueRunner_.RunSteps(stepsOnThread, skipGLCalls_); } + // Run this after RunInitSteps so any fresh GLRBuffers for the pushbuffers can get created. + if (!skipGLCalls_) { + for (auto iter : frameData.activePushBuffers) { + iter->Flush(); + iter->UnmapDevice(); + } + } + + initStepsOnThread.clear(); + stepsOnThread.clear(); + switch (frameData_[frame].type) { case GLRRunType::END: EndSubmitFrame(frame); diff --git a/Common/GPU/OpenGL/GLRenderManager.h b/Common/GPU/OpenGL/GLRenderManager.h index 5f4b8216f8..5423262c98 100644 --- a/Common/GPU/OpenGL/GLRenderManager.h +++ b/Common/GPU/OpenGL/GLRenderManager.h @@ -377,7 +377,6 @@ public: void BeginFrame(); // Can run on a different thread! void Finish(); - void Render(int frame); void Run(int frame); // Zaps queued up commands. Use if you know there's a risk you've queued up stuff that has already been deleted. Can happen during in-game shutdown.