external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp \
external/vulkancts/modules/vulkan/draw/vktDrawMultipleInterpolationTests.cpp \
external/vulkancts/modules/vulkan/draw/vktDrawNegativeViewportHeightTests.cpp \
+ external/vulkancts/modules/vulkan/draw/vktDrawOutputLocationTests.cpp \
external/vulkancts/modules/vulkan/draw/vktDrawScissorTests.cpp \
external/vulkancts/modules/vulkan/draw/vktDrawShaderDrawParametersTests.cpp \
external/vulkancts/modules/vulkan/draw/vktDrawShaderLayerTests.cpp \
dEQP-VK.draw.explicit_vertex_parameter.noperspective_sample_samples_64
dEQP-VK.draw.explicit_vertex_parameter.smooth_centroid_samples_64
dEQP-VK.draw.explicit_vertex_parameter.noperspective_centroid_samples_64
+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
+dEQP-VK.draw.output_location.shuffle.inputs-outputs-mod
dEQP-VK.compute.basic.concurrent_compute
dEQP-VK.compute.cooperative_matrix.length.float32_float32.buffer.rowmajor
dEQP-VK.compute.cooperative_matrix.length.float32_float32.buffer.colmajor
dEQP-VK.draw.explicit_vertex_parameter.noperspective_sample_samples_64
dEQP-VK.draw.explicit_vertex_parameter.smooth_centroid_samples_64
dEQP-VK.draw.explicit_vertex_parameter.noperspective_centroid_samples_64
+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
+dEQP-VK.draw.output_location.shuffle.inputs-outputs-mod
dEQP-VK.compute.basic.empty_shader
dEQP-VK.compute.basic.concurrent_compute
dEQP-VK.compute.basic.ubo_to_ssbo_single_invocation
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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
--- /dev/null
+#!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
--- /dev/null
+#!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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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
--- /dev/null
+#!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
--- /dev/null
+#!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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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
--- /dev/null
+#!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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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
--- /dev/null
+#!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
--- /dev/null
+#!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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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 highp 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 highp 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
--- /dev/null
+#!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
--- /dev/null
+#!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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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 mediump 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 mediump 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
--- /dev/null
+#!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_in0;
+layout(location = 2) in uvec2 color_in1;
+layout(location = 3) in float color_in2;
+layout(location = 0) smooth out vec4 color_out0;
+layout(location = 1) flat out uvec2 color_out1;
+layout(location = 2) smooth out float color_out2;
+
+void main()
+{
+ gl_Position = vec4(position_in, 0, 1);
+ color_out0 = color_in0;
+ color_out1 = color_in1;
+ color_out2 = color_in2;
+}
+END
+
+SHADER fragment frag_shader GLSL
+#version 430
+layout(location = 0) smooth in vec4 color_in0;
+layout(location = 1) flat in uvec2 color_in1;
+layout(location = 2) smooth in float color_in2;
+layout(location = 0) out mediump float frag_out0;
+layout(location = 1) out lowp uvec2 frag_out1;
+layout(location = 2) out highp vec4 frag_out2;
+void main()
+{
+ frag_out0 = color_in2;
+ frag_out1 = color_in1;
+ frag_out2 = color_in0;
+}
+END
+
+SHADER vertex vert_shader_ref0 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_ref0 GLSL
+#version 430
+layout(location = 0) smooth in vec3 color_in;
+layout(location = 0) out mediump vec3 frag_out;
+void main()
+{
+ frag_out = color_in;
+}
+END
+
+SHADER vertex vert_shader_ref1 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_ref1 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
+
+SHADER vertex vert_shader_ref2 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_ref2 GLSL
+#version 430
+layout(location = 0) smooth in vec4 color_in;
+layout(location = 0) out highp vec4 frag_out;
+void main()
+{
+ frag_out = color_in;
+}
+END
+
+BUFFER framebuffer0 FORMAT R16_SFLOAT
+BUFFER framebuffer1 FORMAT R8G8_UINT
+BUFFER framebuffer2 FORMAT B8G8R8A8_UNORM
+
+BUFFER ref0 FORMAT R16_SFLOAT
+BUFFER ref1 FORMAT R8G8_UINT
+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 R8G8_UINT DATA
+ 0 255
+ 0 0
+255 255
+255 0
+END
+
+BUFFER color2 DATA_TYPE R16_SFLOAT DATA
+0.5
+1.0
+0.3
+0.2
+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_ref0
+ ATTACH frag_shader_ref0
+ VERTEX_DATA position LOCATION 0
+ VERTEX_DATA color2 LOCATION 1
+ BIND BUFFER ref0 AS color LOCATION 0
+ FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_ref1
+ ATTACH vert_shader_ref1
+ ATTACH frag_shader_ref1
+ 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_ref2
+ ATTACH frag_shader_ref2
+ VERTEX_DATA position LOCATION 0
+ VERTEX_DATA color0 LOCATION 1
+ BIND BUFFER ref2 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
--- /dev/null
+#!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_in0;
+layout(location = 2) in vec4 color_in1;
+layout(location = 0) out vec4 color_out0;
+layout(location = 1) out vec4 color_out1;
+
+void main()
+{
+ gl_Position = vec4(position_in, 0, 1);
+ color_out0 = color_in0;
+ color_out1 = color_in1;
+}
+END
+
+SHADER fragment frag_shader GLSL
+#version 430
+layout(location = 0) in vec4 color_in0;
+layout(location = 1) in vec4 color_in1;
+layout(location = 0) out vec4 frag_out0;
+layout(location = 1) out vec4 frag_out1;
+void main()
+{
+ if (((int(gl_FragCoord.x) / 5) % 2) == ((int(gl_FragCoord.y) / 5) % 2))
+ {
+ frag_out0 = color_in0;
+ frag_out1 = color_in1;
+ }
+ else
+ {
+ frag_out0 = color_in1;
+ frag_out1 = color_in0;
+ }
+}
+END
+
+SHADER vertex vert_shader_ref PASSTHROUGH
+
+SHADER fragment frag_shader_ref0 GLSL
+#version 430
+layout(location = 0) out vec4 frag_out;
+void main()
+{
+ if (((int(gl_FragCoord.x) / 5) % 2) == ((int(gl_FragCoord.y) / 5) % 2))
+ frag_out = vec4(1, 0, 0, 1);
+ else
+ frag_out = vec4(0, 1, 0, 1);
+}
+END
+
+SHADER fragment frag_shader_ref1 GLSL
+#version 430
+layout(location = 0) out vec4 frag_out;
+void main()
+{
+ if (((int(gl_FragCoord.x) / 5) % 2) == ((int(gl_FragCoord.y) / 5) % 2))
+ frag_out = vec4(0, 1, 0, 1);
+ else
+ frag_out = vec4(1, 0, 0, 1);
+}
+END
+
+
+BUFFER framebuffer0 FORMAT B8G8R8A8_UNORM
+BUFFER framebuffer1 FORMAT B8G8R8A8_UNORM
+
+BUFFER ref0 FORMAT B8G8R8A8_UNORM
+BUFFER ref1 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 R8G8B8A8_UNORM DATA
+255 0 0 255
+255 0 0 255
+255 0 0 255
+255 0 0 255
+END
+
+BUFFER color1 DATA_TYPE R8G8B8A8_UNORM DATA
+ 0 255 0 255
+ 0 255 0 255
+ 0 255 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
+ BIND BUFFER framebuffer0 AS color LOCATION 0
+ BIND BUFFER framebuffer1 AS color LOCATION 1
+ FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_ref0
+ ATTACH vert_shader_ref
+ ATTACH frag_shader_ref0
+ BIND BUFFER ref0 AS color LOCATION 0
+ FRAMEBUFFER_SIZE 60 60
+END
+
+PIPELINE graphics pipeline_ref1
+ ATTACH vert_shader_ref
+ ATTACH frag_shader_ref1
+ BIND BUFFER ref1 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_RECT POS 0 0 SIZE 60 60
+RUN pipeline_ref1 DRAW_RECT POS 0 0 SIZE 60 60
+EXPECT framebuffer0 EQ_BUFFER ref0
+EXPECT framebuffer1 EQ_BUFFER ref1
vktDrawDiscardRectanglesTests.cpp
vktDrawExplicitVertexParameterTests.cpp
vktDrawExplicitVertexParameterTests.hpp
+ vktDrawOutputLocationTests.cpp
+ vktDrawOutputLocationTests.hpp
)
set(DEQP_VK_DRAW_LIBS
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 Google Inc.
+ * Copyright (c) 2020 The Khronos Group Inc.
+ *
+ * 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.
+ *
+ *//*!
+ * \file
+ * \brief Fragment output location tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktDrawOutputLocationTests.hpp"
+#include "vktTestGroupUtil.hpp"
+#include "amber/vktAmberTestCase.hpp"
+
+#include "tcuTestCase.hpp"
+
+#include <string>
+
+namespace vkt
+{
+namespace Draw
+{
+namespace
+{
+
+void createTests (tcu::TestCaseGroup* testGroup)
+{
+ tcu::TestContext& testCtx = testGroup->getTestContext();
+
+ // .array
+ {
+ tcu::TestCaseGroup* const array = new tcu::TestCaseGroup(testCtx, "array", "Test output location array");
+ static const char dataDir[] = "draw/output_location/array";
+
+ static const std::string cases[] =
+ {
+ "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"
+ };
+
+ testGroup->addChild(array);
+
+ for (int i = 0; i < DE_LENGTH_OF_ARRAY(cases); ++i)
+ {
+ const std::string fileName = cases[i] + ".amber";
+ cts_amber::AmberTestCase* testCase = cts_amber::createAmberTestCase(testCtx, cases[i].c_str(), "", dataDir, fileName);
+
+ array->addChild(testCase);
+ }
+ }
+
+ // .shuffle
+ {
+ tcu::TestCaseGroup* const shuffle = new tcu::TestCaseGroup(testCtx, "shuffle", "Test output location shuffling");
+ static const char dataDir[] = "draw/output_location/shuffle";
+
+ static const std::string cases[] =
+ {
+ "inputs-outputs",
+ "inputs-outputs-mod"
+ };
+
+ testGroup->addChild(shuffle);
+
+ for (int i = 0; i < DE_LENGTH_OF_ARRAY(cases); ++i)
+ {
+ const std::string fileName = cases[i] + ".amber";
+ cts_amber::AmberTestCase* testCase = cts_amber::createAmberTestCase(testCtx, cases[i].c_str(), "", dataDir, fileName);
+
+ shuffle->addChild(testCase);
+ }
+ }
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createOutputLocationTests (tcu::TestContext& testCtx)
+{
+ return createTestGroup(testCtx, "output_location", "Fragment output location tests", createTests);
+}
+
+} // Draw
+} // vkt
--- /dev/null
+#ifndef _VKTDRAWOUTPUTLOCATIONTESTS_HPP
+#define _VKTDRAWOUTPUTLOCATIONTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 Google Inc.
+ * Copyright (c) 2020 The Khronos Group Inc.
+ *
+ * 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.
+ *
+ *//*!
+ * \file
+ * \brief Fragment output location tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vkDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace Draw
+{
+
+tcu::TestCaseGroup* createOutputLocationTests (tcu::TestContext& testCtx);
+
+} // Draw
+} // vkt
+
+#endif // _VKTDRAWOUTPUTLOCATIONTESTS_HPP
#include "vktDrawMultipleInterpolationTests.hpp"
#include "vktDrawDiscardRectanglesTests.hpp"
#include "vktDrawExplicitVertexParameterTests.hpp"
+#include "vktDrawOutputLocationTests.hpp"
namespace vkt
{
group->addChild(createMultipleInterpolationTests (testCtx));
group->addChild(createDiscardRectanglesTests (testCtx));
group->addChild(createExplicitVertexParameterTests (testCtx));
+ group->addChild(createOutputLocationTests (testCtx));
}
} // anonymous
dEQP-VK.draw.explicit_vertex_parameter.noperspective_sample_samples_64
dEQP-VK.draw.explicit_vertex_parameter.smooth_centroid_samples_64
dEQP-VK.draw.explicit_vertex_parameter.noperspective_centroid_samples_64
+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
+dEQP-VK.draw.output_location.shuffle.inputs-outputs-mod
dEQP-VK.compute.basic.empty_shader
dEQP-VK.compute.basic.concurrent_compute
dEQP-VK.compute.basic.ubo_to_ssbo_single_invocation