3 # Copyright 2020 Google LLC
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
18 # A test for a coverage-gap found by GraphicsFuzz.
20 # Short description: A fragment shader that covers a specific vector DCE path.
22 # The test passes because shader always writes red.
24 SHADER vertex variant_vertex_shader PASSTHROUGH
26 # variant_fragment_shader is derived from the following GLSL:
28 # precision highp float;
29 # precision highp int;
31 # layout(location = 0) out vec4 _GLF_color;
32 # layout(set = 0, binding = 0) uniform buf0
41 # if (zero == 1) // Always false.
44 # vec2 b = a.y + vec2(2, 3);
46 # if (b == vec2(3, 4)) // Always true.
47 # _GLF_color = vec4(1, 0, 0, 1);
49 # _GLF_color = vec4(0);
51 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
54 ; Generator: Khronos Glslang Reference Front End; 8
58 %1 = OpExtInstImport "GLSL.std.450"
59 OpMemoryModel Logical GLSL450
60 OpEntryPoint Fragment %4 "main" %51
61 OpExecutionMode %4 OriginUpperLeft
66 OpMemberName %13 0 "zero"
69 OpName %51 "_GLF_color"
70 OpMemberDecorate %13 0 Offset 0
72 OpDecorate %15 DescriptorSet 0
73 OpDecorate %15 Binding 0
74 OpDecorate %51 Location 0
76 %3 = OpTypeFunction %2
78 %7 = OpTypeVector %6 2
79 %8 = OpTypePointer Function %7
81 %11 = OpConstantComposite %7 %10 %10
83 %13 = OpTypeStruct %12
84 %14 = OpTypePointer Uniform %13
85 %15 = OpVariable %14 Uniform
86 %16 = OpConstant %12 0
87 %17 = OpTypePointer Uniform %12
88 %20 = OpConstant %12 1
91 %26 = OpConstant %25 0
92 %27 = OpTypePointer Function %6
93 %33 = OpConstant %25 1
96 %38 = OpConstantComposite %7 %36 %37
98 %43 = OpConstantComposite %7 %37 %42
99 %44 = OpTypeVector %21 2
100 %49 = OpTypeVector %6 4
101 %50 = OpTypePointer Output %49
102 %51 = OpVariable %50 Output
103 %52 = OpConstant %6 0
104 %53 = OpConstantComposite %49 %10 %52 %52 %10
105 %55 = OpConstantComposite %49 %52 %52 %52 %52
106 %4 = OpFunction %2 None %3
108 %9 = OpVariable %8 Function
109 %32 = OpVariable %8 Function
111 %18 = OpAccessChain %17 %15 %16
113 %22 = OpIEqual %21 %19 %20
114 OpSelectionMerge %24 None
115 OpBranchConditional %22 %23 %24
117 %28 = OpAccessChain %27 %9 %26
119 %30 = OpFAdd %6 %29 %10
120 %31 = OpAccessChain %27 %9 %26
124 %34 = OpAccessChain %27 %9 %33
126 %39 = OpCompositeConstruct %7 %35 %35
127 %40 = OpFAdd %7 %39 %38
130 %45 = OpFOrdEqual %44 %41 %43
132 OpSelectionMerge %48 None
133 OpBranchConditional %46 %47 %54
145 # uniforms for variant
148 BUFFER variant_zero DATA_TYPE int32 DATA
152 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
154 PIPELINE graphics variant_pipeline
155 ATTACH variant_vertex_shader
156 ATTACH variant_fragment_shader
157 FRAMEBUFFER_SIZE 256 256
158 BIND BUFFER variant_framebuffer AS color LOCATION 0
159 BIND BUFFER variant_zero AS uniform DESCRIPTOR_SET 0 BINDING 0
161 CLEAR_COLOR variant_pipeline 0 0 0 255
163 CLEAR variant_pipeline
164 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
166 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255