Fix result checking of output location tests

Output location tests were expecting bit accurate results
when comparing to reference values. However some of the
tests use lowp or mediump precision.  This change adds
some tolerance for the result checking. Also lowp variants
are removed as they acted identically to mediump ones.

VK-GL-CTS Issue: 2513
VK-GL-CTS Issue: 2510
VK-GL-CTS Issue: 2550

Affects:

dEQP-VK.draw.output_location.*

Components: Vulkan
Change-Id: Ic7b96a5b5be441cd78a0e50be5fcf86308c80652
diff --git a/android/cts/master/vk-master-2020-03-01.txt b/android/cts/master/vk-master-2020-03-01.txt
index 8ff7e2e..bacff5f 100644
--- a/android/cts/master/vk-master-2020-03-01.txt
+++ b/android/cts/master/vk-master-2020-03-01.txt
@@ -157589,43 +157589,29 @@
 dEQP-VK.draw.output_location.array.b10g11r11-ufloat-pack32-highp
 dEQP-VK.draw.output_location.array.b10g11r11-ufloat-pack32-highp-output-float
 dEQP-VK.draw.output_location.array.b10g11r11-ufloat-pack32-highp-output-vec2
-dEQP-VK.draw.output_location.array.b10g11r11-ufloat-pack32-lowp
-dEQP-VK.draw.output_location.array.b10g11r11-ufloat-pack32-lowp-output-float
-dEQP-VK.draw.output_location.array.b10g11r11-ufloat-pack32-lowp-output-vec2
 dEQP-VK.draw.output_location.array.b10g11r11-ufloat-pack32-mediump
 dEQP-VK.draw.output_location.array.b10g11r11-ufloat-pack32-mediump-output-float
 dEQP-VK.draw.output_location.array.b10g11r11-ufloat-pack32-mediump-output-vec2
 dEQP-VK.draw.output_location.array.b8g8r8a8-unorm-highp
 dEQP-VK.draw.output_location.array.b8g8r8a8-unorm-highp-output-vec2
 dEQP-VK.draw.output_location.array.b8g8r8a8-unorm-highp-output-vec3
-dEQP-VK.draw.output_location.array.b8g8r8a8-unorm-lowp
-dEQP-VK.draw.output_location.array.b8g8r8a8-unorm-lowp-output-vec2
-dEQP-VK.draw.output_location.array.b8g8r8a8-unorm-lowp-output-vec3
 dEQP-VK.draw.output_location.array.b8g8r8a8-unorm-mediump
 dEQP-VK.draw.output_location.array.b8g8r8a8-unorm-mediump-output-vec2
 dEQP-VK.draw.output_location.array.b8g8r8a8-unorm-mediump-output-vec3
 dEQP-VK.draw.output_location.array.r16g16-sfloat-highp
 dEQP-VK.draw.output_location.array.r16g16-sfloat-highp-output-float
-dEQP-VK.draw.output_location.array.r16g16-sfloat-lowp
-dEQP-VK.draw.output_location.array.r16g16-sfloat-lowp-output-float
 dEQP-VK.draw.output_location.array.r16g16-sfloat-mediump
 dEQP-VK.draw.output_location.array.r16g16-sfloat-mediump-output-float
 dEQP-VK.draw.output_location.array.r32g32b32a32-sfloat-highp
 dEQP-VK.draw.output_location.array.r32g32b32a32-sfloat-highp-output-vec2
 dEQP-VK.draw.output_location.array.r32g32b32a32-sfloat-highp-output-vec3
-dEQP-VK.draw.output_location.array.r32g32b32a32-sfloat-lowp
-dEQP-VK.draw.output_location.array.r32g32b32a32-sfloat-lowp-output-vec2
-dEQP-VK.draw.output_location.array.r32g32b32a32-sfloat-lowp-output-vec3
 dEQP-VK.draw.output_location.array.r32g32b32a32-sfloat-mediump
 dEQP-VK.draw.output_location.array.r32g32b32a32-sfloat-mediump-output-vec2
 dEQP-VK.draw.output_location.array.r32g32b32a32-sfloat-mediump-output-vec3
 dEQP-VK.draw.output_location.array.r32-sfloat-highp
-dEQP-VK.draw.output_location.array.r32-sfloat-lowp
 dEQP-VK.draw.output_location.array.r32-sfloat-mediump
 dEQP-VK.draw.output_location.array.r8g8-uint-highp
 dEQP-VK.draw.output_location.array.r8g8-uint-highp-output-uint
-dEQP-VK.draw.output_location.array.r8g8-uint-lowp
-dEQP-VK.draw.output_location.array.r8g8-uint-lowp-output-uint
 dEQP-VK.draw.output_location.array.r8g8-uint-mediump
 dEQP-VK.draw.output_location.array.r8g8-uint-mediump-output-uint
 dEQP-VK.draw.output_location.shuffle.inputs-outputs
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index 56a0dec..999d446 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
Binary files differ
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp-output-float.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp-output-float.amber
index aae7452..a98f6ac 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp-output-float.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp-output-float.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    float result = texture(result_sampler, texcoord_in).x;
+    float ref = texture(ref_sampler, texcoord_in).x;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer2 FORMAT B10G11R11_UFLOAT_PACK32
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER ref2 FORMAT B10G11R11_UFLOAT_PACK32
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp-output-vec2.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp-output-vec2.amber
index e70eb2b..06f4a74 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp-output-vec2.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp-output-vec2.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec2 result = texture(result_sampler, texcoord_in).xy;
+    vec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer2 FORMAT B10G11R11_UFLOAT_PACK32
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER ref2 FORMAT B10G11R11_UFLOAT_PACK32
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp.amber
index fbcd9f5..cc2f2e0 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-highp.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec3 result = texture(result_sampler, texcoord_in).xyz;
+    vec3 ref = texture(ref_sampler, texcoord_in).xyz;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer2 FORMAT B10G11R11_UFLOAT_PACK32
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER ref2 FORMAT B10G11R11_UFLOAT_PACK32
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-lowp-output-float.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-lowp-output-float.amber
deleted file mode 100644
index bd0d5ce..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-lowp-output-float.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec3 color_in[3];
-layout(location = 0) smooth out vec3 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec3 color_in[3];
-layout(location = 0) out lowp float frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i].x;
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec3 color_in;
-layout(location = 0) smooth out vec3 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec3 color_in;
-layout(location = 0) out lowp float frag_out;
-void main()
-{
-    frag_out = color_in.x;
-}
-END
-
-BUFFER framebuffer0 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER framebuffer1 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER framebuffer2 FORMAT B10G11R11_UFLOAT_PACK32
-
-BUFFER ref0 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER ref1 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER ref2 FORMAT B10G11R11_UFLOAT_PACK32
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-END
-
-BUFFER color1 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-END
-
-BUFFER color2 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-lowp-output-vec2.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-lowp-output-vec2.amber
deleted file mode 100644
index ff63314..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-lowp-output-vec2.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec3 color_in[3];
-layout(location = 0) smooth out vec3 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec3 color_in[3];
-layout(location = 0) out lowp vec2 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i].xy;
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec3 color_in;
-layout(location = 0) smooth out vec3 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec3 color_in;
-layout(location = 0) out lowp vec2 frag_out;
-void main()
-{
-    frag_out = color_in.xy;
-}
-END
-
-BUFFER framebuffer0 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER framebuffer1 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER framebuffer2 FORMAT B10G11R11_UFLOAT_PACK32
-
-BUFFER ref0 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER ref1 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER ref2 FORMAT B10G11R11_UFLOAT_PACK32
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-END
-
-BUFFER color1 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-END
-
-BUFFER color2 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-lowp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-lowp.amber
deleted file mode 100644
index 9b02cb9..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-lowp.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec3 color_in[3];
-layout(location = 0) smooth out vec3 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec3 color_in[3];
-layout(location = 0) out lowp vec3 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i];
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec3 color_in;
-layout(location = 0) smooth out vec3 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec3 color_in;
-layout(location = 0) out lowp vec3 frag_out;
-void main()
-{
-    frag_out = color_in;
-}
-END
-
-BUFFER framebuffer0 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER framebuffer1 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER framebuffer2 FORMAT B10G11R11_UFLOAT_PACK32
-
-BUFFER ref0 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER ref1 FORMAT B10G11R11_UFLOAT_PACK32
-BUFFER ref2 FORMAT B10G11R11_UFLOAT_PACK32
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-END
-
-BUFFER color1 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-END
-
-BUFFER color2 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump-output-float.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump-output-float.amber
index 62c1559..c593992 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump-output-float.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump-output-float.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    float result = texture(result_sampler, texcoord_in).x;
+    float ref = texture(ref_sampler, texcoord_in).x;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer2 FORMAT B10G11R11_UFLOAT_PACK32
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER ref2 FORMAT B10G11R11_UFLOAT_PACK32
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump-output-vec2.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump-output-vec2.amber
index f45a265..6f76a98 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump-output-vec2.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump-output-vec2.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec2 result = texture(result_sampler, texcoord_in).xy;
+    vec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer2 FORMAT B10G11R11_UFLOAT_PACK32
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER ref2 FORMAT B10G11R11_UFLOAT_PACK32
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump.amber
index 6625674..65eb167 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b10g11r11-ufloat-pack32-mediump.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec3 result = texture(result_sampler, texcoord_in).xyz;
+    vec3 ref = texture(ref_sampler, texcoord_in).xyz;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER framebuffer2 FORMAT B10G11R11_UFLOAT_PACK32
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B10G11R11_UFLOAT_PACK32
 BUFFER ref2 FORMAT B10G11R11_UFLOAT_PACK32
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp-output-vec2.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp-output-vec2.amber
index c58c617..7f592e1 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp-output-vec2.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp-output-vec2.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec2 result = texture(result_sampler, texcoord_in).xy;
+    vec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B8G8R8A8_UNORM
 BUFFER ref2 FORMAT B8G8R8A8_UNORM
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
 255   0   0 255
   0 255   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp-output-vec3.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp-output-vec3.amber
index d0b5d13..5be0847 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp-output-vec3.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp-output-vec3.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec3 result = texture(result_sampler, texcoord_in).xyz;
+    vec3 ref = texture(ref_sampler, texcoord_in).xyz;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B8G8R8A8_UNORM
 BUFFER ref2 FORMAT B8G8R8A8_UNORM
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
 255   0   0 255
   0 255   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp.amber
index 429f3ad..859537d 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-highp.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec4 result = texture(result_sampler, texcoord_in);
+    vec4 ref = texture(ref_sampler, texcoord_in);
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B8G8R8A8_UNORM
 BUFFER ref2 FORMAT B8G8R8A8_UNORM
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
 255   0   0 255
   0 255   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-lowp-output-vec2.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-lowp-output-vec2.amber
deleted file mode 100644
index 97e38af..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-lowp-output-vec2.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in[3];
-layout(location = 0) smooth out vec4 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in[3];
-layout(location = 0) out lowp vec2 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i].xy;
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in;
-layout(location = 0) smooth out vec4 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in;
-layout(location = 0) out lowp vec2 frag_out;
-void main()
-{
-    frag_out = color_in.xy;
-}
-END
-
-BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
-BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
-BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
-
-BUFFER ref0 FORMAT B8G8R8A8_UNORM
-BUFFER ref1 FORMAT B8G8R8A8_UNORM
-BUFFER ref2 FORMAT B8G8R8A8_UNORM
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
-255   0   0 255
-  0 255   0 255
-  0   0 255 255
-255 255   0 255
-END
-
-BUFFER color1 DATA_TYPE B8G8R8A8_UNORM DATA
-  0 255   0 255
-  0   0 255 255
-255 255   0 255
-255   0   0 255
-END
-
-BUFFER color2 DATA_TYPE B8G8R8A8_UNORM DATA
-  0   0 255 255
-255 255   0 255
-255   0   0 255
-  0 255   0 255
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-lowp-output-vec3.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-lowp-output-vec3.amber
deleted file mode 100644
index d513377..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-lowp-output-vec3.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in[3];
-layout(location = 0) smooth out vec4 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in[3];
-layout(location = 0) out lowp vec3 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i].xyz;
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in;
-layout(location = 0) smooth out vec4 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in;
-layout(location = 0) out lowp vec3 frag_out;
-void main()
-{
-    frag_out = color_in.xyz;
-}
-END
-
-BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
-BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
-BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
-
-BUFFER ref0 FORMAT B8G8R8A8_UNORM
-BUFFER ref1 FORMAT B8G8R8A8_UNORM
-BUFFER ref2 FORMAT B8G8R8A8_UNORM
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
-255   0   0 255
-  0 255   0 255
-  0   0 255 255
-255 255   0 255
-END
-
-BUFFER color1 DATA_TYPE B8G8R8A8_UNORM DATA
-  0 255   0 255
-  0   0 255 255
-255 255   0 255
-255   0   0 255
-END
-
-BUFFER color2 DATA_TYPE B8G8R8A8_UNORM DATA
-  0   0 255 255
-255 255   0 255
-255   0   0 255
-  0 255   0 255
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-lowp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-lowp.amber
deleted file mode 100644
index 909a486..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-lowp.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in[3];
-layout(location = 0) smooth out vec4 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in[3];
-layout(location = 0) out lowp vec4 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i];
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in;
-layout(location = 0) smooth out vec4 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in;
-layout(location = 0) out lowp vec4 frag_out;
-void main()
-{
-    frag_out = color_in;
-}
-END
-
-BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
-BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
-BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
-
-BUFFER ref0 FORMAT B8G8R8A8_UNORM
-BUFFER ref1 FORMAT B8G8R8A8_UNORM
-BUFFER ref2 FORMAT B8G8R8A8_UNORM
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
-255   0   0 255
-  0 255   0 255
-  0   0 255 255
-255 255   0 255
-END
-
-BUFFER color1 DATA_TYPE B8G8R8A8_UNORM DATA
-  0 255   0 255
-  0   0 255 255
-255 255   0 255
-255   0   0 255
-END
-
-BUFFER color2 DATA_TYPE B8G8R8A8_UNORM DATA
-  0   0 255 255
-255 255   0 255
-255   0   0 255
-  0 255   0 255
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump-output-vec2.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump-output-vec2.amber
index 6818bd4..b7f2f89 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump-output-vec2.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump-output-vec2.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec2 result = texture(result_sampler, texcoord_in).xy;
+    vec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B8G8R8A8_UNORM
 BUFFER ref2 FORMAT B8G8R8A8_UNORM
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
 255   0   0 255
   0 255   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump-output-vec3.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump-output-vec3.amber
index 5a0858f..556728f 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump-output-vec3.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump-output-vec3.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec3 result = texture(result_sampler, texcoord_in).xyz;
+    vec3 ref = texture(ref_sampler, texcoord_in).xyz;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B8G8R8A8_UNORM
 BUFFER ref2 FORMAT B8G8R8A8_UNORM
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
 255   0   0 255
   0 255   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump.amber
index ee040c1..c3a909d 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/b8g8r8a8-unorm-mediump.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec4 result = texture(result_sampler, texcoord_in);
+    vec4 ref = texture(ref_sampler, texcoord_in);
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
 BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT B8G8R8A8_UNORM
 BUFFER ref2 FORMAT B8G8R8A8_UNORM
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
 255   0   0 255
   0 255   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-highp-output-float.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-highp-output-float.amber
index 9bf2fbd..a951846 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-highp-output-float.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-highp-output-float.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    float result = texture(result_sampler, texcoord_in).x;
+    float ref = texture(ref_sampler, texcoord_in).x;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R16G16_SFLOAT
 BUFFER framebuffer1 FORMAT R16G16_SFLOAT
 BUFFER framebuffer2 FORMAT R16G16_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R16G16_SFLOAT
 BUFFER ref2 FORMAT R16G16_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R16G16_SFLOAT DATA
 1.0 0.0
 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-highp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-highp.amber
index f83c249..66784fa 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-highp.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-highp.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec2 result = texture(result_sampler, texcoord_in).xy;
+    vec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R16G16_SFLOAT
 BUFFER framebuffer1 FORMAT R16G16_SFLOAT
 BUFFER framebuffer2 FORMAT R16G16_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R16G16_SFLOAT
 BUFFER ref2 FORMAT R16G16_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R16G16_SFLOAT DATA
 1.0 0.0
 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-lowp-output-float.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-lowp-output-float.amber
deleted file mode 100644
index 8bfe403..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-lowp-output-float.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec2 color_in[3];
-layout(location = 0) smooth out vec2 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec2 color_in[3];
-layout(location = 0) out lowp float frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i].x;
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec2 color_in;
-layout(location = 0) smooth out vec2 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec2 color_in;
-layout(location = 0) out lowp float frag_out;
-void main()
-{
-    frag_out = color_in.x;
-}
-END
-
-BUFFER framebuffer0 FORMAT R16G16_SFLOAT
-BUFFER framebuffer1 FORMAT R16G16_SFLOAT
-BUFFER framebuffer2 FORMAT R16G16_SFLOAT
-
-BUFFER ref0 FORMAT R16G16_SFLOAT
-BUFFER ref1 FORMAT R16G16_SFLOAT
-BUFFER ref2 FORMAT R16G16_SFLOAT
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R16G16_SFLOAT DATA
-1.0 0.0
-0.0 1.0
-0.0 0.0
-1.0 1.0
-END
-
-BUFFER color1 DATA_TYPE R16G16_SFLOAT DATA
-0.0 1.0
-0.0 0.0
-1.0 1.0
-1.0 0.0
-END
-
-BUFFER color2 DATA_TYPE R16G16_SFLOAT DATA
-0.0 0.0
-1.0 1.0
-1.0 0.0
-0.0 1.0
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-lowp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-lowp.amber
deleted file mode 100644
index 91f210e..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-lowp.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec2 color_in[3];
-layout(location = 0) smooth out vec2 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec2 color_in[3];
-layout(location = 0) out lowp vec2 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i];
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec2 color_in;
-layout(location = 0) smooth out vec2 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec2 color_in;
-layout(location = 0) out lowp vec2 frag_out;
-void main()
-{
-    frag_out = color_in;
-}
-END
-
-BUFFER framebuffer0 FORMAT R16G16_SFLOAT
-BUFFER framebuffer1 FORMAT R16G16_SFLOAT
-BUFFER framebuffer2 FORMAT R16G16_SFLOAT
-
-BUFFER ref0 FORMAT R16G16_SFLOAT
-BUFFER ref1 FORMAT R16G16_SFLOAT
-BUFFER ref2 FORMAT R16G16_SFLOAT
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R16G16_SFLOAT DATA
-1.0 0.0
-0.0 1.0
-0.0 0.0
-1.0 1.0
-END
-
-BUFFER color1 DATA_TYPE R16G16_SFLOAT DATA
-0.0 1.0
-0.0 0.0
-1.0 1.0
-1.0 0.0
-END
-
-BUFFER color2 DATA_TYPE R16G16_SFLOAT DATA
-0.0 0.0
-1.0 1.0
-1.0 0.0
-0.0 1.0
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-mediump-output-float.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-mediump-output-float.amber
index 37b6d42..ed4c955 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-mediump-output-float.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-mediump-output-float.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    float result = texture(result_sampler, texcoord_in).x;
+    float ref = texture(ref_sampler, texcoord_in).x;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R16G16_SFLOAT
 BUFFER framebuffer1 FORMAT R16G16_SFLOAT
 BUFFER framebuffer2 FORMAT R16G16_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R16G16_SFLOAT
 BUFFER ref2 FORMAT R16G16_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R16G16_SFLOAT DATA
 1.0 0.0
 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-mediump.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-mediump.amber
index ab6dd50..2199757 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-mediump.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r16g16-sfloat-mediump.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec2 result = texture(result_sampler, texcoord_in).xy;
+    vec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R16G16_SFLOAT
 BUFFER framebuffer1 FORMAT R16G16_SFLOAT
 BUFFER framebuffer2 FORMAT R16G16_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R16G16_SFLOAT
 BUFFER ref2 FORMAT R16G16_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R16G16_SFLOAT DATA
 1.0 0.0
 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-highp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-highp.amber
index e222881..540fcca 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-highp.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-highp.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    float result = texture(result_sampler, texcoord_in).x;
+    float ref = texture(ref_sampler, texcoord_in).x;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R32_SFLOAT
 BUFFER framebuffer1 FORMAT R32_SFLOAT
 BUFFER framebuffer2 FORMAT R32_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R32_SFLOAT
 BUFFER ref2 FORMAT R32_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32_SFLOAT DATA
 1.0
 0.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-lowp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-lowp.amber
deleted file mode 100644
index 6fb5f17..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-lowp.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in float color_in[3];
-layout(location = 0) smooth out float color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in float color_in[3];
-layout(location = 0) out lowp float frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i];
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in float color_in;
-layout(location = 0) smooth out float color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in float color_in;
-layout(location = 0) out lowp float frag_out;
-void main()
-{
-    frag_out = color_in;
-}
-END
-
-BUFFER framebuffer0 FORMAT R32_SFLOAT
-BUFFER framebuffer1 FORMAT R32_SFLOAT
-BUFFER framebuffer2 FORMAT R32_SFLOAT
-
-BUFFER ref0 FORMAT R32_SFLOAT
-BUFFER ref1 FORMAT R32_SFLOAT
-BUFFER ref2 FORMAT R32_SFLOAT
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R32_SFLOAT DATA
-1.0
-0.0
-0.0
-1.0
-END
-
-BUFFER color1 DATA_TYPE R32_SFLOAT DATA
-0.0
-0.0
-1.0
-1.0
-END
-
-BUFFER color2 DATA_TYPE R32_SFLOAT DATA
-0.0
-1.0
-1.0
-0.0
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-mediump.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-mediump.amber
index 769eade..d874a6b 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-mediump.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32-sfloat-mediump.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    float result = texture(result_sampler, texcoord_in).x;
+    float ref = texture(ref_sampler, texcoord_in).x;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R32_SFLOAT
 BUFFER framebuffer1 FORMAT R32_SFLOAT
 BUFFER framebuffer2 FORMAT R32_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R32_SFLOAT
 BUFFER ref2 FORMAT R32_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32_SFLOAT DATA
 1.0
 0.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp-output-vec2.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp-output-vec2.amber
index fbac98a..370ac83 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp-output-vec2.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp-output-vec2.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec2 result = texture(result_sampler, texcoord_in).xy;
+    vec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer1 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer2 FORMAT R32G32B32A32_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R32G32B32A32_SFLOAT
 BUFFER ref2 FORMAT R32G32B32A32_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp-output-vec3.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp-output-vec3.amber
index e1b0b29..fd581d8 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp-output-vec3.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp-output-vec3.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec3 result = texture(result_sampler, texcoord_in).xyz;
+    vec3 ref = texture(ref_sampler, texcoord_in).xyz;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer1 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer2 FORMAT R32G32B32A32_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R32G32B32A32_SFLOAT
 BUFFER ref2 FORMAT R32G32B32A32_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp.amber
index fef288c..d639d92 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-highp.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec4 result = texture(result_sampler, texcoord_in);
+    vec4 ref = texture(ref_sampler, texcoord_in);
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer1 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer2 FORMAT R32G32B32A32_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R32G32B32A32_SFLOAT
 BUFFER ref2 FORMAT R32G32B32A32_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-lowp-output-vec2.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-lowp-output-vec2.amber
deleted file mode 100644
index 5bab42a..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-lowp-output-vec2.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in[3];
-layout(location = 0) smooth out vec4 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in[3];
-layout(location = 0) out lowp vec2 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i].xy;
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in;
-layout(location = 0) smooth out vec4 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in;
-layout(location = 0) out lowp vec2 frag_out;
-void main()
-{
-    frag_out = color_in.xy;
-}
-END
-
-BUFFER framebuffer0 FORMAT R32G32B32A32_SFLOAT
-BUFFER framebuffer1 FORMAT R32G32B32A32_SFLOAT
-BUFFER framebuffer2 FORMAT R32G32B32A32_SFLOAT
-
-BUFFER ref0 FORMAT R32G32B32A32_SFLOAT
-BUFFER ref1 FORMAT R32G32B32A32_SFLOAT
-BUFFER ref2 FORMAT R32G32B32A32_SFLOAT
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-END
-
-BUFFER color1 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-END
-
-BUFFER color2 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-lowp-output-vec3.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-lowp-output-vec3.amber
deleted file mode 100644
index 213ab95..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-lowp-output-vec3.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in[3];
-layout(location = 0) smooth out vec4 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in[3];
-layout(location = 0) out lowp vec3 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i].xyz;
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in;
-layout(location = 0) smooth out vec4 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in;
-layout(location = 0) out lowp vec3 frag_out;
-void main()
-{
-    frag_out = color_in.xyz;
-}
-END
-
-BUFFER framebuffer0 FORMAT R32G32B32A32_SFLOAT
-BUFFER framebuffer1 FORMAT R32G32B32A32_SFLOAT
-BUFFER framebuffer2 FORMAT R32G32B32A32_SFLOAT
-
-BUFFER ref0 FORMAT R32G32B32A32_SFLOAT
-BUFFER ref1 FORMAT R32G32B32A32_SFLOAT
-BUFFER ref2 FORMAT R32G32B32A32_SFLOAT
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-END
-
-BUFFER color1 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-END
-
-BUFFER color2 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-lowp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-lowp.amber
deleted file mode 100644
index 7abe705..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-lowp.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in[3];
-layout(location = 0) smooth out vec4 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in[3];
-layout(location = 0) out lowp vec4 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i];
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in vec4 color_in;
-layout(location = 0) smooth out vec4 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) smooth in vec4 color_in;
-layout(location = 0) out lowp vec4 frag_out;
-void main()
-{
-    frag_out = color_in;
-}
-END
-
-BUFFER framebuffer0 FORMAT R32G32B32A32_SFLOAT
-BUFFER framebuffer1 FORMAT R32G32B32A32_SFLOAT
-BUFFER framebuffer2 FORMAT R32G32B32A32_SFLOAT
-
-BUFFER ref0 FORMAT R32G32B32A32_SFLOAT
-BUFFER ref1 FORMAT R32G32B32A32_SFLOAT
-BUFFER ref2 FORMAT R32G32B32A32_SFLOAT
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-END
-
-BUFFER color1 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 1.0 0.0 1.0
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-END
-
-BUFFER color2 DATA_TYPE R32G32B32A32_SFLOAT DATA
-0.0 0.0 1.0 1.0
-1.0 1.0 0.0 1.0
-1.0 0.0 0.0 1.0
-0.0 1.0 0.0 1.0
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump-output-vec2.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump-output-vec2.amber
index f158f74..5b2fa8f 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump-output-vec2.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump-output-vec2.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec2 result = texture(result_sampler, texcoord_in).xy;
+    vec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer1 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer2 FORMAT R32G32B32A32_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R32G32B32A32_SFLOAT
 BUFFER ref2 FORMAT R32G32B32A32_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump-output-vec3.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump-output-vec3.amber
index eb9c9ca..58fcf98 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump-output-vec3.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump-output-vec3.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec3 result = texture(result_sampler, texcoord_in).xyz;
+    vec3 ref = texture(ref_sampler, texcoord_in).xyz;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer1 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer2 FORMAT R32G32B32A32_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R32G32B32A32_SFLOAT
 BUFFER ref2 FORMAT R32G32B32A32_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump.amber
index 7185e28..dad7883 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r32g32b32a32-sfloat-mediump.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec4 result = texture(result_sampler, texcoord_in);
+    vec4 ref = texture(ref_sampler, texcoord_in);
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer1 FORMAT R32G32B32A32_SFLOAT
 BUFFER framebuffer2 FORMAT R32G32B32A32_SFLOAT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R32G32B32A32_SFLOAT
 BUFFER ref2 FORMAT R32G32B32A32_SFLOAT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R32G32B32A32_SFLOAT DATA
 1.0 0.0 0.0 1.0
 0.0 1.0 0.0 1.0
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-highp-output-uint.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-highp-output-uint.amber
index 395996c..d99df7f 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-highp-output-uint.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-highp-output-uint.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) usampler2D result_sampler;
+uniform layout(set=0, binding=1) usampler2D ref_sampler;
+void main()
+{
+    uint result = texture(result_sampler, texcoord_in).x;
+    uint ref = texture(ref_sampler, texcoord_in).x;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R8G8_UINT
 BUFFER framebuffer1 FORMAT R8G8_UINT
 BUFFER framebuffer2 FORMAT R8G8_UINT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R8G8_UINT
 BUFFER ref2 FORMAT R8G8_UINT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R8G8_UINT DATA
 255   0
   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-highp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-highp.amber
index b67e53b..ca11d1b 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-highp.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-highp.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) usampler2D result_sampler;
+uniform layout(set=0, binding=1) usampler2D ref_sampler;
+void main()
+{
+    uvec2 result = texture(result_sampler, texcoord_in).xy;
+    uvec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R8G8_UINT
 BUFFER framebuffer1 FORMAT R8G8_UINT
 BUFFER framebuffer2 FORMAT R8G8_UINT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R8G8_UINT
 BUFFER ref2 FORMAT R8G8_UINT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R8G8_UINT DATA
 255   0
   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-lowp-output-uint.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-lowp-output-uint.amber
deleted file mode 100644
index 1b9cf1f..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-lowp-output-uint.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in uvec2 color_in[3];
-layout(location = 0) flat out uvec2 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) flat in uvec2 color_in[3];
-layout(location = 0) out lowp uint frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i].x;
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in uvec2 color_in;
-layout(location = 0) flat out uvec2 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) flat in uvec2 color_in;
-layout(location = 0) out lowp uint frag_out;
-void main()
-{
-    frag_out = color_in.x;
-}
-END
-
-BUFFER framebuffer0 FORMAT R8G8_UINT
-BUFFER framebuffer1 FORMAT R8G8_UINT
-BUFFER framebuffer2 FORMAT R8G8_UINT
-
-BUFFER ref0 FORMAT R8G8_UINT
-BUFFER ref1 FORMAT R8G8_UINT
-BUFFER ref2 FORMAT R8G8_UINT
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R8G8_UINT DATA
-255   0
-  0 255
-  0   0
-255 255
-END
-
-BUFFER color1 DATA_TYPE R8G8_UINT DATA
-  0 255
-  0   0
-255 255
-255   0
-END
-
-BUFFER color2 DATA_TYPE R8G8_UINT DATA
-  0   0
-255 255
-255   0
-  0 255
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-lowp.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-lowp.amber
deleted file mode 100644
index cd7d8af..0000000
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-lowp.amber
+++ /dev/null
@@ -1,155 +0,0 @@
-#!amber
-# Copyright 2020 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-SHADER vertex vert_shader GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in uvec2 color_in[3];
-layout(location = 0) flat out uvec2 color_out[3];
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    for (int i = 0; i < 3; i++)
-        color_out[i] = color_in[i];
-}
-END
-
-SHADER fragment frag_shader GLSL
-#version 430
-layout(location = 0) flat in uvec2 color_in[3];
-layout(location = 0) out lowp uvec2 frag_out[3];
-void main()
-{
-    for (int i = 0; i < 3; i++)
-        frag_out[i] = color_in[i];
-}
-END
-
-SHADER vertex vert_shader_ref GLSL
-#version 430
-layout(location = 0) in vec2 position_in;
-layout(location = 1) in uvec2 color_in;
-layout(location = 0) flat out uvec2 color_out;
-
-void main()
-{
-	gl_Position = vec4(position_in, 0, 1);
-    color_out = color_in;
-}
-END
-
-SHADER fragment frag_shader_ref GLSL
-#version 430
-layout(location = 0) flat in uvec2 color_in;
-layout(location = 0) out lowp uvec2 frag_out;
-void main()
-{
-    frag_out = color_in;
-}
-END
-
-BUFFER framebuffer0 FORMAT R8G8_UINT
-BUFFER framebuffer1 FORMAT R8G8_UINT
-BUFFER framebuffer2 FORMAT R8G8_UINT
-
-BUFFER ref0 FORMAT R8G8_UINT
-BUFFER ref1 FORMAT R8G8_UINT
-BUFFER ref2 FORMAT R8G8_UINT
-
-BUFFER position DATA_TYPE vec2<float> DATA
--1.0 -1.0
- 1.0 -1.0
- 1.0  1.0
--1.0  1.0
-END
-
-BUFFER color0 DATA_TYPE R8G8_UINT DATA
-255   0
-  0 255
-  0   0
-255 255
-END
-
-BUFFER color1 DATA_TYPE R8G8_UINT DATA
-  0 255
-  0   0
-255 255
-255   0
-END
-
-BUFFER color2 DATA_TYPE R8G8_UINT DATA
-  0   0
-255 255
-255   0
-  0 255
-END
-
-
-PIPELINE graphics pipeline
-  ATTACH vert_shader
-  ATTACH frag_shader
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  VERTEX_DATA color1 LOCATION 2
-  VERTEX_DATA color2 LOCATION 3
-  BIND BUFFER framebuffer0 AS color LOCATION 0
-  BIND BUFFER framebuffer1 AS color LOCATION 1
-  BIND BUFFER framebuffer2 AS color LOCATION 2
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref0
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color0 LOCATION 1
-  BIND BUFFER ref0 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref1
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color1 LOCATION 1
-  BIND BUFFER ref1 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-PIPELINE graphics pipeline_ref2
-  ATTACH vert_shader_ref
-  ATTACH frag_shader_ref
-  VERTEX_DATA position LOCATION 0
-  VERTEX_DATA color2 LOCATION 1
-  BIND BUFFER ref2 AS color LOCATION 0
-  FRAMEBUFFER_SIZE 60 60
-END
-
-CLEAR_COLOR pipeline 0 0 0 0
-CLEAR pipeline
-RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref0 0 0 0 0
-CLEAR pipeline_ref0
-RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref1 0 0 0 0
-CLEAR pipeline_ref1
-RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-CLEAR_COLOR pipeline_ref2 0 0 0 0
-CLEAR pipeline_ref2
-RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-mediump-output-uint.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-mediump-output-uint.amber
index 31ae57b..72590c0 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-mediump-output-uint.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-mediump-output-uint.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) usampler2D result_sampler;
+uniform layout(set=0, binding=1) usampler2D ref_sampler;
+void main()
+{
+    uint result = texture(result_sampler, texcoord_in).x;
+    uint ref = texture(ref_sampler, texcoord_in).x;
+    if (distance(result, ref) > 5)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R8G8_UINT
 BUFFER framebuffer1 FORMAT R8G8_UINT
 BUFFER framebuffer2 FORMAT R8G8_UINT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R8G8_UINT
 BUFFER ref2 FORMAT R8G8_UINT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R8G8_UINT DATA
 255   0
   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-mediump.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-mediump.amber
index 30a46c9..7e2aae0 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-mediump.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/array/r8g8-uint-mediump.amber
@@ -21,7 +21,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     for (int i = 0; i < 3; i++)
         color_out[i] = color_in[i];
 }
@@ -61,6 +61,36 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+    gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) usampler2D result_sampler;
+uniform layout(set=0, binding=1) usampler2D ref_sampler;
+void main()
+{
+    uvec2 result = texture(result_sampler, texcoord_in).xy;
+    uvec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (distance(result, ref) > 5)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R8G8_UINT
 BUFFER framebuffer1 FORMAT R8G8_UINT
 BUFFER framebuffer2 FORMAT R8G8_UINT
@@ -69,6 +99,10 @@
 BUFFER ref1 FORMAT R8G8_UINT
 BUFFER ref2 FORMAT R8G8_UINT
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -76,6 +110,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE R8G8_UINT DATA
 255   0
   0 255
@@ -98,6 +139,8 @@
 END
 
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -138,6 +181,39 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
 CLEAR_COLOR pipeline 0 0 0 0
 CLEAR pipeline
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
@@ -150,6 +226,16 @@
 CLEAR_COLOR pipeline_ref2 0 0 0 0
 CLEAR pipeline_ref2
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+CLEAR_COLOR pipeline_verify0 0 0 0 0
+CLEAR pipeline_verify0
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify1 0 0 0 0
+CLEAR pipeline_verify1
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+CLEAR_COLOR pipeline_verify2 0 0 0 0
+CLEAR pipeline_verify2
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/shuffle/inputs-outputs-mod.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/shuffle/inputs-outputs-mod.amber
index 7a9c6d7..1e19113 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/shuffle/inputs-outputs-mod.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/shuffle/inputs-outputs-mod.amber
@@ -25,7 +25,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     color_out0 = color_in0;
     color_out1 = color_in1;
     color_out2 = color_in2;
@@ -56,7 +56,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     color_out = color_in;
 }
 END
@@ -117,6 +117,70 @@
 }
 END
 
+SHADER vertex vert_shader_verify GLSL
+#version 430
+layout(location = 0) in vec2 position_in;
+layout(location = 1) in vec2 texcoord_in;
+layout(location = 0) out vec2 texcoord_out;
+
+void main()
+{
+	gl_Position = vec4(position_in, 0, 1);
+    texcoord_out = texcoord_in;
+}
+END
+
+SHADER fragment frag_shader_verify_vec4 GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    vec4 result = texture(result_sampler, texcoord_in);
+    vec4 ref = texture(ref_sampler, texcoord_in);
+    if (result != ref)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
+SHADER fragment frag_shader_verify_float GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) sampler2D result_sampler;
+uniform layout(set=0, binding=1) sampler2D ref_sampler;
+void main()
+{
+    float result = texture(result_sampler, texcoord_in).x;
+    float ref = texture(ref_sampler, texcoord_in).x;
+    if (distance(result, ref) > 0.1)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
+SHADER fragment frag_shader_verify_uvec2 GLSL
+#version 430
+layout(location = 0) in vec2 texcoord_in;
+layout(location = 0) out vec4 frag_out;
+uniform layout(set=0, binding=0) usampler2D result_sampler;
+uniform layout(set=0, binding=1) usampler2D ref_sampler;
+void main()
+{
+    uvec2 result = texture(result_sampler, texcoord_in).xy;
+    uvec2 ref = texture(ref_sampler, texcoord_in).xy;
+    if (distance(result, ref) > 5)
+        frag_out = vec4(1, 0, 0, 1);
+    else
+        frag_out = vec4(0, 1, 0, 1);
+}
+END
+
 BUFFER framebuffer0 FORMAT R16_SFLOAT
 BUFFER framebuffer1 FORMAT R8G8_UINT
 BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
@@ -125,6 +189,10 @@
 BUFFER ref1 FORMAT R8G8_UINT
 BUFFER ref2 FORMAT B8G8R8A8_UNORM
 
+BUFFER result0 FORMAT B8G8R8A8_UNORM
+BUFFER result1 FORMAT B8G8R8A8_UNORM
+BUFFER result2 FORMAT B8G8R8A8_UNORM
+
 BUFFER position DATA_TYPE vec2<float> DATA
 -1.0 -1.0
  1.0 -1.0
@@ -132,6 +200,13 @@
 -1.0  1.0
 END
 
+BUFFER texcoord DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
 BUFFER color0 DATA_TYPE B8G8R8A8_UNORM DATA
 255   0   0 255
   0 255   0 255
@@ -153,6 +228,8 @@
 0.2
 END
 
+SAMPLER sampler
+
 PIPELINE graphics pipeline
   ATTACH vert_shader
   ATTACH frag_shader
@@ -193,10 +270,48 @@
   FRAMEBUFFER_SIZE 60 60
 END
 
+PIPELINE graphics pipeline_verify0
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify_float
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result0 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify1
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify_uvec2
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result1 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_verify2
+  ATTACH vert_shader_verify
+  ATTACH frag_shader_verify_vec4
+  VERTEX_DATA position LOCATION 0
+  VERTEX_DATA texcoord LOCATION 1
+  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
+  BIND BUFFER result2 AS color LOCATION 0
+  FRAMEBUFFER_SIZE 60 60
+END
+
+
 RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
 RUN pipeline_ref0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
 RUN pipeline_ref1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
 RUN pipeline_ref2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
-EXPECT framebuffer0 EQ_BUFFER ref0
-EXPECT framebuffer1 EQ_BUFFER ref1
-EXPECT framebuffer2 EQ_BUFFER ref2
+RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
+EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
diff --git a/external/vulkancts/data/vulkan/amber/draw/output_location/shuffle/inputs-outputs.amber b/external/vulkancts/data/vulkan/amber/draw/output_location/shuffle/inputs-outputs.amber
index b9582f5..d69732b 100644
--- a/external/vulkancts/data/vulkan/amber/draw/output_location/shuffle/inputs-outputs.amber
+++ b/external/vulkancts/data/vulkan/amber/draw/output_location/shuffle/inputs-outputs.amber
@@ -23,7 +23,7 @@
 
 void main()
 {
-	gl_Position = vec4(position_in, 0, 1);
+    gl_Position = vec4(position_in, 0, 1);
     color_out0 = color_in0;
     color_out1 = color_in1;
 }
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawOutputLocationTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawOutputLocationTests.cpp
index 30c1cd4..577193a 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawOutputLocationTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawOutputLocationTests.cpp
@@ -51,43 +51,29 @@
 			"b10g11r11-ufloat-pack32-highp",
 			"b10g11r11-ufloat-pack32-highp-output-float",
 			"b10g11r11-ufloat-pack32-highp-output-vec2",
-			"b10g11r11-ufloat-pack32-lowp",
-			"b10g11r11-ufloat-pack32-lowp-output-float",
-			"b10g11r11-ufloat-pack32-lowp-output-vec2",
 			"b10g11r11-ufloat-pack32-mediump",
 			"b10g11r11-ufloat-pack32-mediump-output-float",
 			"b10g11r11-ufloat-pack32-mediump-output-vec2",
 			"b8g8r8a8-unorm-highp",
 			"b8g8r8a8-unorm-highp-output-vec2",
 			"b8g8r8a8-unorm-highp-output-vec3",
-			"b8g8r8a8-unorm-lowp",
-			"b8g8r8a8-unorm-lowp-output-vec2",
-			"b8g8r8a8-unorm-lowp-output-vec3",
 			"b8g8r8a8-unorm-mediump",
 			"b8g8r8a8-unorm-mediump-output-vec2",
 			"b8g8r8a8-unorm-mediump-output-vec3",
 			"r16g16-sfloat-highp",
 			"r16g16-sfloat-highp-output-float",
-			"r16g16-sfloat-lowp",
-			"r16g16-sfloat-lowp-output-float",
 			"r16g16-sfloat-mediump",
 			"r16g16-sfloat-mediump-output-float",
 			"r32g32b32a32-sfloat-highp",
 			"r32g32b32a32-sfloat-highp-output-vec2",
 			"r32g32b32a32-sfloat-highp-output-vec3",
-			"r32g32b32a32-sfloat-lowp",
-			"r32g32b32a32-sfloat-lowp-output-vec2",
-			"r32g32b32a32-sfloat-lowp-output-vec3",
 			"r32g32b32a32-sfloat-mediump",
 			"r32g32b32a32-sfloat-mediump-output-vec2",
 			"r32g32b32a32-sfloat-mediump-output-vec3",
 			"r32-sfloat-highp",
-			"r32-sfloat-lowp",
 			"r32-sfloat-mediump",
 			"r8g8-uint-highp",
 			"r8g8-uint-highp-output-uint",
-			"r8g8-uint-lowp",
-			"r8g8-uint-lowp-output-uint",
 			"r8g8-uint-mediump",
 			"r8g8-uint-mediump-output-uint"
 		};
diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt
index 3c766ac..aaec942 100644
--- a/external/vulkancts/mustpass/master/vk-default.txt
+++ b/external/vulkancts/mustpass/master/vk-default.txt
Binary files differ