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