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 instruction folding 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
39 # uint a = (77u + one) >> 32u;
40 # uint b = (3243u + one) >> 33u;
41 # uint c = (23u + one) >> 345u;
42 # uint d = (2395u + one) << 32u;
43 # uint e = (290485u + one) << 33u;
44 # uint f = (44321u + one) << 345u;
46 # if (a != 1u) a = 1u;
47 # if (b != 0u) b = 0u;
48 # if (c != 1u) c = 1u;
49 # if (d != 0u) d = 0u;
50 # if (e != 1u) e = 1u;
51 # if (f != 0u) f = 0u;
53 # if (a == 1u && b == 0u && c == 1u && d == 0u && e == 1u && f == 0u)
54 # _GLF_color = vec4(1, 0, 0, 1);
56 # _GLF_color = vec4(0);
58 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
61 ; Generator: Khronos Glslang Reference Front End; 8
65 %1 = OpExtInstImport "GLSL.std.450"
66 OpMemoryModel Logical GLSL450
67 OpEntryPoint Fragment %4 "main" %102
68 OpExecutionMode %4 OriginUpperLeft
73 OpMemberName %10 0 "one"
80 OpName %102 "_GLF_color"
81 OpMemberDecorate %10 0 Offset 0
83 OpDecorate %12 DescriptorSet 0
84 OpDecorate %12 Binding 0
85 OpDecorate %102 Location 0
87 %3 = OpTypeFunction %2
89 %7 = OpTypePointer Function %6
92 %11 = OpTypePointer Uniform %10
93 %12 = OpVariable %11 Uniform
95 %14 = OpConstant %13 0
96 %15 = OpTypePointer Uniform %6
97 %19 = OpConstant %6 32
98 %22 = OpConstant %6 3243
99 %26 = OpConstant %6 33
100 %29 = OpConstant %6 23
101 %33 = OpConstant %6 345
102 %36 = OpConstant %6 2395
103 %42 = OpConstant %6 290485
104 %48 = OpConstant %6 44321
105 %54 = OpConstant %6 1
107 %60 = OpConstant %6 0
109 %100 = OpTypeVector %99 4
110 %101 = OpTypePointer Output %100
111 %102 = OpVariable %101 Output
112 %103 = OpConstant %99 1
113 %104 = OpConstant %99 0
114 %105 = OpConstantComposite %100 %103 %104 %104 %103
115 %107 = OpConstantComposite %100 %104 %104 %104 %104
116 %4 = OpFunction %2 None %3
118 %8 = OpVariable %7 Function
119 %21 = OpVariable %7 Function
120 %28 = OpVariable %7 Function
121 %35 = OpVariable %7 Function
122 %41 = OpVariable %7 Function
123 %47 = OpVariable %7 Function
124 %16 = OpAccessChain %15 %12 %14
126 %18 = OpIAdd %6 %9 %17
127 %20 = OpShiftRightLogical %6 %18 %19
129 %23 = OpAccessChain %15 %12 %14
131 %25 = OpIAdd %6 %22 %24
132 %27 = OpShiftRightLogical %6 %25 %26
134 %30 = OpAccessChain %15 %12 %14
136 %32 = OpIAdd %6 %29 %31
137 %34 = OpShiftRightLogical %6 %32 %33
139 %37 = OpAccessChain %15 %12 %14
141 %39 = OpIAdd %6 %36 %38
142 %40 = OpShiftLeftLogical %6 %39 %19
144 %43 = OpAccessChain %15 %12 %14
146 %45 = OpIAdd %6 %42 %44
147 %46 = OpShiftLeftLogical %6 %45 %26
149 %49 = OpAccessChain %15 %12 %14
151 %51 = OpIAdd %6 %48 %50
152 %52 = OpShiftLeftLogical %6 %51 %33
155 %56 = OpINotEqual %55 %53 %54
156 OpSelectionMerge %58 None
157 OpBranchConditional %56 %57 %58
163 %61 = OpINotEqual %55 %59 %60
164 OpSelectionMerge %63 None
165 OpBranchConditional %61 %62 %63
171 %65 = OpINotEqual %55 %64 %54
172 OpSelectionMerge %67 None
173 OpBranchConditional %65 %66 %67
179 %69 = OpINotEqual %55 %68 %60
180 OpSelectionMerge %71 None
181 OpBranchConditional %69 %70 %71
187 %73 = OpINotEqual %55 %72 %54
188 OpSelectionMerge %75 None
189 OpBranchConditional %73 %74 %75
195 %77 = OpINotEqual %55 %76 %60
196 OpSelectionMerge %79 None
197 OpBranchConditional %77 %78 %79
203 %81 = OpIEqual %55 %80 %54
205 %83 = OpIEqual %55 %82 %60
206 %84 = OpLogicalAnd %55 %81 %83
208 %86 = OpIEqual %55 %85 %54
209 %87 = OpLogicalAnd %55 %84 %86
211 %89 = OpIEqual %55 %88 %60
212 %90 = OpLogicalAnd %55 %87 %89
214 %92 = OpIEqual %55 %91 %54
215 %93 = OpLogicalAnd %55 %90 %92
217 %95 = OpIEqual %55 %94 %60
218 %96 = OpLogicalAnd %55 %93 %95
219 OpSelectionMerge %98 None
220 OpBranchConditional %96 %97 %106
232 # uniforms for variant
235 BUFFER variant_one DATA_TYPE int32 DATA
239 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
241 PIPELINE graphics variant_pipeline
242 ATTACH variant_vertex_shader
243 ATTACH variant_fragment_shader
244 FRAMEBUFFER_SIZE 256 256
245 BIND BUFFER variant_framebuffer AS color LOCATION 0
246 BIND BUFFER variant_one AS uniform DESCRIPTOR_SET 0 BINDING 0
248 CLEAR_COLOR variant_pipeline 0 0 0 255
250 CLEAR variant_pipeline
251 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
253 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255