vk/gl: add interlaced 3D mode

This commit is contained in:
Megamouse 2024-01-30 18:46:00 +01:00
parent 651f8512eb
commit 32f2b14429
7 changed files with 24 additions and 9 deletions

View File

@ -479,6 +479,7 @@ namespace gl
program_handle.uniforms["limit_range"] = limited_rgb + 0;
program_handle.uniforms["stereo_display_mode"] = static_cast<u8>(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]);

View File

@ -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);
}

View File

@ -902,6 +902,7 @@ namespace vk
config.limit_range = limited_rgb? 1 : 0;
config.stereo_display_mode = static_cast<u8>(stereo_mode);
config.stereo_image_count = std::min(::size32(src), 2u);
config.height = src.empty() ? 720 : src.front()->height();
std::vector<vk::image_view*> views;
views.reserve(2);

View File

@ -212,6 +212,7 @@ namespace vk
int limit_range;
int stereo_display_mode;
int stereo_image_count;
int height;
};
float data[4];

View File

@ -642,6 +642,7 @@ void fmt_class_string<stereo_render_mode_options>::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";

View File

@ -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,

View File

@ -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");