#!amber

# Copyright 2020 Valve Corporation.
# Copyright 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.

SHADER vertex vtx_passthrough PASSTHROUGH

SHADER fragment frag_green GLSL
#version 450
layout(location=0) out vec4 out_color;
void main() {
  out_color = vec4(0.0, 1.0, 0.0, 1.0);
}
END

SHADER vertex vtx_shader GLSL
#version 450

layout(location = 0) in vec4 position;
layout(location = 0) out vec2 textureCoordinates;

void main() {
  gl_Position = position;
  textureCoordinates = vec2(0.0, 0.0);
}
END

SHADER fragment frag_shader SPIRV-ASM
                           OpCapability Shader
                           OpMemoryModel Logical GLSL450
                           OpEntryPoint Fragment %main "main" %fragColor %vtxTexCoords
                           OpExecutionMode %main OriginUpperLeft
                           OpDecorate %fragColor Location 0 ; Output
                           OpDecorate %vtxTexCoords Location 0 ; Input
                           OpDecorate %sampler_ptr DescriptorSet 0
                           OpDecorate %sampler_ptr Binding 0

                           ; Basic types.
                   %void = OpTypeVoid
            %void_func_t = OpTypeFunction %void
                  %float = OpTypeFloat 32
                %v2float = OpTypeVector %float 2
                %v4float = OpTypeVector %float 4
               %image_2d = OpTypeImage %float 2D 0 0 0 1 Unknown
            %sampled_img = OpTypeSampledImage %image_2d
        %sampling_func_t = OpTypeFunction %v4float %sampled_img %v2float

                           ; Pointer types.
%sampled_img_uniform_ptr = OpTypePointer UniformConstant %sampled_img
        %v4float_out_ptr = OpTypePointer Output %v4float
      %v2float_input_ptr = OpTypePointer Input %v2float

                           ; In/Out variables.
              %fragColor = OpVariable %v4float_out_ptr Output
            %sampler_ptr = OpVariable %sampled_img_uniform_ptr UniformConstant
           %vtxTexCoords = OpVariable %v2float_input_ptr Input

                           ; Main function.
                   %main = OpFunction %void None %void_func_t
             %main_label = OpLabel
             %tex_coords = OpLoad %v2float %vtxTexCoords
            %sampler_arg = OpLoad %sampled_img %sampler_ptr
         %frag_color_val = OpFunctionCall %v4float %sampling_func %sampler_arg %tex_coords
                           OpStore %fragColor %frag_color_val
                           OpReturn
                           OpFunctionEnd

                           ; Auxiliar texture sampling function, receiving a sampled image as its argument.
          %sampling_func = OpFunction %v4float None %sampling_func_t
                %sampler = OpFunctionParameter %sampled_img
                 %coords = OpFunctionParameter %v2float
    %sampling_func_label = OpLabel
                 %retval = OpImageSampleImplicitLod %v4float %sampler %coords
                           OpReturnValue %retval
                           OpFunctionEnd
END

# Full-screen quad.
BUFFER position_buf DATA_TYPE vec4<float> DATA
-1 -1    0 1
 1 -1    0 1
-1  1    0 1
-1  1    0 1
 1 -1    0 1
 1  1    0 1
END

BUFFER framebuffer FORMAT B8G8R8A8_UNORM
BUFFER texture FORMAT R8G8B8A8_UNORM
SAMPLER sampler

PIPELINE graphics texgen_pipeline
  ATTACH vtx_passthrough
  ATTACH frag_green

  FRAMEBUFFER_SIZE 1 1
  BIND BUFFER texture AS color LOCATION 0
END

PIPELINE graphics main_pipeline
  ATTACH vtx_shader
  ATTACH frag_shader

  VERTEX_DATA position_buf LOCATION 0
  BIND BUFFER texture AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0

  FRAMEBUFFER_SIZE 64 64
  BIND BUFFER framebuffer AS color LOCATION 0
END

CLEAR texgen_pipeline
RUN texgen_pipeline DRAW_RECT POS 0 0 SIZE 1 1
EXPECT texture IDX 0 0 SIZE 1 1 EQ_RGBA 0 255 0 255

CLEAR_COLOR main_pipeline 0 0 0 255
CLEAR main_pipeline
RUN main_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 6
EXPECT framebuffer IDX 0 0 SIZE 64 64 EQ_RGBA 0 255 0 255
