From 38562155d43e37c51dd899574885e5fb1b7429c1 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 27 Sep 2016 12:54:35 +0300 Subject: [PATCH] gl/vk: Flip wpos if origin != top --- rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp | 2 +- rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp | 4 ++-- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 6 ++++++ rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 6 ++++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp index ce31da3d7f..ca69d312e0 100644 --- a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp @@ -276,7 +276,7 @@ template std::string FragmentProgramDecompiler::GetSRC(T src) { static const std::string reg_table[] = { - "gl_FragCoord", + "wpos", "diff_color", "spec_color", "fogc", "tc0", "tc1", "tc2", "tc3", "tc4", "tc5", "tc6", "tc7", "tc8", "tc9", diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp index 6c9e820dc1..be2b3e5b9e 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp @@ -228,9 +228,9 @@ void D3D12FragmentDecompiler::insertMainStart(std::stringstream & OS) } } // A bit unclean, but works. - OS << " " << "float4 gl_FragCoord = In.Position;" << std::endl; + OS << " " << "float4 wpos = In.Position;" << std::endl; if (m_prog.origin_mode == rsx::window_origin::bottom) - OS << " gl_FragCoord.y = (" << std::to_string(m_prog.height) << " - gl_FragCoord.y);\n"; + OS << " wpos.y = (" << std::to_string(m_prog.height) << " - wpos.y);\n"; OS << " float4 ssa = is_front_face ? float4(1., 1., 1., 1.) : float4(-1., -1., -1., -1.);\n"; // Declare output diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index ab853903fe..98b3c8ebfc 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -250,6 +250,12 @@ void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS) } OS << " vec4 ssa = gl_FrontFacing ? vec4(1.) : vec4(-1.);\n"; + OS << " vec4 wpos = gl_FragCoord;\n"; + + //Flip wpos in Y + //We could optionally export wpos from the VS, but this is so much easier + if (m_prog.origin_mode == rsx::window_origin::bottom) + OS << " wpos.y = " << std::to_string(m_prog.height) << " - wpos.y;\n"; for (const ParamType& PT : m_parr.params[PF_PARAM_UNIFORM]) { diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 965d59c553..f9affeb20e 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -268,6 +268,12 @@ void VKFragmentDecompilerThread::insertMainStart(std::stringstream & OS) } OS << " vec4 ssa = gl_FrontFacing ? vec4(1.) : vec4(-1.);\n"; + OS << " vec4 wpos = gl_FragCoord;\n"; + + //Flip wpos in Y + //We could optionally export wpos from the VS, but this is so much easier + if (m_prog.origin_mode == rsx::window_origin::bottom) + OS << " wpos.y = " << std::to_string(m_prog.height) << " - wpos.y;\n"; bool two_sided_enabled = m_prog.front_back_color_enabled && (m_prog.back_color_diffuse_output || m_prog.back_color_specular_output);