#!amber
# Copyright 2021 The Amber Authors.
#
# 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
#
#     https://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.

DEVICE_FEATURE tessellationShader

SHADER vertex vert GLSL
#version 450

layout (location = 0) in vec3 inPosition;

void main(void)
{
    gl_Position = vec4(inPosition, 1.0);
}
END

SHADER tessellation_control tesc GLSL
#version 450

layout (vertices = 4) out;

void main(void)
{
    gl_TessLevelOuter[0] = 6.0;
    gl_TessLevelOuter[1] = 2.0;

    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
END

SHADER tessellation_evaluation tese GLSL
#version 450

layout (isolines, equal_spacing, cw) in;

void main(void)
{
    vec4 p1 = mix(gl_in[0].gl_Position,
            gl_in[1].gl_Position,
            gl_TessCoord.x);

    vec4 p2 = mix(gl_in[2].gl_Position,
            gl_in[3].gl_Position,
            gl_TessCoord.x);

    gl_Position = mix(p1, p2, gl_TessCoord.y);
}
END

SHADER fragment frag GLSL
#version 450

layout (location = 0) out vec4 outColor;

void main(void)
{
    outColor = vec4(1, 0, 0, 1);
}
END

SHADER compute comp_shader GLSL
#version 450
layout(local_size_x=10,local_size_y=10) in;
uniform layout(set=0, binding=0, rgba8) image2D resultImage;

layout(set = 0, binding = 1) buffer block0
{
    int counter;
};

void main()
{
    ivec2 uv = ivec2(gl_GlobalInvocationID.xy);
    vec4 color = imageLoad(resultImage, uv);
    if(color.r > 0.0) atomicAdd(counter, 1);
}
END

BUFFER vertexPosition DATA_TYPE vec3<float> DATA
-1.0 -1.0  0.0
 1.0 -1.0  0.0
-1.0  1.0  0.0
 1.0  1.0  0.0
END

BUFFER counter DATA_TYPE int32 DATA 0 END

BUFFER framebuffer FORMAT B8G8R8A8_UNORM

PIPELINE graphics pipeline
  ATTACH vert
  ATTACH tesc
  ATTACH tese
  ATTACH frag

  PATCH_CONTROL_POINTS 4

  FRAMEBUFFER_SIZE 100 100
  VERTEX_DATA vertexPosition LOCATION 0
  BIND BUFFER framebuffer AS color LOCATION 0
END

CLEAR_COLOR pipeline 0 0 0 255
CLEAR pipeline

RUN pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 4

PIPELINE compute verify_pipeline
  ATTACH comp_shader
  BIND BUFFER framebuffer AS storage_image DESCRIPTOR_SET 0 BINDING 0
  BIND BUFFER counter AS storage DESCRIPTOR_SET 0 BINDING 1
  FRAMEBUFFER_SIZE 100 100
END

# Count the number of red pixels as the line position might differ between implementations.
RUN verify_pipeline 10 10 1

EXPECT counter IDX 0 TOLERANCE 50 EQ 500
