{ "switch-if-discard.amber", "switch-if-discard", "A fragment shader with a switch, if, and discard" },
{ "switch-with-empty-if-false.amber", "switch-with-empty-if-false", "A fragment shader with always false if in switch statement" },
{ "swizzle-struct-init-min.amber", "swizzle-struct-init-min", "A fragment shader that uses vector swizzles, struct initializers, and min" },
+{ "transpose-rectangular-matrix.amber", "transpose-rectangular-matrix", "Fragment shader that uses 'transpose'" },
{ "two-for-loops-with-barrier-function.amber", "two-for-loops-with-barrier-function", "A compute shader with two barrier functions" },
{ "two-loops-matrix.amber", "two-loops-matrix", "A fragment shader with two loops and some matrices" },
{ "two-loops-set-struct.amber", "two-loops-set-struct", "A fragment shader with two loops that write to a struct" },
--- /dev/null
+#!amber
+
+# Copyright 2019 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.
+
+
+# A test for a bug found by GraphicsFuzz.
+
+# Short description: Fragment shader that uses 'transpose'
+
+# The test passes because 'f' is invoked with a vector whose components are less than or equal to 1.0, so that it returns vec3(1.0, 0.0, 0.0), meaning that the output colour red is written
+
+# Optimized using spirv-opt with the following arguments:
+# '-O'
+# spirv-opt commit hash: 6b072126595dd8c2448eb1fda616251c5e6d7079
+
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# precision highp float;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# vec3 f(vec2 pos)
+# {
+# if(pos.y > 1.0)
+# {
+# vec3 v;
+# return v;
+# }
+# return vec3(1.0, 0.0, 0.0);
+# }
+# void main()
+# {
+# _GLF_color = vec4(f(vec2(transpose((gl_FragCoord.y < 1.0) ? mat4x3(1.0) : transpose(mat3x4(1.0))))), 1.0);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 99
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %34 %36
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %34 "_GLF_color"
+ OpName %36 "gl_FragCoord"
+ OpDecorate %34 Location 0
+ OpDecorate %36 BuiltIn FragCoord
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %9 = OpTypeVector %6 3
+ %14 = OpTypeInt 32 0
+ %15 = OpConstant %14 1
+ %19 = OpConstant %6 1
+ %20 = OpTypeBool
+ %28 = OpConstant %6 0
+ %29 = OpConstantComposite %9 %19 %28 %28
+ %32 = OpTypeVector %6 4
+ %33 = OpTypePointer Output %32
+ %34 = OpVariable %33 Output
+ %35 = OpTypePointer Input %32
+ %36 = OpVariable %35 Input
+ %37 = OpTypePointer Input %6
+ %41 = OpTypeMatrix %9 4
+ %46 = OpConstantComposite %9 %28 %19 %28
+ %47 = OpConstantComposite %9 %28 %28 %19
+ %48 = OpConstantComposite %9 %28 %28 %28
+ %49 = OpConstantComposite %41 %29 %46 %47 %48
+ %51 = OpTypeMatrix %32 3
+ %52 = OpConstantComposite %32 %19 %28 %28 %28
+ %53 = OpConstantComposite %32 %28 %19 %28 %28
+ %54 = OpConstantComposite %32 %28 %28 %19 %28
+ %55 = OpConstantComposite %51 %52 %53 %54
+ %97 = OpUndef %9
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %38 = OpAccessChain %37 %36 %15
+ %39 = OpLoad %6 %38
+ %40 = OpFOrdLessThan %20 %39 %19
+ OpSelectionMerge %45 None
+ OpBranchConditional %40 %44 %50
+ %44 = OpLabel
+ OpBranch %45
+ %50 = OpLabel
+ %56 = OpTranspose %41 %55
+ OpBranch %45
+ %45 = OpLabel
+ %94 = OpPhi %41 %49 %44 %56 %50
+ %58 = OpTranspose %51 %94
+ %60 = OpCompositeExtract %6 %58 0 1
+ OpBranch %82
+ %82 = OpLabel
+ OpLoopMerge %83 %84 None
+ OpBranch %85
+ %85 = OpLabel
+ %88 = OpFOrdGreaterThan %20 %60 %19
+ OpSelectionMerge %89 None
+ OpBranchConditional %88 %90 %89
+ %90 = OpLabel
+ OpBranch %83
+ %89 = OpLabel
+ OpBranch %83
+ %84 = OpLabel
+ OpBranch %82
+ %83 = OpLabel
+ %98 = OpPhi %9 %97 %90 %29 %89
+ %64 = OpCompositeExtract %6 %98 0
+ %65 = OpCompositeExtract %6 %98 1
+ %66 = OpCompositeExtract %6 %98 2
+ %67 = OpCompositeConstruct %32 %64 %65 %66 %19
+ OpStore %34 %67
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255