diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 80222bbfbf..e5a7b74eb8 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -1589,6 +1589,9 @@ void GLQueueRunner::PerformBindFramebufferAsRenderTarget(const GLRStep &pass) { fbo_bind_fb_target(false, curFB_->handle); } else { fbo_unbind(); + if (IsVRBuild()) { + BindVRFramebuffer(); + } // Backbuffer is now bound. } CHECK_GL_ERROR_IF_DEBUG(); @@ -1741,10 +1744,6 @@ void GLQueueRunner::fbo_unbind() { bindDefaultFBO(); #endif - if (IsVRBuild()) { - BindVRFramebuffer(); - } - currentDrawHandle_ = 0; currentReadHandle_ = 0; CHECK_GL_ERROR_IF_DEBUG(); diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.cpp b/Common/GPU/Vulkan/VulkanQueueRunner.cpp index 69d81b5391..161c2942b9 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.cpp +++ b/Common/GPU/Vulkan/VulkanQueueRunner.cpp @@ -3,6 +3,7 @@ #include "Common/GPU/DataFormat.h" #include "Common/GPU/Vulkan/VulkanQueueRunner.h" #include "Common/GPU/Vulkan/VulkanRenderManager.h" +#include "Common/VR/PPSSPPVR.h" #include "Common/Log.h" #include "Common/TimeUtil.h" @@ -544,7 +545,7 @@ void VulkanQueueRunner::PreprocessSteps(std::vector &steps) { } } -void VulkanQueueRunner::RunSteps(std::vector &steps, FrameData &frameData, FrameDataShared &frameDataShared) { +void VulkanQueueRunner::RunSteps(std::vector &steps, FrameData &frameData, FrameDataShared &frameDataShared, bool keepSteps) { QueueProfileContext *profile = frameData.profilingEnabled_ ? &frameData.profile : nullptr; if (profile) @@ -622,12 +623,13 @@ void VulkanQueueRunner::RunSteps(std::vector &steps, FrameData &frame // Deleting all in one go should be easier on the instruction cache than deleting // them as we go - and easier to debug because we can look backwards in the frame. - for (auto step : steps) { - delete step; + if (!keepSteps) { + for (auto step : steps) { + delete step; + } + steps.clear(); } - steps.clear(); - if (profile) profile->cpuEndTime = time_now_d(); } @@ -1652,7 +1654,11 @@ VKRRenderPass *VulkanQueueRunner::PerformBindFramebufferAsRenderTarget(const VKR }; renderPass = GetRenderPass(key); - framebuf = backbuffer_; + if (IsVRBuild()) { + framebuf = (VkFramebuffer)BindVRFramebuffer(); + } else { + framebuf = backbuffer_; + } // Raw, rotated backbuffer size. w = vulkan_->GetBackbufferWidth(); diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.h b/Common/GPU/Vulkan/VulkanQueueRunner.h index 7036029149..63dcd66b23 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.h +++ b/Common/GPU/Vulkan/VulkanQueueRunner.h @@ -278,7 +278,7 @@ public: } void PreprocessSteps(std::vector &steps); - void RunSteps(std::vector &steps, FrameData &frameData, FrameDataShared &frameDataShared); + void RunSteps(std::vector &steps, FrameData &frameData, FrameDataShared &frameDataShared, bool keepSteps = false); void LogSteps(const std::vector &steps, bool verbose); std::string StepToString(const VKRStep &step) const; diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index 3343bd889f..9d48914e94 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -12,6 +12,9 @@ #include "Common/GPU/Vulkan/VulkanRenderManager.h" #include "Common/Thread/ThreadUtil.h" +#include "Common/VR/PPSSPPVR.h" + +#include "Core/Config.h" #if 0 // def _DEBUG #define VLOG(...) NOTICE_LOG(G3D, __VA_ARGS__) @@ -1262,7 +1265,19 @@ void VulkanRenderManager::Run(VKRRenderThreadTask &task) { if (task.steps.empty() && !frameData.hasAcquired) frameData.skipSwap = true; //queueRunner_.LogSteps(stepsOnThread, false); - queueRunner_.RunSteps(task.steps, frameData, frameDataShared_); + if (IsVRBuild()) { + int passes = 1; + if (!IsMultiviewSupported() && g_Config.bEnableStereo) { + passes = 2; + } + for (int i = 0; i < passes; i++) { + PreVRFrameRender(i); + queueRunner_.RunSteps(task.steps, frameData, frameDataShared_, i < passes - 1); + PostVRFrameRender(); + } + } else { + queueRunner_.RunSteps(task.steps, frameData, frameDataShared_); + } switch (task.runType) { case VKRRunType::PRESENT: diff --git a/Common/UI/UIScreen.cpp b/Common/UI/UIScreen.cpp index ecebae3a81..41ec1bb76d 100644 --- a/Common/UI/UIScreen.cpp +++ b/Common/UI/UIScreen.cpp @@ -12,7 +12,6 @@ #include "Common/UI/Root.h" #include "Common/Data/Text/I18n.h" #include "Common/Render/DrawBuffer.h" -#include "Common/VR/PPSSPPVR.h" #include "Common/Log.h" #include "Common/StringUtils.h" @@ -89,10 +88,6 @@ void UIScreen::preRender() { draw->BindFramebufferAsRenderTarget(nullptr, { RPAction::CLEAR, RPAction::CLEAR, RPAction::CLEAR, 0xFF000000 }, "UI"); screenManager()->getUIContext()->BeginFrame(); - if (IsVRBuild()) { - BindVRFramebuffer(); - } - Draw::Viewport viewport; viewport.TopLeftX = 0; viewport.TopLeftY = 0; diff --git a/Common/VR/PPSSPPVR.cpp b/Common/VR/PPSSPPVR.cpp index 18b9f00e3c..31c6a20fce 100644 --- a/Common/VR/PPSSPPVR.cpp +++ b/Common/VR/PPSSPPVR.cpp @@ -290,8 +290,8 @@ VR rendering integration ================================================================================ */ -void BindVRFramebuffer() { - VR_BindFramebuffer(VR_GetEngine()); +void* BindVRFramebuffer() { + return VR_BindFramebuffer(VR_GetEngine()); } bool StartVRRender() { diff --git a/Common/VR/PPSSPPVR.h b/Common/VR/PPSSPPVR.h index 6fbe2f00fb..a7b5d8420d 100644 --- a/Common/VR/PPSSPPVR.h +++ b/Common/VR/PPSSPPVR.h @@ -32,7 +32,7 @@ void PreprocessStepVR(void* step); void SetVRCompat(VRCompatFlag flag, long value); // VR rendering integration -void BindVRFramebuffer(); +void* BindVRFramebuffer(); bool StartVRRender(); void FinishVRRender(); void PreVRFrameRender(int fboIndex); @@ -59,7 +59,7 @@ inline void PreprocessStepVR(void* step) {} inline void SetVRCompat(VRCompatFlag flag, long value) {} // VR rendering integration -inline void BindVRFramebuffer() {} +inline void* BindVRFramebuffer() { return nullptr; } inline bool StartVRRender() { return false; } inline void FinishVRRender() {} inline void PreVRFrameRender(int fboIndex) {} diff --git a/Common/VR/VRFramebuffer.cpp b/Common/VR/VRFramebuffer.cpp index 1a62417c3e..b8dbe5671b 100644 --- a/Common/VR/VRFramebuffer.cpp +++ b/Common/VR/VRFramebuffer.cpp @@ -217,29 +217,12 @@ void ovrFramebuffer_Destroy(ovrFramebuffer* frameBuffer) { ovrFramebuffer_Clear(frameBuffer); } -void ovrFramebuffer_SetCurrent(ovrFramebuffer* frameBuffer) { +void* ovrFramebuffer_SetCurrent(ovrFramebuffer* frameBuffer) { if (frameBuffer->UseVulkan) { - //TODO:bind framebuffer + return frameBuffer->VKFrameBuffers[frameBuffer->TextureSwapChainIndex]; } else { GL(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffer->GLFrameBuffers[frameBuffer->TextureSwapChainIndex])); - } -} - -void ovrFramebuffer_SetNone(ovrFramebuffer* frameBuffer) { - if (frameBuffer->UseVulkan) { - //TODO:unbind framebuffer - } else { - GL(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)); - } -} - -void ovrFramebuffer_Resolve(ovrFramebuffer* frameBuffer) { - // Discard the depth buffer, so the tiler won't need to write it back out to memory. - if (frameBuffer->UseVulkan) { - //TODO:implement - } else { - const GLenum depthAttachment[1] = {GL_DEPTH_ATTACHMENT}; - glInvalidateFramebuffer(GL_DRAW_FRAMEBUFFER, 1, depthAttachment); + return nullptr; } } diff --git a/Common/VR/VRFramebuffer.h b/Common/VR/VRFramebuffer.h index 12eb162980..644a28fe4c 100644 --- a/Common/VR/VRFramebuffer.h +++ b/Common/VR/VRFramebuffer.h @@ -7,10 +7,8 @@ void ovrApp_Destroy(ovrApp* app); int ovrApp_HandleXrEvents(ovrApp* app); void ovrFramebuffer_Acquire(ovrFramebuffer* frameBuffer); -void ovrFramebuffer_Resolve(ovrFramebuffer* frameBuffer); void ovrFramebuffer_Release(ovrFramebuffer* frameBuffer); -void ovrFramebuffer_SetCurrent(ovrFramebuffer* frameBuffer); -void ovrFramebuffer_SetNone(ovrFramebuffer* frameBuffer); +void* ovrFramebuffer_SetCurrent(ovrFramebuffer* frameBuffer); void ovrRenderer_Create(XrSession session, ovrRenderer* renderer, int width, int height, bool multiview, void* vulkanContext); void ovrRenderer_Destroy(ovrRenderer* renderer); diff --git a/Common/VR/VRRenderer.cpp b/Common/VR/VRRenderer.cpp index 4d41d09bcd..77e80ca9aa 100644 --- a/Common/VR/VRRenderer.cpp +++ b/Common/VR/VRRenderer.cpp @@ -372,10 +372,7 @@ void VR_EndFrame( engine_t* engine ) { ovrRenderer_MouseCursor(&engine->appState.Renderer, x, y, size); } - ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer[fboIndex]; - //ovrFramebuffer_Resolve(frameBuffer); - ovrFramebuffer_Release(frameBuffer); - ovrFramebuffer_SetNone(frameBuffer); + ovrFramebuffer_Release(&engine->appState.Renderer.FrameBuffer[fboIndex]); } void VR_FinishFrame( engine_t* engine ) { @@ -487,10 +484,10 @@ void VR_SetConfig( VRConfig config, int value) { vrConfig[config] = value; } -void VR_BindFramebuffer(engine_t *engine) { - if (!initialized) return; +void* VR_BindFramebuffer(engine_t *engine) { + if (!initialized) return nullptr; int fboIndex = vrConfig[VR_CONFIG_CURRENT_FBO]; - ovrFramebuffer_SetCurrent(&engine->appState.Renderer.FrameBuffer[fboIndex]); + return ovrFramebuffer_SetCurrent(&engine->appState.Renderer.FrameBuffer[fboIndex]); } ovrMatrix4f VR_GetMatrix( VRMatrix matrix ) { diff --git a/Common/VR/VRRenderer.h b/Common/VR/VRRenderer.h index e19a0e82a5..fe7a4671f1 100644 --- a/Common/VR/VRRenderer.h +++ b/Common/VR/VRRenderer.h @@ -51,5 +51,5 @@ void VR_FinishFrame( engine_t* engine ); int VR_GetConfig( VRConfig config ); void VR_SetConfig( VRConfig config, int value); -void VR_BindFramebuffer(engine_t *engine); +void* VR_BindFramebuffer(engine_t *engine); ovrMatrix4f VR_GetMatrix( VRMatrix matrix );