From 32f2b144292d9ee23682e7751d012dc3af9ed7ae Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 30 Jan 2024 18:46:00 +0100 Subject: [PATCH] vk/gl: add interlaced 3D mode --- rpcs3/Emu/RSX/GL/GLOverlays.cpp | 1 + .../GLSLSnippets/VideoOutCalibrationPass.glsl | 27 ++++++++++++------- rpcs3/Emu/RSX/VK/VKOverlays.cpp | 1 + rpcs3/Emu/RSX/VK/VKOverlays.h | 1 + rpcs3/Emu/system_config_types.cpp | 1 + rpcs3/Emu/system_config_types.h | 1 + rpcs3/rpcs3qt/emu_settings.cpp | 1 + 7 files changed, 24 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLOverlays.cpp b/rpcs3/Emu/RSX/GL/GLOverlays.cpp index 0cfa40ca35..adacde9e31 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.cpp +++ b/rpcs3/Emu/RSX/GL/GLOverlays.cpp @@ -479,6 +479,7 @@ namespace gl program_handle.uniforms["limit_range"] = limited_rgb + 0; program_handle.uniforms["stereo_display_mode"] = static_cast(stereo_mode); program_handle.uniforms["stereo_image_count"] = (source[1] == GL_NONE? 1 : 2); + program_handle.uniforms["height"] = viewport.height(); saved_sampler_state saved(31, m_sampler); cmd->bind_texture(31, GL_TEXTURE_2D, source[0]); diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/VideoOutCalibrationPass.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/VideoOutCalibrationPass.glsl index e0788b50eb..e5f37ce697 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/VideoOutCalibrationPass.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/VideoOutCalibrationPass.glsl @@ -15,16 +15,17 @@ layout(location=0) out vec4 ocol; #define STEREO_MODE_DISABLED 0 #define STEREO_MODE_SIDE_BY_SIDE 1 #define STEREO_MODE_OVER_UNDER 2 -#define STEREO_MODE_ANAGLYPH_RED_GREEN 3 -#define STEREO_MODE_ANAGLYPH_RED_BLUE 4 -#define STEREO_MODE_ANAGLYPH_RED_CYAN 5 -#define STEREO_MODE_ANAGLYPH_MAGENTA_CYAN 6 -#define STEREO_MODE_ANAGLYPH_TRIOSCOPIC 7 +#define STEREO_MODE_INTERLACED 3 +#define STEREO_MODE_ANAGLYPH_RED_GREEN 4 +#define STEREO_MODE_ANAGLYPH_RED_BLUE 5 +#define STEREO_MODE_ANAGLYPH_RED_CYAN 6 +#define STEREO_MODE_ANAGLYPH_MAGENTA_CYAN 7 +#define STEREO_MODE_ANAGLYPH_TRIOSCOPIC 8 -vec2 sbs_single_matrix = vec2(2.0,0.4898f); -vec2 sbs_multi_matrix = vec2(2.0,1.0); -vec2 ou_single_matrix = vec2(1.0,0.9796f); -vec2 ou_multi_matrix = vec2(1.0,2.0); +vec2 sbs_single_matrix = vec2(2.0, 0.4898f); +vec2 sbs_multi_matrix = vec2(2.0, 1.0); +vec2 ou_single_matrix = vec2(1.0, 0.9796f); +vec2 ou_multi_matrix = vec2(1.0, 2.0); #ifdef VULKAN layout(push_constant) uniform static_data @@ -33,12 +34,14 @@ layout(push_constant) uniform static_data int limit_range; int stereo_display_mode; int stereo_image_count; + int height; }; #else uniform float gamma; uniform int limit_range; uniform int stereo_display_mode; uniform int stereo_image_count; +uniform int height; #endif vec4 read_source() @@ -76,6 +79,9 @@ vec4 read_source() case STEREO_MODE_OVER_UNDER: if (tc0.y < 0.5) return texture(fs0, tc0* ou_single_matrix); else return texture(fs0, (tc0* ou_single_matrix) + vec2(0.f, 0.020408f) ); + case STEREO_MODE_INTERLACED: + if (mod(height * tc0.y, 2.f) < 1.f) return texture(fs0, tc0 * vec2(1.f, 0.4898f)); + else return texture(fs0, (tc0 * vec2(1.f, 0.4898f)) + vec2(0.f, 0.510204f)); default: // undefined behavior return texture(fs0,tc0); } @@ -110,6 +116,9 @@ vec4 read_source() case STEREO_MODE_OVER_UNDER: if (tc0.y < 0.5) return texture(fs0,(tc0 * ou_multi_matrix)); else return texture(fs1,(tc0 * ou_multi_matrix) + vec2(0.f,-1.f)); + case STEREO_MODE_INTERLACED: + if (mod(height * tc0.y, 2.f) < 1.f) return texture(fs0, tc0); + else return texture(fs1, tc0); default: // undefined behavior return texture(fs0,tc0); } diff --git a/rpcs3/Emu/RSX/VK/VKOverlays.cpp b/rpcs3/Emu/RSX/VK/VKOverlays.cpp index 02eb03ddae..d4611e936a 100644 --- a/rpcs3/Emu/RSX/VK/VKOverlays.cpp +++ b/rpcs3/Emu/RSX/VK/VKOverlays.cpp @@ -902,6 +902,7 @@ namespace vk config.limit_range = limited_rgb? 1 : 0; config.stereo_display_mode = static_cast(stereo_mode); config.stereo_image_count = std::min(::size32(src), 2u); + config.height = src.empty() ? 720 : src.front()->height(); std::vector views; views.reserve(2); diff --git a/rpcs3/Emu/RSX/VK/VKOverlays.h b/rpcs3/Emu/RSX/VK/VKOverlays.h index 7b6efc7f68..039559e756 100644 --- a/rpcs3/Emu/RSX/VK/VKOverlays.h +++ b/rpcs3/Emu/RSX/VK/VKOverlays.h @@ -212,6 +212,7 @@ namespace vk int limit_range; int stereo_display_mode; int stereo_image_count; + int height; }; float data[4]; diff --git a/rpcs3/Emu/system_config_types.cpp b/rpcs3/Emu/system_config_types.cpp index f8382eacf5..4f14587455 100644 --- a/rpcs3/Emu/system_config_types.cpp +++ b/rpcs3/Emu/system_config_types.cpp @@ -642,6 +642,7 @@ void fmt_class_string::format(std::string& out, u64 case stereo_render_mode_options::disabled: return "Disabled"; case stereo_render_mode_options::side_by_side: return "Side-by-Side"; case stereo_render_mode_options::over_under: return "Over-Under"; + case stereo_render_mode_options::interlaced: return "Interlaced"; case stereo_render_mode_options::anaglyph_red_green: return "Anaglyph Red-Green"; case stereo_render_mode_options::anaglyph_red_blue: return "Anaglyph Red-Blue"; case stereo_render_mode_options::anaglyph_red_cyan: return "Anaglyph Red-Cyan"; diff --git a/rpcs3/Emu/system_config_types.h b/rpcs3/Emu/system_config_types.h index f79182d457..5e81676499 100644 --- a/rpcs3/Emu/system_config_types.h +++ b/rpcs3/Emu/system_config_types.h @@ -318,6 +318,7 @@ enum class stereo_render_mode_options disabled, side_by_side, over_under, + interlaced, anaglyph_red_green, anaglyph_red_blue, anaglyph_red_cyan, diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index fbe2d8b272..5b29a66339 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -1288,6 +1288,7 @@ QString emu_settings::GetLocalizedSetting(const QString& original, emu_settings_ case stereo_render_mode_options::disabled: return tr("Disabled", "3D Display Mode"); case stereo_render_mode_options::side_by_side: return tr("Side-by-side", "3D Display Mode"); case stereo_render_mode_options::over_under: return tr("Over-under", "3D Display Mode"); + case stereo_render_mode_options::interlaced: return tr("Interlaced", "3D Display Mode"); case stereo_render_mode_options::anaglyph_red_green: return tr("Anaglyph Red-Green", "3D Display Mode"); case stereo_render_mode_options::anaglyph_red_blue: return tr("Anaglyph Red-Blue", "3D Display Mode"); case stereo_render_mode_options::anaglyph_red_cyan: return tr("Anaglyph Red-Cyan", "3D Display Mode");