diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 536b1919f4..a4becc95af 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -782,15 +782,13 @@ void FramebufferManagerCommon::DrawFramebufferToOutput(const u8 *srcPixels, GEBu if (needBackBufferYSwap_) { flags |= OutputFlags::BACKBUFFER_FLIPPED; } + // DrawActiveTexture reverses these, probably to match "up". + if (GetGPUBackend() == GPUBackend::DIRECT3D9 || GetGPUBackend() == GPUBackend::DIRECT3D11) { + flags |= OutputFlags::POSITION_FLIPPED; + } PostShaderUniforms uniforms{}; presentation_->CalculatePostShaderUniforms(512, 272, textureCache_->VideoIsPlaying(), &uniforms); - - // TODO: DrawActiveTexture reverses these, but I'm not sure why? Investigate. - if (GetGPUBackend() == GPUBackend::DIRECT3D9 || GetGPUBackend() == GPUBackend::DIRECT3D11) { - std::swap(v0, v1); - } - presentation_->SourceTexture(pixelsTex); presentation_->CopyToOutput(flags, uvRotation, u0, v0, u1, v1, uniforms); pixelsTex->Release(); @@ -950,18 +948,15 @@ void FramebufferManagerCommon::CopyDisplayToOutput(bool reallyDirty) { if (needBackBufferYSwap_) { flags |= OutputFlags::BACKBUFFER_FLIPPED; } + // DrawActiveTexture reverses these, probably to match "up". + if (GetGPUBackend() == GPUBackend::DIRECT3D9 || GetGPUBackend() == GPUBackend::DIRECT3D11) { + flags |= OutputFlags::POSITION_FLIPPED; + } PostShaderUniforms uniforms{}; int actualWidth = (vfb->bufferWidth * vfb->renderWidth) / vfb->width; int actualHeight = (vfb->bufferHeight * vfb->renderHeight) / vfb->height; presentation_->CalculatePostShaderUniforms(actualWidth, actualHeight, textureCache_->VideoIsPlaying(), &uniforms); - - // DrawActiveTexture reverses these, probably to match "up". - // TODO: Maybe use a flag instead. - if (GetGPUBackend() == GPUBackend::DIRECT3D9 || GetGPUBackend() == GPUBackend::DIRECT3D11) { - std::swap(v0, v1); - } - presentation_->SourceFramebuffer(vfb->fbo); presentation_->CopyToOutput(flags, uvRotation, u0, v0, u1, v1, uniforms); } else if (useBufferedRendering_) { diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 2898c2eecb..08027e0c15 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -461,7 +461,7 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u y += 0.5f; } - if (flags & OutputFlags::BACKBUFFER_FLIPPED) { + if ((flags & OutputFlags::BACKBUFFER_FLIPPED) || (flags & OutputFlags::POSITION_FLIPPED)) { std::swap(v0, v1); } @@ -490,13 +490,14 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u // Vertical and Vertical180 needed swapping after we changed the coordinate system. switch (uvRotation) { case ROTATION_LOCKED_HORIZONTAL180: rotation = 2; break; - case ROTATION_LOCKED_VERTICAL: rotation = 1; break; - case ROTATION_LOCKED_VERTICAL180: rotation = 3; break; + case ROTATION_LOCKED_VERTICAL: rotation = 3; break; + case ROTATION_LOCKED_VERTICAL180: rotation = 1; break; } - // TODO: This doesn't make sense... but Vulkan is flipped only in portrait? Investigate. - if (GetGPUBackend() == GPUBackend::VULKAN && (rotation & 1) != 0) { - rotation ^= 2; + // If we flipped, we rotate the other way. + if ((flags & OutputFlags::BACKBUFFER_FLIPPED) || (flags & OutputFlags::POSITION_FLIPPED)) { + if ((rotation & 1) != 0) + rotation ^= 2; } for (int i = 0; i < 4; i++) { @@ -538,7 +539,7 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u Draw::SamplerState *sampler = useNearest ? samplerNearest_ : samplerLinear_; draw_->BindSamplerStates(0, 1, &sampler); - bool flipped = GetGPUBackend() == GPUBackend::DIRECT3D9 || GetGPUBackend() == GPUBackend::DIRECT3D11; + bool flipped = flags & OutputFlags::POSITION_FLIPPED; float post_v0 = !flipped ? 1.0f : 0.0f; float post_v1 = !flipped ? 0.0f : 1.0f; verts[4] = { -1, -1, 0, 0, post_v1, 0xFFFFFFFF }; // TL diff --git a/GPU/Common/PresentationCommon.h b/GPU/Common/PresentationCommon.h index ecc1cff9e0..967a6b0f2b 100644 --- a/GPU/Common/PresentationCommon.h +++ b/GPU/Common/PresentationCommon.h @@ -56,6 +56,7 @@ enum class OutputFlags { NEAREST = 0x0001, RB_SWIZZLE = 0x0002, BACKBUFFER_FLIPPED = 0x0004, + POSITION_FLIPPED = 0x0008, }; inline OutputFlags operator | (const OutputFlags &lhs, const OutputFlags &rhs) { diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 189cbe3b21..0d30bac41a 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -172,8 +172,8 @@ void SoftGPU::CopyToCurrentFboFromDisplayRam(int srcwidth, int srcheight) { return; float u0 = 0.0f; float u1; - float v0 = 1.0f; - float v1 = 0.0f; + float v0 = 0.0f; + float v1 = 1.0f; if (fbTex) { fbTex->Release(); @@ -220,8 +220,8 @@ void SoftGPU::CopyToCurrentFboFromDisplayRam(int srcwidth, int srcheight) { } u0 = 64.5f / (float)desc.width; u1 = 447.5f / (float)desc.width; - v1 = 16.0f / (float)desc.height; - v0 = 240.0f / (float)desc.height; + v0 = 16.0f / (float)desc.height; + v1 = 240.0f / (float)desc.height; } else if (!Memory::IsValidAddress(displayFramebuf_) || srcwidth == 0 || srcheight == 0) { hasImage = false; u1 = 1.0f; @@ -262,17 +262,20 @@ void SoftGPU::CopyToCurrentFboFromDisplayRam(int srcwidth, int srcheight) { fbTex = draw_->CreateTexture(desc); - if (GetGPUBackend() == GPUBackend::VULKAN) { - std::swap(v0, v1); - } - if (GetGPUBackend() == GPUBackend::OPENGL) { - std::swap(v0, v1); + switch (GetGPUBackend()) { + case GPUBackend::OPENGL: outputFlags |= OutputFlags::BACKBUFFER_FLIPPED; + break; + case GPUBackend::DIRECT3D9: + case GPUBackend::DIRECT3D11: + outputFlags |= OutputFlags::POSITION_FLIPPED; + break; + case GPUBackend::VULKAN: + break; } PostShaderUniforms uniforms{}; presentation_->CalculatePostShaderUniforms(desc.width, desc.height, false, &uniforms); - presentation_->SourceTexture(fbTex); presentation_->CopyToOutput(outputFlags, g_Config.iInternalScreenRotation, u0, v0, u1, v1, uniforms); }