diff --git a/rpcs3/Emu/RSX/GL/GLOverlays.cpp b/rpcs3/Emu/RSX/GL/GLOverlays.cpp index 0cfa40ca35..ee276cf2bb 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.cpp +++ b/rpcs3/Emu/RSX/GL/GLOverlays.cpp @@ -464,6 +464,13 @@ namespace gl #include "../Program/GLSLSnippets/VideoOutCalibrationPass.glsl" ; + std::pair repl_list[] = + { + { "%sampler_binding", fmt::format("(%d - x)", GL_TEMP_IMAGE_SLOT(0)) }, + { "%set_decorator, ", "" }, + }; + fs_src = fmt::replace_all(fs_src, repl_list); + m_input_filter = gl::filter::linear; } @@ -480,11 +487,11 @@ namespace gl program_handle.uniforms["stereo_display_mode"] = static_cast(stereo_mode); program_handle.uniforms["stereo_image_count"] = (source[1] == GL_NONE? 1 : 2); - saved_sampler_state saved(31, m_sampler); - cmd->bind_texture(31, GL_TEXTURE_2D, source[0]); + saved_sampler_state saved(GL_TEMP_IMAGE_SLOT(0), m_sampler); + cmd->bind_texture(GL_TEMP_IMAGE_SLOT(0), GL_TEXTURE_2D, source[0]); - saved_sampler_state saved2(30, m_sampler); - cmd->bind_texture(30, GL_TEXTURE_2D, source[1]); + saved_sampler_state saved2(GL_TEMP_IMAGE_SLOT(1), m_sampler); + cmd->bind_texture(GL_TEMP_IMAGE_SLOT(1), GL_TEXTURE_2D, source[1]); overlay_pass::run(cmd, viewport, GL_NONE, gl::image_aspect::color, false); } diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/GenericVSPassthrough.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/GenericVSPassthrough.glsl index 5c4eca74bb..0428dc16c4 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/GenericVSPassthrough.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/GenericVSPassthrough.glsl @@ -2,10 +2,21 @@ R"( #version 420 layout(location=0) out vec2 tc0; +#ifdef VULKAN +#define gl_VertexID gl_VertexIndex +#endif + void main() { vec2 positions[] = {vec2(-1., -1.), vec2(1., -1.), vec2(-1., 1.), vec2(1., 1.)}; +#ifdef VULKAN + // Origin at top left + vec2 coords[] = {vec2(0., 0.), vec2(1., 0.), vec2(0., 1.), vec2(1., 1.)}; +#else + // Origin at bottom left. Flip Y coordinate. vec2 coords[] = {vec2(0., 1.), vec2(1., 1.), vec2(0., 0.), vec2(1., 0.)}; +#endif + tc0 = coords[gl_VertexID % 4]; vec2 pos = positions[gl_VertexID % 4]; gl_Position = vec4(pos, 0., 1.); diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/VideoOutCalibrationPass.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/VideoOutCalibrationPass.glsl index 6769514a41..65b5836a15 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/VideoOutCalibrationPass.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/VideoOutCalibrationPass.glsl @@ -1,13 +1,10 @@ R"( -#version 420 +#version 440 -#ifdef VULKAN -layout(set=0, binding=1) uniform sampler2D fs0; -layout(set=0, binding=2) uniform sampler2D fs1; -#else -layout(binding=31) uniform sampler2D fs0; -layout(binding=30) uniform sampler2D fs1; -#endif +#define SAMPLER_BINDING(x) %sampler_binding + +layout(%set_decorator, binding=SAMPLER_BINDING(0)) uniform sampler2D fs0; +layout(%set_decorator, binding=SAMPLER_BINDING(1)) uniform sampler2D fs1; layout(location=0) in vec2 tc0; layout(location=0) out vec4 ocol; @@ -77,7 +74,10 @@ vec4 anaglyph_stereo_image() vec4 read_source() { - if (stereo_display_mode == STEREO_MODE_DISABLED) return texture(fs0, tc0); + if (stereo_display_mode == STEREO_MODE_DISABLED) + { + return texture(fs0, tc0); + } if (stereo_image_count == 1) { @@ -106,7 +106,8 @@ vec4 read_source() return texture(fs0, tc0); } } - else if (stereo_image_count == 2) + + if (stereo_image_count == 2) { switch (stereo_display_mode) { @@ -133,23 +134,17 @@ vec4 read_source() return texture(fs0, tc0); } } - else - { - vec2 coord_left = tc0 * left_single_matrix; - vec2 coord_right = coord_left + right_single_matrix; - vec4 left = texture(fs0, coord_left); - vec4 right = texture(fs0, coord_right); - return vec4(left.r, right.g, right.b, 1.); - } + + // Unreachable. Return debug color fill + return vec4(1., 0., 0., 1.); } void main() { vec4 color = read_source(); color.rgb = pow(color.rgb, vec3(gamma)); - if (limit_range > 0) - ocol = ((color * 220.) + 16.) / 255.; - else - ocol = color; + ocol = (limit_range == 0) + ? ocol = color + : ((color * 220.) + 16.) / 255.; } )" diff --git a/rpcs3/Emu/RSX/VK/VKOverlays.cpp b/rpcs3/Emu/RSX/VK/VKOverlays.cpp index 02eb03ddae..d0b158d8ea 100644 --- a/rpcs3/Emu/RSX/VK/VKOverlays.cpp +++ b/rpcs3/Emu/RSX/VK/VKOverlays.cpp @@ -857,22 +857,20 @@ namespace vk video_out_calibration_pass::video_out_calibration_pass() { vs_src = - "#version 450\n\n" - "layout(location=0) out vec2 tc0;\n" - "\n" - "void main()\n" - "{\n" - " vec2 positions[] = {vec2(-1., -1.), vec2(1., -1.), vec2(-1., 1.), vec2(1., 1.)};\n" - " vec2 coords[] = {vec2(0., 0.), vec2(1., 0.), vec2(0., 1.), vec2(1., 1.)};\n" - " tc0 = coords[gl_VertexIndex % 4];\n" - " vec2 pos = positions[gl_VertexIndex % 4];\n" - " gl_Position = vec4(pos, 0., 1.);\n" - "}\n"; + #include "../Program/GLSLSnippets/GenericVSPassthrough.glsl" + ; fs_src = #include "../Program/GLSLSnippets/VideoOutCalibrationPass.glsl" ; + std::pair repl_list[] = + { + { "%sampler_binding", fmt::format("(%d + x)", sampler_location(0)) }, + { "%set_decorator", "set=0" }, + }; + fs_src = fmt::replace_all(fs_src, repl_list); + renderpass_config.set_depth_mask(false); renderpass_config.set_color_mask(0, true, true, true, true); renderpass_config.set_attachment_count(1);