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 bug found by the GraphicsFuzz project.
20 # Short description: Equivalent shaders, one where an id is hidden inside a composite
22 # The test passes because both shaders render the same image.
24 SHADER vertex reference_vertex_shader PASSTHROUGH
26 SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
29 ; Generator: Khronos Glslang Reference Front End; 7
33 %1 = OpExtInstImport "GLSL.std.450"
34 OpMemoryModel Logical GLSL450
35 OpEntryPoint Fragment %4 "main" %12 %74
36 OpExecutionMode %4 OriginUpperLeft
39 OpName %12 "gl_FragCoord"
41 OpMemberName %15 0 "resolution"
43 OpName %74 "_GLF_color"
44 OpName %100 "indexable"
45 OpDecorate %12 BuiltIn FragCoord
46 OpMemberDecorate %15 0 Offset 0
48 OpDecorate %17 DescriptorSet 0
49 OpDecorate %17 Binding 0
50 OpDecorate %74 Location 0
52 %3 = OpTypeFunction %2
54 %7 = OpTypeVector %6 2
55 %10 = OpTypeVector %6 4
56 %11 = OpTypePointer Input %10
57 %12 = OpVariable %11 Input
59 %16 = OpTypePointer Uniform %15
60 %17 = OpVariable %16 Uniform
62 %19 = OpConstant %18 0
63 %20 = OpTypePointer Uniform %7
65 %32 = OpConstant %6 10
66 %47 = OpConstant %18 10
67 %51 = OpConstant %18 100
69 %62 = OpConstant %18 4
70 %65 = OpConstant %18 1000
71 %71 = OpConstant %18 1
72 %73 = OpTypePointer Output %10
73 %74 = OpVariable %73 Output
74 %75 = OpConstant %27 16
75 %76 = OpTypeArray %10 %75
78 %79 = OpConstantComposite %10 %77 %77 %77 %78
79 %80 = OpConstant %6 0.5
80 %81 = OpConstantComposite %10 %80 %77 %77 %78
81 %82 = OpConstantComposite %10 %77 %80 %77 %78
82 %83 = OpConstantComposite %10 %80 %80 %77 %78
83 %84 = OpConstantComposite %10 %77 %77 %80 %78
84 %85 = OpConstantComposite %10 %80 %77 %80 %78
85 %86 = OpConstantComposite %10 %77 %80 %80 %78
86 %87 = OpConstantComposite %10 %80 %80 %80 %78
87 %88 = OpConstantComposite %10 %78 %77 %77 %78
88 %89 = OpConstantComposite %10 %77 %78 %77 %78
89 %90 = OpConstantComposite %10 %78 %78 %77 %78
90 %91 = OpConstantComposite %10 %77 %77 %78 %78
91 %92 = OpConstantComposite %10 %78 %77 %78 %78
92 %93 = OpConstantComposite %10 %77 %78 %78 %78
93 %94 = OpConstantComposite %10 %78 %78 %78 %78
94 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94
95 %97 = OpConstant %18 16
96 %99 = OpTypePointer Function %76
97 %101 = OpTypePointer Function %10
98 %4 = OpFunction %2 None %3
100 %100 = OpVariable %99 Function
102 %14 = OpVectorShuffle %7 %13 %13 0 1
103 %21 = OpAccessChain %20 %17 %19
105 %23 = OpFDiv %7 %14 %22
106 %31 = OpCompositeExtract %6 %23 0
107 %33 = OpFMul %6 %31 %32
108 %34 = OpConvertFToS %18 %33
109 %37 = OpCompositeExtract %6 %23 1
110 %38 = OpFMul %6 %37 %32
111 %39 = OpConvertFToS %18 %38
112 %48 = OpIMul %18 %39 %47
113 %49 = OpIAdd %18 %34 %48
116 %106 = OpPhi %18 %51 %5 %69 %54
117 %104 = OpPhi %18 %19 %5 %72 %54
118 %61 = OpSLessThan %60 %104 %49
119 OpLoopMerge %55 %54 None
120 OpBranchConditional %61 %54 %55
122 %64 = OpIMul %18 %62 %106
123 %67 = OpISub %18 %65 %106
124 %68 = OpIMul %18 %64 %67
125 %69 = OpSDiv %18 %68 %65
126 %72 = OpIAdd %18 %104 %71
129 %98 = OpSMod %18 %106 %97
131 %102 = OpAccessChain %101 %100 %98
132 %103 = OpLoad %10 %102
138 # uniforms for reference
141 BUFFER reference_resolution DATA_TYPE vec2<float> DATA
145 BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
147 PIPELINE graphics reference_pipeline
148 ATTACH reference_vertex_shader
149 ATTACH reference_fragment_shader
150 FRAMEBUFFER_SIZE 256 256
151 BIND BUFFER reference_framebuffer AS color LOCATION 0
152 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
154 CLEAR_COLOR reference_pipeline 0 0 0 255
156 CLEAR reference_pipeline
157 RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
160 SHADER vertex variant_vertex_shader PASSTHROUGH
162 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
165 ; Generator: Khronos Glslang Reference Front End; 7
169 %1 = OpExtInstImport "GLSL.std.450"
170 OpMemoryModel Logical GLSL450
171 OpEntryPoint Fragment %4 "main" %12 %74
172 OpExecutionMode %4 OriginUpperLeft
175 OpName %12 "gl_FragCoord"
177 OpMemberName %15 0 "resolution"
179 OpName %74 "_GLF_color"
180 OpName %100 "indexable"
181 OpDecorate %12 BuiltIn FragCoord
182 OpMemberDecorate %15 0 Offset 0
184 OpDecorate %17 DescriptorSet 0
185 OpDecorate %17 Binding 0
186 OpDecorate %74 Location 0
188 %3 = OpTypeFunction %2
190 %7 = OpTypeVector %6 2
191 %10 = OpTypeVector %6 4
192 %11 = OpTypePointer Input %10
193 %12 = OpVariable %11 Input
194 %15 = OpTypeStruct %7
195 %16 = OpTypePointer Uniform %15
196 %17 = OpVariable %16 Uniform
198 %19 = OpConstant %18 0
199 %20 = OpTypePointer Uniform %7
201 %32 = OpConstant %6 10
202 %47 = OpConstant %18 10
203 %51 = OpConstant %18 100
205 %62 = OpConstant %18 4
206 %65 = OpConstant %18 1000
207 %71 = OpConstant %18 1
208 %73 = OpTypePointer Output %10
209 %74 = OpVariable %73 Output
210 %75 = OpConstant %27 16
211 %76 = OpTypeArray %10 %75
212 %77 = OpConstant %6 0
213 %78 = OpConstant %6 1
214 %79 = OpConstantComposite %10 %77 %77 %77 %78
215 %80 = OpConstant %6 0.5
216 %81 = OpConstantComposite %10 %80 %77 %77 %78
217 %82 = OpConstantComposite %10 %77 %80 %77 %78
218 %83 = OpConstantComposite %10 %80 %80 %77 %78
219 %84 = OpConstantComposite %10 %77 %77 %80 %78
220 %85 = OpConstantComposite %10 %80 %77 %80 %78
221 %86 = OpConstantComposite %10 %77 %80 %80 %78
222 %87 = OpConstantComposite %10 %80 %80 %80 %78
223 %88 = OpConstantComposite %10 %78 %77 %77 %78
224 %89 = OpConstantComposite %10 %77 %78 %77 %78
225 %90 = OpConstantComposite %10 %78 %78 %77 %78
226 %91 = OpConstantComposite %10 %77 %77 %78 %78
227 %92 = OpConstantComposite %10 %78 %77 %78 %78
228 %93 = OpConstantComposite %10 %77 %78 %78 %78
229 %94 = OpConstantComposite %10 %78 %78 %78 %78
230 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94
231 %97 = OpConstant %18 16
232 %99 = OpTypePointer Function %76
233 %101 = OpTypePointer Function %10
234 %213 = OpConstantComposite %7 %77 %77
235 %246 = OpConstant %6 0.5
236 %4 = OpFunction %2 None %3
238 %100 = OpVariable %99 Function
240 %14 = OpVectorShuffle %7 %13 %13 0 1
241 %21 = OpAccessChain %20 %17 %19
242 %341 = OpCompositeConstruct %10 %77 %14 %246
244 %23 = OpFDiv %7 %14 %22
245 %31 = OpCompositeExtract %6 %23 0
246 %388 = OpCompositeExtract %6 %341 3
247 %343 = OpCompositeConstruct %10 %388 %32 %213
248 %394 = OpCompositeExtract %6 %343 1
249 %33 = OpFMul %6 %31 %394
250 %34 = OpConvertFToS %18 %33
251 %37 = OpCompositeExtract %6 %23 1
252 %38 = OpFMul %6 %37 %32
253 %39 = OpConvertFToS %18 %38
254 %48 = OpIMul %18 %39 %47
255 %49 = OpIAdd %18 %34 %48
258 %106 = OpPhi %18 %51 %5 %69 %54
259 %104 = OpPhi %18 %19 %5 %72 %54
260 %61 = OpSLessThan %60 %104 %49
261 OpLoopMerge %55 %54 None
262 OpBranchConditional %61 %54 %55
264 %64 = OpIMul %18 %62 %106
265 %67 = OpISub %18 %65 %106
266 %68 = OpIMul %18 %64 %67
267 %69 = OpSDiv %18 %68 %65
268 %72 = OpIAdd %18 %104 %71
271 %98 = OpSMod %18 %106 %97
273 %102 = OpAccessChain %101 %100 %98
274 %103 = OpLoad %10 %102
280 # uniforms for variant
283 BUFFER variant_resolution DATA_TYPE vec2<float> DATA
287 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
289 PIPELINE graphics variant_pipeline
290 ATTACH variant_vertex_shader
291 ATTACH variant_fragment_shader
292 FRAMEBUFFER_SIZE 256 256
293 BIND BUFFER variant_framebuffer AS color LOCATION 0
294 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
296 CLEAR_COLOR variant_pipeline 0 0 0 255
298 CLEAR variant_pipeline
299 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
301 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005