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