diff --git a/src/video_core/host_shaders/vulkan_present.frag b/src/video_core/host_shaders/vulkan_present.frag index 8fb0643a0..b9f49383d 100644 --- a/src/video_core/host_shaders/vulkan_present.frag +++ b/src/video_core/host_shaders/vulkan_present.frag @@ -20,6 +20,18 @@ layout (push_constant, std140) uniform DrawInfo { layout (set = 0, binding = 0) uniform sampler2D screen_textures[3]; -void main() { - color = texture(screen_textures[screen_id_l], frag_tex_coord); +// Not all vulkan drivers support shaderSampledImageArrayDynamicIndexing, so index manually. +vec4 GetScreen(int screen_id) { + switch (screen_id) { + case 0: + return texture(screen_textures[0], frag_tex_coord); + case 1: + return texture(screen_textures[1], frag_tex_coord); + case 2: + return texture(screen_textures[2], frag_tex_coord); + } +} + +void main() { + color = GetScreen(screen_id_l); } diff --git a/src/video_core/host_shaders/vulkan_present_anaglyph.frag b/src/video_core/host_shaders/vulkan_present_anaglyph.frag index 4d39678e4..373a81f84 100644 --- a/src/video_core/host_shaders/vulkan_present_anaglyph.frag +++ b/src/video_core/host_shaders/vulkan_present_anaglyph.frag @@ -32,8 +32,20 @@ layout (push_constant, std140) uniform DrawInfo { layout (set = 0, binding = 0) uniform sampler2D screen_textures[3]; +// Not all vulkan drivers support shaderSampledImageArrayDynamicIndexing, so index manually. +vec4 GetScreen(int screen_id) { + switch (screen_id) { + case 0: + return texture(screen_textures[0], frag_tex_coord); + case 1: + return texture(screen_textures[1], frag_tex_coord); + case 2: + return texture(screen_textures[2], frag_tex_coord); + } +} + void main() { - vec4 color_tex_l = texture(screen_textures[screen_id_l], frag_tex_coord); - vec4 color_tex_r = texture(screen_textures[screen_id_r], frag_tex_coord); + vec4 color_tex_l = GetScreen(screen_id_l); + vec4 color_tex_r = GetScreen(screen_id_r); color = vec4(color_tex_l.rgb*l+color_tex_r.rgb*r, color_tex_l.a); } diff --git a/src/video_core/host_shaders/vulkan_present_interlaced.frag b/src/video_core/host_shaders/vulkan_present_interlaced.frag index 2f5a18b90..f5c6f6c70 100644 --- a/src/video_core/host_shaders/vulkan_present_interlaced.frag +++ b/src/video_core/host_shaders/vulkan_present_interlaced.frag @@ -20,10 +20,22 @@ layout (push_constant, std140) uniform DrawInfo { layout (set = 0, binding = 0) uniform sampler2D screen_textures[3]; +// Not all vulkan drivers support shaderSampledImageArrayDynamicIndexing, so index manually. +vec4 GetScreen(int screen_id) { + switch (screen_id) { + case 0: + return texture(screen_textures[0], frag_tex_coord); + case 1: + return texture(screen_textures[1], frag_tex_coord); + case 2: + return texture(screen_textures[2], frag_tex_coord); + } +} + void main() { float screen_row = o_resolution.x * frag_tex_coord.x; if (int(screen_row) % 2 == reverse_interlaced) - color = texture(screen_textures[screen_id_l], frag_tex_coord); + color = GetScreen(screen_id_l); else - color = texture(screen_textures[screen_id_r], frag_tex_coord); + color = GetScreen(screen_id_r); }