• 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 coverage-gap found by the GraphicsFuzz project.
19
20# Short description: A fragment shader that covers a specific instr info code path
21
22# The test passes because the 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# #define _int_0 _GLF_uniform_int_values[0]
29# #define _int_1 _GLF_uniform_int_values[1]
30# #define _int_10 _GLF_uniform_int_values[2]
31# #define _float_0_0 _GLF_uniform_float_values[0]
32# #define _float_1_0 _GLF_uniform_float_values[1]
33#
34# precision highp float;
35#
36# precision highp int;
37#
38# layout(location = 0) out vec4 _GLF_color;
39#
40# // Contents of _GLF_uniform_int_values: [0, 1]
41# layout(set = 0, binding = 0) uniform buf0
42# {
43#     int _GLF_uniform_int_values[3];
44# };
45#
46# // Contents of _GLF_uniform_float_values: [0.0, 1.0]
47# layout(set = 0, binding = 1) uniform buf1
48# {
49#     float _GLF_uniform_float_values[2];
50# };
51#
52# int data[10];
53#
54# void f1()
55# {
56#     _GLF_color = vec4(0);
57#
58#     for (int i = _int_1; i < _int_10; i++)
59#     {
60#         data[i] = _int_0;
61#     }
62#
63#     float a = determinant(mat2(1.0, 1.0, 1.0, 1.0));
64#     float b = determinant(mat2(0.0, 0.0, 0.0, 0.0));
65#
66#     mat2x4 m24a = mat2x4(a, _float_1_0, _float_1_0, _float_1_0, _float_1_0,
67#                          _float_1_0, _float_1_0, _float_1_0);
68#     mat2x4 m24b = mat2x4(b, _float_1_0, _float_1_0, _float_1_0, _float_1_0,
69#                          _float_1_0, _float_1_0, _float_1_0);
70#
71#     float c = min(float(m24a), float(m24b));
72#
73#     if (c < _float_1_0 && a == 0.0 && b == 0.0)
74#     {
75#         data[0] = _int_1;
76#     }
77# }
78#
79# void main()
80# {
81#     for (int i = 0; i <= 10; i++)
82#     {
83#         f1();
84#     }
85#
86#     _GLF_color = vec4(data[0], _float_0_0, _float_0_0, data[0]);
87# }
88SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
89; SPIR-V
90; Version: 1.0
91; Generator: Khronos Glslang Reference Front End; 8
92; Bound: 152
93; Schema: 0
94               OpCapability Shader
95          %1 = OpExtInstImport "GLSL.std.450"
96               OpMemoryModel Logical GLSL450
97               OpEntryPoint Fragment %4 "main" %11
98               OpExecutionMode %4 OriginUpperLeft
99               OpSource ESSL 310
100               OpName %4 "main"
101               OpName %6 "f1("
102               OpName %11 "_GLF_color"
103               OpName %16 "i"
104               OpName %20 "buf0"
105               OpMemberName %20 0 "_GLF_uniform_int_values"
106               OpName %22 ""
107               OpName %42 "data"
108               OpName %51 "a"
109               OpName %58 "b"
110               OpName %64 "m24a"
111               OpName %68 "buf1"
112               OpMemberName %68 0 "_GLF_uniform_float_values"
113               OpName %70 ""
114               OpName %89 "m24b"
115               OpName %108 "c"
116               OpName %129 "i"
117               OpDecorate %11 Location 0
118               OpDecorate %19 ArrayStride 16
119               OpMemberDecorate %20 0 Offset 0
120               OpDecorate %20 Block
121               OpDecorate %22 DescriptorSet 0
122               OpDecorate %22 Binding 0
123               OpDecorate %67 ArrayStride 16
124               OpMemberDecorate %68 0 Offset 0
125               OpDecorate %68 Block
126               OpDecorate %70 DescriptorSet 0
127               OpDecorate %70 Binding 1
128          %2 = OpTypeVoid
129          %3 = OpTypeFunction %2
130          %8 = OpTypeFloat 32
131          %9 = OpTypeVector %8 4
132         %10 = OpTypePointer Output %9
133         %11 = OpVariable %10 Output
134         %12 = OpConstant %8 0
135         %13 = OpConstantComposite %9 %12 %12 %12 %12
136         %14 = OpTypeInt 32 1
137         %15 = OpTypePointer Function %14
138         %17 = OpTypeInt 32 0
139         %18 = OpConstant %17 3
140         %19 = OpTypeArray %14 %18
141         %20 = OpTypeStruct %19
142         %21 = OpTypePointer Uniform %20
143         %22 = OpVariable %21 Uniform
144         %23 = OpConstant %14 0
145         %24 = OpConstant %14 1
146         %25 = OpTypePointer Uniform %14
147         %34 = OpConstant %14 2
148         %37 = OpTypeBool
149         %39 = OpConstant %17 10
150         %40 = OpTypeArray %14 %39
151         %41 = OpTypePointer Private %40
152         %42 = OpVariable %41 Private
153         %46 = OpTypePointer Private %14
154         %50 = OpTypePointer Function %8
155         %52 = OpTypeVector %8 2
156         %53 = OpTypeMatrix %52 2
157         %54 = OpConstant %8 1
158         %55 = OpConstantComposite %52 %54 %54
159         %56 = OpConstantComposite %53 %55 %55
160         %59 = OpConstantComposite %52 %12 %12
161         %60 = OpConstantComposite %53 %59 %59
162         %62 = OpTypeMatrix %9 2
163         %63 = OpTypePointer Function %62
164         %66 = OpConstant %17 2
165         %67 = OpTypeArray %8 %66
166         %68 = OpTypeStruct %67
167         %69 = OpTypePointer Uniform %68
168         %70 = OpVariable %69 Uniform
169         %71 = OpTypePointer Uniform %8
170        %136 = OpConstant %14 10
171          %4 = OpFunction %2 None %3
172          %5 = OpLabel
173        %129 = OpVariable %15 Function
174               OpStore %129 %23
175               OpBranch %130
176        %130 = OpLabel
177               OpLoopMerge %132 %133 None
178               OpBranch %134
179        %134 = OpLabel
180        %135 = OpLoad %14 %129
181        %137 = OpSLessThanEqual %37 %135 %136
182               OpBranchConditional %137 %131 %132
183        %131 = OpLabel
184        %138 = OpFunctionCall %2 %6
185               OpBranch %133
186        %133 = OpLabel
187        %139 = OpLoad %14 %129
188        %140 = OpIAdd %14 %139 %24
189               OpStore %129 %140
190               OpBranch %130
191        %132 = OpLabel
192        %141 = OpAccessChain %46 %42 %23
193        %142 = OpLoad %14 %141
194        %143 = OpConvertSToF %8 %142
195        %144 = OpAccessChain %71 %70 %23 %23
196        %145 = OpLoad %8 %144
197        %146 = OpAccessChain %71 %70 %23 %23
198        %147 = OpLoad %8 %146
199        %148 = OpAccessChain %46 %42 %23
200        %149 = OpLoad %14 %148
201        %150 = OpConvertSToF %8 %149
202        %151 = OpCompositeConstruct %9 %143 %145 %147 %150
203               OpStore %11 %151
204               OpReturn
205               OpFunctionEnd
206          %6 = OpFunction %2 None %3
207          %7 = OpLabel
208         %16 = OpVariable %15 Function
209         %51 = OpVariable %50 Function
210         %58 = OpVariable %50 Function
211         %64 = OpVariable %63 Function
212         %89 = OpVariable %63 Function
213        %108 = OpVariable %50 Function
214               OpStore %11 %13
215         %26 = OpAccessChain %25 %22 %23 %24
216         %27 = OpLoad %14 %26
217               OpStore %16 %27
218               OpBranch %28
219         %28 = OpLabel
220               OpLoopMerge %30 %31 None
221               OpBranch %32
222         %32 = OpLabel
223         %33 = OpLoad %14 %16
224         %35 = OpAccessChain %25 %22 %23 %34
225         %36 = OpLoad %14 %35
226         %38 = OpSLessThan %37 %33 %36
227               OpBranchConditional %38 %29 %30
228         %29 = OpLabel
229         %43 = OpLoad %14 %16
230         %44 = OpAccessChain %25 %22 %23 %23
231         %45 = OpLoad %14 %44
232         %47 = OpAccessChain %46 %42 %43
233               OpStore %47 %45
234               OpBranch %31
235         %31 = OpLabel
236         %48 = OpLoad %14 %16
237         %49 = OpIAdd %14 %48 %24
238               OpStore %16 %49
239               OpBranch %28
240         %30 = OpLabel
241         %57 = OpExtInst %8 %1 Determinant %56
242               OpStore %51 %57
243         %61 = OpExtInst %8 %1 Determinant %60
244               OpStore %58 %61
245         %65 = OpLoad %8 %51
246         %72 = OpAccessChain %71 %70 %23 %24
247         %73 = OpLoad %8 %72
248         %74 = OpAccessChain %71 %70 %23 %24
249         %75 = OpLoad %8 %74
250         %76 = OpAccessChain %71 %70 %23 %24
251         %77 = OpLoad %8 %76
252         %78 = OpAccessChain %71 %70 %23 %24
253         %79 = OpLoad %8 %78
254         %80 = OpAccessChain %71 %70 %23 %24
255         %81 = OpLoad %8 %80
256         %82 = OpAccessChain %71 %70 %23 %24
257         %83 = OpLoad %8 %82
258         %84 = OpAccessChain %71 %70 %23 %24
259         %85 = OpLoad %8 %84
260         %86 = OpCompositeConstruct %9 %65 %73 %75 %77
261         %87 = OpCompositeConstruct %9 %79 %81 %83 %85
262         %88 = OpCompositeConstruct %62 %86 %87
263               OpStore %64 %88
264         %90 = OpLoad %8 %58
265         %91 = OpAccessChain %71 %70 %23 %24
266         %92 = OpLoad %8 %91
267         %93 = OpAccessChain %71 %70 %23 %24
268         %94 = OpLoad %8 %93
269         %95 = OpAccessChain %71 %70 %23 %24
270         %96 = OpLoad %8 %95
271         %97 = OpAccessChain %71 %70 %23 %24
272         %98 = OpLoad %8 %97
273         %99 = OpAccessChain %71 %70 %23 %24
274        %100 = OpLoad %8 %99
275        %101 = OpAccessChain %71 %70 %23 %24
276        %102 = OpLoad %8 %101
277        %103 = OpAccessChain %71 %70 %23 %24
278        %104 = OpLoad %8 %103
279        %105 = OpCompositeConstruct %9 %90 %92 %94 %96
280        %106 = OpCompositeConstruct %9 %98 %100 %102 %104
281        %107 = OpCompositeConstruct %62 %105 %106
282               OpStore %89 %107
283        %109 = OpLoad %62 %64
284        %110 = OpCompositeExtract %8 %109 0 0
285        %111 = OpLoad %62 %89
286        %112 = OpCompositeExtract %8 %111 0 0
287        %113 = OpExtInst %8 %1 FMin %110 %112
288               OpStore %108 %113
289        %114 = OpLoad %8 %108
290        %115 = OpAccessChain %71 %70 %23 %24
291        %116 = OpLoad %8 %115
292        %117 = OpFOrdLessThan %37 %114 %116
293        %118 = OpLoad %8 %51
294        %119 = OpFOrdEqual %37 %118 %12
295        %120 = OpLogicalAnd %37 %117 %119
296        %121 = OpLoad %8 %58
297        %122 = OpFOrdEqual %37 %121 %12
298        %123 = OpLogicalAnd %37 %120 %122
299               OpSelectionMerge %125 None
300               OpBranchConditional %123 %124 %125
301        %124 = OpLabel
302        %126 = OpAccessChain %25 %22 %23 %24
303        %127 = OpLoad %14 %126
304        %128 = OpAccessChain %46 %42 %23
305               OpStore %128 %127
306               OpBranch %125
307        %125 = OpLabel
308               OpReturn
309               OpFunctionEnd
310END
311
312# uniforms for variant
313
314# _GLF_uniform_int_values
315BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
316 0 1 10
317END
318# _GLF_uniform_float_values
319BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
320 0.0 1.0
321END
322
323BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
324
325PIPELINE graphics variant_pipeline
326  ATTACH variant_vertex_shader
327  ATTACH variant_fragment_shader
328  FRAMEBUFFER_SIZE 256 256
329  BIND BUFFER variant_framebuffer AS color LOCATION 0
330  BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
331  BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
332END
333CLEAR_COLOR variant_pipeline 0 0 0 255
334
335CLEAR variant_pipeline
336RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
337
338EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
339