From 06addecb3dbbf47dc7c19b718747646313ffd20f Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Tue, 7 Feb 2017 00:19:31 +0100 Subject: [PATCH] Unify cardboard settings calculation --- GPU/Common/FramebufferCommon.cpp | 22 +++++++++++++++++++++ GPU/Common/FramebufferCommon.h | 12 ++++++++++++ GPU/GLES/FramebufferManagerGLES.cpp | 30 +---------------------------- GPU/GLES/FramebufferManagerGLES.h | 14 +------------- GPU/GLES/GPU_GLES.cpp | 2 +- GPU/Vulkan/FramebufferVulkan.cpp | 9 ++------- GPU/Vulkan/FramebufferVulkan.h | 12 ------------ 7 files changed, 39 insertions(+), 62 deletions(-) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index fe124a0f34..f5b30fb5f2 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -1079,6 +1079,28 @@ void FramebufferManagerCommon::SetSafeSize(u16 w, u16 h) { } } +void FramebufferManagerCommon::GetCardboardSettings(CardboardSettings *cardboardSettings) { + // Calculate Cardboard Settings + float cardboardScreenScale = g_Config.iCardboardScreenSize / 100.0f; + float cardboardScreenWidth = pixelWidth_ / 2.0f * cardboardScreenScale; + float cardboardScreenHeight = pixelHeight_ / 2.0f * cardboardScreenScale; + float cardboardMaxXShift = (pixelWidth_ / 2.0f - cardboardScreenWidth) / 2.0f; + float cardboardUserXShift = g_Config.iCardboardXShift / 100.0f * cardboardMaxXShift; + float cardboardLeftEyeX = cardboardMaxXShift + cardboardUserXShift; + float cardboardRightEyeX = pixelWidth_ / 2.0f + cardboardMaxXShift - cardboardUserXShift; + float cardboardMaxYShift = pixelHeight_ / 2.0f - cardboardScreenHeight / 2.0f; + float cardboardUserYShift = g_Config.iCardboardYShift / 100.0f * cardboardMaxYShift; + float cardboardScreenY = cardboardMaxYShift + cardboardUserYShift; + + cardboardSettings->enabled = g_Config.bEnableCardboard; + cardboardSettings->leftEyeXPosition = cardboardLeftEyeX; + cardboardSettings->rightEyeXPosition = cardboardRightEyeX; + cardboardSettings->screenYPosition = cardboardScreenY; + cardboardSettings->screenWidth = cardboardScreenWidth; + cardboardSettings->screenHeight = cardboardScreenHeight; +} + + void FramebufferManagerCommon::UpdateFramebufUsage(VirtualFramebuffer *vfb) { auto checkFlag = [&](u16 flag, int last_frame) { if (vfb->usageFlags & flag) { diff --git a/GPU/Common/FramebufferCommon.h b/GPU/Common/FramebufferCommon.h index 15924003d3..64955f3d36 100644 --- a/GPU/Common/FramebufferCommon.h +++ b/GPU/Common/FramebufferCommon.h @@ -50,6 +50,15 @@ namespace Draw { class Framebuffer; } +struct CardboardSettings { + bool enabled; + float leftEyeXPosition; + float rightEyeXPosition; + float screenYPosition; + float screenWidth; + float screenHeight; +}; + class VulkanFBO; struct VirtualFramebuffer { @@ -241,6 +250,9 @@ public: virtual void Resized() = 0; protected: + // Cardboard Settings Calculator + void GetCardboardSettings(CardboardSettings *cardboardSettings); + void UpdateSize(); void SetNumExtraFBOs(int num); diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 28699085c0..1de4faea15 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -792,32 +792,6 @@ void FramebufferManagerGLES::BindFramebufferColor(int stage, u32 fbRawAddress, V } } -struct CardboardSettings * FramebufferManagerGLES::GetCardboardSettings(struct CardboardSettings * cardboardSettings) { - if (cardboardSettings) { - // Calculate Cardboard Settings - float cardboardScreenScale = g_Config.iCardboardScreenSize / 100.0f; - float cardboardScreenWidth = pixelWidth_ / 2.0f * cardboardScreenScale; - float cardboardScreenHeight = pixelHeight_ / 2.0f * cardboardScreenScale; - float cardboardMaxXShift = (pixelWidth_ / 2.0f - cardboardScreenWidth) / 2.0f; - float cardboardUserXShift = g_Config.iCardboardXShift / 100.0f * cardboardMaxXShift; - float cardboardLeftEyeX = cardboardMaxXShift + cardboardUserXShift; - float cardboardRightEyeX = pixelWidth_ / 2.0f + cardboardMaxXShift - cardboardUserXShift; - float cardboardMaxYShift = pixelHeight_ / 2.0f - cardboardScreenHeight / 2.0f; - float cardboardUserYShift = g_Config.iCardboardYShift / 100.0f * cardboardMaxYShift; - float cardboardScreenY = cardboardMaxYShift + cardboardUserYShift; - - // Copy current Settings into Structure - cardboardSettings->enabled = g_Config.bEnableCardboard; - cardboardSettings->leftEyeXPosition = cardboardLeftEyeX; - cardboardSettings->rightEyeXPosition = cardboardRightEyeX; - cardboardSettings->screenYPosition = cardboardScreenY; - cardboardSettings->screenWidth = cardboardScreenWidth; - cardboardSettings->screenHeight = cardboardScreenHeight; - } - - return cardboardSettings; -} - void FramebufferManagerGLES::CopyDisplayToOutput() { DownloadFramebufferOnSwitch(currentRenderVfb_); @@ -847,7 +821,7 @@ void FramebufferManagerGLES::CopyDisplayToOutput() { u32 offsetX = 0; u32 offsetY = 0; - struct CardboardSettings cardboardSettings; + CardboardSettings cardboardSettings; GetCardboardSettings(&cardboardSettings); VirtualFramebuffer *vfb = GetVFBAt(displayFramebufPtr_); @@ -1033,8 +1007,6 @@ void FramebufferManagerGLES::CopyDisplayToOutput() { DrawActiveTexture(x, y, w, h, (float)pixelWidth_, (float)pixelHeight_, u0, v0, u1, v1, postShaderProgram_, uvRotation, linearFilter); } } - - glBindTexture(GL_TEXTURE_2D, 0); } } diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index e48fea7ecc..c3975edf09 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -51,15 +51,6 @@ struct AsyncPBO { bool reading; }; -struct CardboardSettings { - bool enabled; - float leftEyeXPosition; - float rightEyeXPosition; - float screenYPosition; - float screenWidth; - float screenHeight; -}; - class FramebufferManagerGLES : public FramebufferManagerCommon { public: FramebufferManagerGLES(Draw::DrawContext *draw); @@ -107,15 +98,12 @@ public: bool GetFramebuffer(u32 fb_address, int fb_stride, GEBufferFormat format, GPUDebugBuffer &buffer, int maxRes); bool GetDepthbuffer(u32 fb_address, int fb_stride, u32 z_address, int z_stride, GPUDebugBuffer &buffer); bool GetStencilbuffer(u32 fb_address, int fb_stride, GPUDebugBuffer &buffer); - static bool GetOutputFramebuffer(GPUDebugBuffer &buffer); + bool GetOutputFramebuffer(GPUDebugBuffer &buffer); virtual void RebindFramebuffer() override; Draw::Framebuffer *GetTempFBO(u16 w, u16 h, Draw::FBColorDepth depth = Draw::FBO_8888); - // Cardboard Settings Calculator - struct CardboardSettings * GetCardboardSettings(struct CardboardSettings * cardboardSettings); - protected: void DisableState() override; void ClearBuffer(bool keepState = false) override; diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 3b09aa171f..4942dbc9fd 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -1295,7 +1295,7 @@ bool GPU_GLES::GetCurrentClut(GPUDebugBuffer &buffer) { } bool GPU_GLES::GetOutputFramebuffer(GPUDebugBuffer &buffer) { - return FramebufferManagerGLES::GetOutputFramebuffer(buffer); + return framebufferManagerGL_->GetOutputFramebuffer(buffer); } bool GPU_GLES::GetCurrentSimpleVertices(int count, std::vector &vertices, std::vector &indices) { diff --git a/GPU/Vulkan/FramebufferVulkan.cpp b/GPU/Vulkan/FramebufferVulkan.cpp index e326704984..6281206a57 100644 --- a/GPU/Vulkan/FramebufferVulkan.cpp +++ b/GPU/Vulkan/FramebufferVulkan.cpp @@ -445,7 +445,7 @@ void FramebufferManagerVulkan::DrawFramebufferToOutput(const u8 *srcPixels, GEBu VkPipeline postShaderProgram_ = VK_NULL_HANDLE; - struct CardboardSettings cardboardSettings; + CardboardSettings cardboardSettings; GetCardboardSettings(&cardboardSettings); // TODO: Don't use the viewport mechanism for this. @@ -790,11 +790,6 @@ VulkanTexture *FramebufferManagerVulkan::GetFramebufferColor(u32 fbRawAddress, V } } -struct CardboardSettings * FramebufferManagerVulkan::GetCardboardSettings(struct CardboardSettings * cardboardSettings) { - cardboardSettings->enabled = false; - return nullptr; -} - void FramebufferManagerVulkan::CopyDisplayToOutput() { // This is where we should collect all the renderpasses from this frame, // sort them in order according to texturing dependencies, and enqueue @@ -904,7 +899,7 @@ void FramebufferManagerVulkan::CopyDisplayToOutput() { displayFramebuf_ = vfb; if (vfb->fbo) { - struct CardboardSettings cardboardSettings; + CardboardSettings cardboardSettings; GetCardboardSettings(&cardboardSettings); DEBUG_LOG(SCEGE, "Displaying FBO %08x", vfb->fb_address); diff --git a/GPU/Vulkan/FramebufferVulkan.h b/GPU/Vulkan/FramebufferVulkan.h index 9f18578641..a46db25177 100644 --- a/GPU/Vulkan/FramebufferVulkan.h +++ b/GPU/Vulkan/FramebufferVulkan.h @@ -64,15 +64,6 @@ struct AsyncPBOVulkan { bool reading; }; -struct CardboardSettings { - bool enabled; - float leftEyeXPosition; - float rightEyeXPosition; - float screenYPosition; - float screenWidth; - float screenHeight; -}; - class FramebufferManagerVulkan : public FramebufferManagerCommon { public: FramebufferManagerVulkan(Draw::DrawContext *draw, VulkanContext *vulkan); @@ -131,9 +122,6 @@ public: // VulkanFBO *GetTempFBO(u16 w, u16 h, VulkanFBOColorDepth depth = VK_FBO_8888); - // Cardboard Settings Calculator - struct CardboardSettings * GetCardboardSettings(struct CardboardSettings * cardboardSettings); - // Pass management // void BeginPassClear()