#!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

SHADER vertex vert_shader_verify GLSL
#version 430
layout(location = 0) in vec2 position_in;
layout(location = 1) in vec2 texcoord_in;
layout(location = 0) out vec2 texcoord_out;

void main()
{
    gl_Position = vec4(position_in, 0, 1);
    texcoord_out = texcoord_in;
}
END

SHADER fragment frag_shader_verify GLSL
#version 430
layout(location = 0) in vec2 texcoord_in;
layout(location = 0) out vec4 frag_out;
uniform layout(set=0, binding=0) usampler2D result_sampler;
uniform layout(set=0, binding=1) usampler2D ref_sampler;
void main()
{
    uint result = texture(result_sampler, texcoord_in).x;
    uint ref = texture(ref_sampler, texcoord_in).x;
    if (result != ref)
        frag_out = vec4(1, 0, 0, 1);
    else
        frag_out = vec4(0, 1, 0, 1);
}
END

BUFFER framebuffer0 FORMAT R8G8_UINT
BUFFER framebuffer1 FORMAT R8G8_UINT
BUFFER framebuffer2 FORMAT R8G8_UINT

BUFFER ref0 FORMAT R8G8_UINT
BUFFER ref1 FORMAT R8G8_UINT
BUFFER ref2 FORMAT R8G8_UINT

BUFFER result0 FORMAT B8G8R8A8_UNORM
BUFFER result1 FORMAT B8G8R8A8_UNORM
BUFFER result2 FORMAT B8G8R8A8_UNORM

BUFFER position DATA_TYPE vec2<float> DATA
-1.0 -1.0
 1.0 -1.0
 1.0  1.0
-1.0  1.0
END

BUFFER texcoord DATA_TYPE vec2<float> DATA
0.0 0.0
1.0 0.0
1.0 1.0
0.0 1.0
END

BUFFER color0 DATA_TYPE R8G8_UINT DATA
255   0
  0 255
  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


SAMPLER sampler

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

PIPELINE graphics pipeline_verify0
  ATTACH vert_shader_verify
  ATTACH frag_shader_verify
  VERTEX_DATA position LOCATION 0
  VERTEX_DATA texcoord LOCATION 1
  BIND BUFFER framebuffer0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
  BIND BUFFER ref0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
  BIND BUFFER result0 AS color LOCATION 0
  FRAMEBUFFER_SIZE 60 60
END

PIPELINE graphics pipeline_verify1
  ATTACH vert_shader_verify
  ATTACH frag_shader_verify
  VERTEX_DATA position LOCATION 0
  VERTEX_DATA texcoord LOCATION 1
  BIND BUFFER framebuffer1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
  BIND BUFFER ref1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
  BIND BUFFER result1 AS color LOCATION 0
  FRAMEBUFFER_SIZE 60 60
END

PIPELINE graphics pipeline_verify2
  ATTACH vert_shader_verify
  ATTACH frag_shader_verify
  VERTEX_DATA position LOCATION 0
  VERTEX_DATA texcoord LOCATION 1
  BIND BUFFER framebuffer2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
  BIND BUFFER ref2 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1
  BIND BUFFER result2 AS color LOCATION 0
  FRAMEBUFFER_SIZE 60 60
END

CLEAR_COLOR pipeline 0 0 0 0
CLEAR pipeline
RUN pipeline DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
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
CLEAR_COLOR pipeline_verify0 0 0 0 0
CLEAR pipeline_verify0
RUN pipeline_verify0 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
CLEAR_COLOR pipeline_verify1 0 0 0 0
CLEAR pipeline_verify1
RUN pipeline_verify1 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
CLEAR_COLOR pipeline_verify2 0 0 0 0
CLEAR pipeline_verify2
RUN pipeline_verify2 DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4

EXPECT result0 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
EXPECT result1 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
EXPECT result2 IDX 0 0 SIZE 60 60 EQ_RGBA 0 255 0 255
