#!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_shader SPIRV-ASM
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 8
; Bound: 30
; Schema: 0
;
; Originally created from code like this one:
;
; #version 450
; layout(location=0) in vec4 position;
; void main() { gl_Position = position; }
;
                            OpCapability Shader
                       %1 = OpExtInstImport "GLSL.std.450"
                            OpMemoryModel Logical GLSL450
                            OpEntryPoint Vertex %main "main" %_ %position
                            OpSource GLSL 450
                            OpName %main "main"
                            OpName %gl_PerVertex "gl_PerVertex"
                            OpMemberName %gl_PerVertex 0 "gl_Position"
                            OpMemberName %gl_PerVertex 1 "gl_PointSize"
                            OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
                            OpMemberName %gl_PerVertex 3 "gl_CullDistance"
                            OpName %_ ""
                            OpName %position "position"
                            OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
                            OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
                            OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
                            OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
                            OpDecorate %gl_PerVertex Block
                            OpDecorate %position Location 0
                    %void = OpTypeVoid
                       %3 = OpTypeFunction %void
                     %int = OpTypeInt 32 1
                   %int_1 = OpConstant %int 1
                   %float = OpTypeFloat 32
                 %v4float = OpTypeVector %float 4
                    %uint = OpTypeInt 32 0
                  %uint_1 = OpConstant %uint 1
       %_arr_float_uint_1 = OpTypeArray %float %uint_1
            %gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
                       %_ = OpVariable %_ptr_Output_gl_PerVertex Output
                   %int_0 = OpConstant %int 0
      %_ptr_Input_v4float = OpTypePointer Input %v4float
                %position = OpVariable %_ptr_Input_v4float Input
     %_ptr_Output_v4float = OpTypePointer Output %v4float
                    %main = OpFunction %void None %3
;
; The rest of code below has been manually tuned.
; The assignment to gl_Position is in the OpLoad, OpAccessChain and OpStore sequence.
; It's wrapped inside a loop statement roughly equivalent to this:
;
; for (;;) {
;     switch (1) {
;         default:
;            gl_Position = position;
;            goto end;
;     }
; }
; end:
; return;
;
; Which means the code jumps directly from the end of the default block to the
; loop exit, something that cannot be directly done in GLSL because it has no
; goto nor any other equivalent instruction to directly exit the loop.
;
; The switch's merge block is unreachable and marked with OpUnreachable.
; According to VK-GL-CTS issue #952, at least one driver goes into an infinite
; loop when doing so.
;
              %main_start = OpLabel
                            OpBranch %loop_start
              %loop_start = OpLabel
                            OpLoopMerge %loop_exit %loop_end None
                            OpBranch %select_start
            %select_start = OpLabel
                            OpSelectionMerge %select_merge None
                            OpSwitch %int_1 %switch_default
          %switch_default = OpLabel
                      %25 = OpLoad %v4float %position
                      %27 = OpAccessChain %_ptr_Output_v4float %_ %int_0
                            OpStore %27 %25
                            OpBranch %loop_exit
            %select_merge = OpLabel
                            OpUnreachable
                %loop_end = OpLabel
                            OpBranch %loop_start
               %loop_exit = OpLabel
                            OpReturn
                            OpFunctionEnd

END

SHADER fragment frag_shader GLSL
#version 450

layout(location = 0) out vec4 color_out;

void main() {
	// Red color.
	color_out = vec4(1.0, 0.0, 0.0, 1.0);
}
END

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

BUFFER framebuffer FORMAT B8G8R8A8_UNORM

PIPELINE graphics pipeline
  ATTACH vtx_shader
  ATTACH frag_shader

  VERTEX_DATA position_buf LOCATION 0

  FRAMEBUFFER_SIZE 64 64
  BIND BUFFER framebuffer AS color LOCATION 0
END

CLEAR pipeline

RUN pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 6
EXPECT framebuffer IDX 0 0 SIZE 64 64 EQ_RGBA 255 0 0 255
