• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!amber
2
3# Copyright 2020 Google LLC
4#
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
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
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.
16
17
18# A test for a bug found by GraphicsFuzz.
19
20# Short description: A shader that multiplies a vector by fragcoord
21
22# The test passes because shader always writes red.
23
24SHADER vertex variant_vertex_shader PASSTHROUGH
25
26# variant_fragment_shader is derived from the following GLSL:
27# #version 310 es
28# precision highp float;
29# precision highp int;
30#
31# layout(location = 0) out vec4 _GLF_color;
32#
33# layout(set = 0, binding = 0) uniform buf0
34# {
35#     vec2 injectionSwitch;
36# };
37#
38# // Returns 1.
39# float func()
40# {
41#     vec4 value;
42#     bool alwaysFalse = gl_FragCoord.x < -1.0;
43#
44#     if (alwaysFalse)
45#     {
46#         vec2 a;
47#         value.xy = a;
48#     }
49#
50#     if (!alwaysFalse)
51#     {
52#         value.xy = injectionSwitch.xy; // x == 0.0, y == 1.0
53#     }
54#
55#     //At this point all components of value are guaranteed to be initialized.
56#     value.zw = gl_FragCoord.xy * value.xy * vec2(2) + value.xy;
57#
58#     // Iterates twice.
59#     for (int i = 0; i < int(injectionSwitch.y) + 1; i++)
60#     {
61#         value.x = float(i);
62#     }
63#
64#     // Always true.
65#     if (value.x == 1.0 && value.y == 1.0)
66#         return 1.0;
67#     else
68#         return 0.0;
69# }
70#
71# void main()
72# {
73#     int count = 0;
74#
75#     // Iterates twice.
76#     for (int i = 0; i < int(injectionSwitch.y) + 1; i++)
77#     {
78#         count += int(func());
79#     }
80#
81#     // Always true.
82#     if (count == 2)
83#         _GLF_color = vec4(1, 0, 0, 1);
84#     else
85#         _GLF_color = vec4(0, 0, 0, 1);
86# }
87SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
88; SPIR-V
89; Version: 1.0
90; Generator: Khronos Glslang Reference Front End; 8
91; Bound: 129
92; Schema: 0
93               OpCapability Shader
94          %1 = OpExtInstImport "GLSL.std.450"
95               OpMemoryModel Logical GLSL450
96               OpEntryPoint Fragment %4 "main" %15 %125
97               OpExecutionMode %4 OriginUpperLeft
98               OpSource ESSL 310
99               OpName %4 "main"
100               OpName %8 "func("
101               OpName %12 "alwaysFalse"
102               OpName %15 "gl_FragCoord"
103               OpName %27 "value"
104               OpName %30 "a"
105               OpName %38 "buf0"
106               OpMemberName %38 0 "injectionSwitch"
107               OpName %40 ""
108               OpName %62 "i"
109               OpName %100 "count"
110               OpName %101 "i"
111               OpName %125 "_GLF_color"
112               OpDecorate %15 BuiltIn FragCoord
113               OpMemberDecorate %38 0 Offset 0
114               OpDecorate %38 Block
115               OpDecorate %40 DescriptorSet 0
116               OpDecorate %40 Binding 0
117               OpDecorate %125 Location 0
118          %2 = OpTypeVoid
119          %3 = OpTypeFunction %2
120          %6 = OpTypeFloat 32
121          %7 = OpTypeFunction %6
122         %10 = OpTypeBool
123         %11 = OpTypePointer Function %10
124         %13 = OpTypeVector %6 4
125         %14 = OpTypePointer Input %13
126         %15 = OpVariable %14 Input
127         %16 = OpTypeInt 32 0
128         %17 = OpConstant %16 0
129         %18 = OpTypePointer Input %6
130         %21 = OpConstant %6 -1
131         %26 = OpTypePointer Function %13
132         %28 = OpTypeVector %6 2
133         %29 = OpTypePointer Function %28
134         %38 = OpTypeStruct %28
135         %39 = OpTypePointer Uniform %38
136         %40 = OpVariable %39 Uniform
137         %41 = OpTypeInt 32 1
138         %42 = OpConstant %41 0
139         %43 = OpTypePointer Uniform %28
140         %53 = OpConstant %6 2
141         %54 = OpConstantComposite %28 %53 %53
142         %61 = OpTypePointer Function %41
143         %69 = OpConstant %16 1
144         %70 = OpTypePointer Uniform %6
145         %74 = OpConstant %41 1
146         %79 = OpTypePointer Function %6
147         %85 = OpConstant %6 1
148         %97 = OpConstant %6 0
149        %120 = OpConstant %41 2
150        %124 = OpTypePointer Output %13
151        %125 = OpVariable %124 Output
152        %126 = OpConstantComposite %13 %85 %97 %97 %85
153        %128 = OpConstantComposite %13 %97 %97 %97 %85
154          %4 = OpFunction %2 None %3
155          %5 = OpLabel
156        %100 = OpVariable %61 Function
157        %101 = OpVariable %61 Function
158               OpStore %100 %42
159               OpStore %101 %42
160               OpBranch %102
161        %102 = OpLabel
162               OpLoopMerge %104 %105 None
163               OpBranch %106
164        %106 = OpLabel
165        %107 = OpLoad %41 %101
166        %108 = OpAccessChain %70 %40 %42 %69
167        %109 = OpLoad %6 %108
168        %110 = OpConvertFToS %41 %109
169        %111 = OpIAdd %41 %110 %74
170        %112 = OpSLessThan %10 %107 %111
171               OpBranchConditional %112 %103 %104
172        %103 = OpLabel
173        %113 = OpFunctionCall %6 %8
174        %114 = OpConvertFToS %41 %113
175        %115 = OpLoad %41 %100
176        %116 = OpIAdd %41 %115 %114
177               OpStore %100 %116
178               OpBranch %105
179        %105 = OpLabel
180        %117 = OpLoad %41 %101
181        %118 = OpIAdd %41 %117 %74
182               OpStore %101 %118
183               OpBranch %102
184        %104 = OpLabel
185        %119 = OpLoad %41 %100
186        %121 = OpIEqual %10 %119 %120
187               OpSelectionMerge %123 None
188               OpBranchConditional %121 %122 %127
189        %122 = OpLabel
190               OpStore %125 %126
191               OpBranch %123
192        %127 = OpLabel
193               OpStore %125 %128
194               OpBranch %123
195        %123 = OpLabel
196               OpReturn
197               OpFunctionEnd
198          %8 = OpFunction %6 None %7
199          %9 = OpLabel
200         %12 = OpVariable %11 Function
201         %27 = OpVariable %26 Function
202         %30 = OpVariable %29 Function
203         %62 = OpVariable %61 Function
204         %19 = OpAccessChain %18 %15 %17
205         %20 = OpLoad %6 %19
206         %22 = OpFOrdLessThan %10 %20 %21
207               OpStore %12 %22
208         %23 = OpLoad %10 %12
209               OpSelectionMerge %25 None
210               OpBranchConditional %23 %24 %25
211         %24 = OpLabel
212         %31 = OpLoad %28 %30
213         %32 = OpLoad %13 %27
214         %33 = OpVectorShuffle %13 %32 %31 4 5 2 3
215               OpStore %27 %33
216               OpBranch %25
217         %25 = OpLabel
218         %34 = OpLoad %10 %12
219         %35 = OpLogicalNot %10 %34
220               OpSelectionMerge %37 None
221               OpBranchConditional %35 %36 %37
222         %36 = OpLabel
223         %44 = OpAccessChain %43 %40 %42
224         %45 = OpLoad %28 %44
225         %46 = OpLoad %13 %27
226         %47 = OpVectorShuffle %13 %46 %45 4 5 2 3
227               OpStore %27 %47
228               OpBranch %37
229         %37 = OpLabel
230         %48 = OpLoad %13 %15
231         %49 = OpVectorShuffle %28 %48 %48 0 1
232         %50 = OpLoad %13 %27
233         %51 = OpVectorShuffle %28 %50 %50 0 1
234         %52 = OpFMul %28 %49 %51
235         %55 = OpFMul %28 %52 %54
236         %56 = OpLoad %13 %27
237         %57 = OpVectorShuffle %28 %56 %56 0 1
238         %58 = OpFAdd %28 %55 %57
239         %59 = OpLoad %13 %27
240         %60 = OpVectorShuffle %13 %59 %58 0 1 4 5
241               OpStore %27 %60
242               OpStore %62 %42
243               OpBranch %63
244         %63 = OpLabel
245               OpLoopMerge %65 %66 None
246               OpBranch %67
247         %67 = OpLabel
248         %68 = OpLoad %41 %62
249         %71 = OpAccessChain %70 %40 %42 %69
250         %72 = OpLoad %6 %71
251         %73 = OpConvertFToS %41 %72
252         %75 = OpIAdd %41 %73 %74
253         %76 = OpSLessThan %10 %68 %75
254               OpBranchConditional %76 %64 %65
255         %64 = OpLabel
256         %77 = OpLoad %41 %62
257         %78 = OpConvertSToF %6 %77
258         %80 = OpAccessChain %79 %27 %17
259               OpStore %80 %78
260               OpBranch %66
261         %66 = OpLabel
262         %81 = OpLoad %41 %62
263         %82 = OpIAdd %41 %81 %74
264               OpStore %62 %82
265               OpBranch %63
266         %65 = OpLabel
267         %83 = OpAccessChain %79 %27 %17
268         %84 = OpLoad %6 %83
269         %86 = OpFOrdEqual %10 %84 %85
270               OpSelectionMerge %88 None
271               OpBranchConditional %86 %87 %88
272         %87 = OpLabel
273         %89 = OpAccessChain %79 %27 %69
274         %90 = OpLoad %6 %89
275         %91 = OpFOrdEqual %10 %90 %85
276               OpBranch %88
277         %88 = OpLabel
278         %92 = OpPhi %10 %86 %65 %91 %87
279               OpSelectionMerge %94 None
280               OpBranchConditional %92 %93 %96
281         %93 = OpLabel
282               OpReturnValue %85
283         %96 = OpLabel
284               OpReturnValue %97
285         %94 = OpLabel
286               OpUnreachable
287               OpFunctionEnd
288END
289
290# uniforms for variant
291
292# injectionSwitch
293BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
294 0.0 1.0
295END
296
297BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
298
299PIPELINE graphics variant_pipeline
300  ATTACH variant_vertex_shader
301  ATTACH variant_fragment_shader
302  FRAMEBUFFER_SIZE 256 256
303  BIND BUFFER variant_framebuffer AS color LOCATION 0
304  BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
305END
306CLEAR_COLOR variant_pipeline 0 0 0 255
307
308CLEAR variant_pipeline
309RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
310
311EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
312