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 the GraphicsFuzz project. 19 20# Short description: Two shaders with diff: variable mutated 21 22# The test renders two images using semantically equivalent shaders, and then 23# checks that the images are similar. 24# The test passes because the shaders have the same semantics and so the images 25# should be the same. 26 27SHADER vertex reference_vertex_shader PASSTHROUGH 28 29SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 30; SPIR-V 31; Version: 1.0 32; Generator: Khronos Glslang Reference Front End; 7 33; Bound: 230 34; Schema: 0 35 OpCapability Shader 36 %1 = OpExtInstImport "GLSL.std.450" 37 OpMemoryModel Logical GLSL450 38 OpEntryPoint Fragment %4 "main" %53 %138 39 OpExecutionMode %4 OriginUpperLeft 40 OpSource ESSL 320 41 OpName %4 "main" 42 OpName %53 "gl_FragCoord" 43 OpName %56 "buf0" 44 OpMemberName %56 0 "resolution" 45 OpName %58 "" 46 OpName %138 "_GLF_color" 47 OpName %163 "indexable" 48 OpDecorate %53 BuiltIn FragCoord 49 OpMemberDecorate %56 0 Offset 0 50 OpDecorate %56 Block 51 OpDecorate %58 DescriptorSet 0 52 OpDecorate %58 Binding 0 53 OpDecorate %138 Location 0 54 %2 = OpTypeVoid 55 %3 = OpTypeFunction %2 56 %6 = OpTypeInt 32 1 57 %7 = OpTypeVector %6 2 58 %13 = OpTypeInt 32 0 59 %18 = OpConstant %6 0 60 %19 = OpTypeBool 61 %26 = OpConstant %6 1 62 %38 = OpConstant %6 2 63 %47 = OpTypeFloat 32 64 %48 = OpTypeVector %47 2 65 %51 = OpTypeVector %47 4 66 %52 = OpTypePointer Input %51 67 %53 = OpVariable %52 Input 68 %56 = OpTypeStruct %48 69 %57 = OpTypePointer Uniform %56 70 %58 = OpVariable %57 Uniform 71 %59 = OpTypePointer Uniform %48 72 %67 = OpConstant %47 8 73 %78 = OpConstant %6 5 74 %82 = OpConstant %6 10 75 %95 = OpConstant %6 8 76 %107 = OpConstant %6 100 77 %130 = OpConstant %6 15 78 %132 = OpConstant %6 16 79 %137 = OpTypePointer Output %51 80 %138 = OpVariable %137 Output 81 %139 = OpConstant %13 16 82 %140 = OpTypeArray %51 %139 83 %141 = OpConstant %47 0 84 %142 = OpConstant %47 1 85 %143 = OpConstantComposite %51 %141 %141 %141 %142 86 %144 = OpConstant %47 0.5 87 %145 = OpConstantComposite %51 %144 %141 %141 %142 88 %146 = OpConstantComposite %51 %141 %144 %141 %142 89 %147 = OpConstantComposite %51 %144 %144 %141 %142 90 %148 = OpConstantComposite %51 %141 %141 %144 %142 91 %149 = OpConstantComposite %51 %144 %141 %144 %142 92 %150 = OpConstantComposite %51 %141 %144 %144 %142 93 %151 = OpConstantComposite %51 %144 %144 %144 %142 94 %152 = OpConstantComposite %51 %142 %141 %141 %142 95 %153 = OpConstantComposite %51 %141 %142 %141 %142 96 %154 = OpConstantComposite %51 %142 %142 %141 %142 97 %155 = OpConstantComposite %51 %141 %141 %142 %142 98 %156 = OpConstantComposite %51 %142 %141 %142 %142 99 %157 = OpConstantComposite %51 %141 %142 %142 %142 100 %158 = OpConstantComposite %51 %142 %142 %142 %142 101 %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158 102 %162 = OpTypePointer Function %140 103 %164 = OpTypePointer Function %51 104 %229 = OpUndef %7 105 %4 = OpFunction %2 None %3 106 %5 = OpLabel 107 %163 = OpVariable %162 Function 108 %54 = OpLoad %51 %53 109 %55 = OpVectorShuffle %48 %54 %54 0 1 110 %60 = OpAccessChain %59 %58 %18 111 %61 = OpLoad %48 %60 112 %62 = OpFDiv %48 %55 %61 113 %66 = OpCompositeExtract %47 %62 0 114 %68 = OpFMul %47 %66 %67 115 %69 = OpConvertFToS %6 %68 116 %71 = OpCompositeExtract %47 %62 1 117 %72 = OpFMul %47 %71 %67 118 %73 = OpConvertFToS %6 %72 119 %79 = OpBitwiseAnd %6 %69 %78 120 %83 = OpBitwiseAnd %6 %73 %82 121 %84 = OpBitwiseOr %6 %79 %83 122 %88 = OpBitwiseAnd %6 %73 %78 123 %91 = OpBitwiseAnd %6 %69 %82 124 %92 = OpBitwiseOr %6 %88 %91 125 %96 = OpIMul %6 %84 %95 126 %98 = OpIAdd %6 %96 %92 127 %99 = OpCompositeConstruct %7 %98 %18 128 OpBranch %101 129 %101 = OpLabel 130 %221 = OpPhi %7 %99 %5 %210 %104 131 %220 = OpPhi %6 %18 %5 %113 %104 132 %108 = OpSLessThan %19 %220 %107 133 OpLoopMerge %103 %104 None 134 OpBranchConditional %108 %102 %103 135 %102 = OpLabel 136 %170 = OpCompositeExtract %6 %221 0 137 %171 = OpSGreaterThan %19 %170 %18 138 OpSelectionMerge %176 None 139 OpBranchConditional %171 %172 %176 140 %172 = OpLabel 141 %174 = OpCompositeExtract %6 %221 1 142 %175 = OpISub %6 %174 %26 143 %202 = OpCompositeInsert %7 %175 %221 1 144 OpBranch %176 145 %176 = OpLabel 146 %224 = OpPhi %7 %221 %102 %202 %172 147 %178 = OpCompositeExtract %6 %224 0 148 %179 = OpSLessThan %19 %178 %18 149 OpSelectionMerge %184 None 150 OpBranchConditional %179 %180 %184 151 %180 = OpLabel 152 %182 = OpCompositeExtract %6 %224 1 153 %183 = OpIAdd %6 %182 %26 154 %206 = OpCompositeInsert %7 %183 %224 1 155 OpBranch %184 156 %184 = OpLabel 157 %225 = OpPhi %7 %224 %176 %206 %180 158 %186 = OpCompositeExtract %6 %225 1 159 %187 = OpSDiv %6 %186 %38 160 %189 = OpCompositeExtract %6 %225 0 161 %190 = OpIAdd %6 %189 %187 162 %210 = OpCompositeInsert %7 %190 %225 0 163 OpBranch %104 164 %104 = OpLabel 165 %113 = OpIAdd %6 %220 %26 166 OpBranch %101 167 %103 = OpLabel 168 %115 = OpCompositeExtract %6 %221 0 169 %116 = OpSLessThan %19 %115 %18 170 OpSelectionMerge %118 None 171 OpBranchConditional %116 %117 %118 172 %117 = OpLabel 173 %121 = OpSNegate %6 %115 174 %214 = OpCompositeInsert %7 %121 %229 0 175 OpBranch %118 176 %118 = OpLabel 177 %223 = OpPhi %7 %221 %103 %214 %117 178 OpBranch %123 179 %123 = OpLabel 180 %222 = OpPhi %7 %223 %118 %218 %124 181 %129 = OpCompositeExtract %6 %222 0 182 %131 = OpSGreaterThan %19 %129 %130 183 OpLoopMerge %125 %124 None 184 OpBranchConditional %131 %124 %125 185 %124 = OpLabel 186 %135 = OpISub %6 %129 %132 187 %218 = OpCompositeInsert %7 %135 %229 0 188 OpBranch %123 189 %125 = OpLabel 190 OpStore %163 %159 191 %165 = OpAccessChain %164 %163 %129 192 %166 = OpLoad %51 %165 193 OpStore %138 %166 194 OpReturn 195 OpFunctionEnd 196END 197 198# uniforms for reference 199 200# resolution 201BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA 202 256.0 256.0 203END 204 205BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM 206 207PIPELINE graphics reference_pipeline 208 ATTACH reference_vertex_shader 209 ATTACH reference_fragment_shader 210 FRAMEBUFFER_SIZE 256 256 211 BIND BUFFER reference_framebuffer AS color LOCATION 0 212 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 213END 214CLEAR_COLOR reference_pipeline 0 0 0 255 215 216CLEAR reference_pipeline 217RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256 218 219 220SHADER vertex variant_vertex_shader PASSTHROUGH 221 222SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 223; SPIR-V 224; Version: 1.0 225; Generator: Khronos Glslang Reference Front End; 7 226; Bound: 399 227; Schema: 0 228 OpCapability Shader 229 %1 = OpExtInstImport "GLSL.std.450" 230 OpMemoryModel Logical GLSL450 231 OpEntryPoint Fragment %4 "main" %53 %138 232 OpExecutionMode %4 OriginUpperLeft 233 OpSource ESSL 320 234 OpName %4 "main" 235 OpName %53 "gl_FragCoord" 236 OpName %56 "buf0" 237 OpMemberName %56 0 "resolution" 238 OpName %58 "" 239 OpName %138 "_GLF_color" 240 OpName %163 "indexable" 241 OpDecorate %53 BuiltIn FragCoord 242 OpMemberDecorate %56 0 Offset 0 243 OpDecorate %56 Block 244 OpDecorate %58 DescriptorSet 0 245 OpDecorate %58 Binding 0 246 OpDecorate %138 Location 0 247 %2 = OpTypeVoid 248 %3 = OpTypeFunction %2 249 %6 = OpTypeInt 32 1 250 %7 = OpTypeVector %6 2 251 %13 = OpTypeInt 32 0 252 %18 = OpConstant %6 0 253 %19 = OpTypeBool 254 %26 = OpConstant %6 1 255 %38 = OpConstant %6 2 256 %47 = OpTypeFloat 32 257 %48 = OpTypeVector %47 2 258 %51 = OpTypeVector %47 4 259 %52 = OpTypePointer Input %51 260 %53 = OpVariable %52 Input 261 %56 = OpTypeStruct %48 262 %57 = OpTypePointer Uniform %56 263 %58 = OpVariable %57 Uniform 264 %59 = OpTypePointer Uniform %48 265 %67 = OpConstant %47 8 266 %78 = OpConstant %6 5 267 %82 = OpConstant %6 10 268 %95 = OpConstant %6 8 269 %107 = OpConstant %6 100 270 %130 = OpConstant %6 15 271 %132 = OpConstant %6 16 272 %137 = OpTypePointer Output %51 273 %138 = OpVariable %137 Output 274 %139 = OpConstant %13 16 275 %140 = OpTypeArray %51 %139 276 %141 = OpConstant %47 0 277 %142 = OpConstant %47 1 278 %143 = OpConstantComposite %51 %141 %141 %141 %142 279 %144 = OpConstant %47 0.5 280 %145 = OpConstantComposite %51 %144 %141 %141 %142 281 %146 = OpConstantComposite %51 %141 %144 %141 %142 282 %147 = OpConstantComposite %51 %144 %144 %141 %142 283 %148 = OpConstantComposite %51 %141 %141 %144 %142 284 %149 = OpConstantComposite %51 %144 %141 %144 %142 285 %150 = OpConstantComposite %51 %141 %144 %144 %142 286 %151 = OpConstantComposite %51 %144 %144 %144 %142 287 %152 = OpConstantComposite %51 %142 %141 %141 %142 288 %153 = OpConstantComposite %51 %141 %142 %141 %142 289 %154 = OpConstantComposite %51 %142 %142 %141 %142 290 %155 = OpConstantComposite %51 %141 %141 %142 %142 291 %156 = OpConstantComposite %51 %142 %141 %142 %142 292 %157 = OpConstantComposite %51 %141 %142 %142 %142 293 %158 = OpConstantComposite %51 %142 %142 %142 %142 294 %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158 295 %162 = OpTypePointer Function %140 296 %164 = OpTypePointer Function %51 297 %229 = OpUndef %7 298 %354 = OpConstant %47 0 299 %355 = OpConstantComposite %51 %354 %354 %354 %354 300 %356 = OpConstantComposite %140 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 301 %4 = OpFunction %2 None %3 302 %5 = OpLabel 303 %163 = OpVariable %162 Function 304 %54 = OpLoad %51 %53 305 %55 = OpVectorShuffle %48 %54 %54 0 1 306 %60 = OpAccessChain %59 %58 %18 307 %61 = OpLoad %48 %60 308 %62 = OpFDiv %48 %55 %61 309 %66 = OpCompositeExtract %47 %62 0 310 %68 = OpFMul %47 %66 %67 311 %69 = OpConvertFToS %6 %68 312 %71 = OpCompositeExtract %47 %62 1 313 %72 = OpFMul %47 %71 %67 314 %73 = OpConvertFToS %6 %72 315 %79 = OpBitwiseAnd %6 %69 %78 316 %83 = OpBitwiseAnd %6 %73 %82 317 %84 = OpBitwiseOr %6 %79 %83 318 %88 = OpBitwiseAnd %6 %73 %78 319 %91 = OpBitwiseAnd %6 %69 %82 320 %92 = OpBitwiseOr %6 %88 %91 321 %96 = OpIMul %6 %84 %95 322 %98 = OpIAdd %6 %96 %92 323 %99 = OpCompositeConstruct %7 %98 %18 324 OpBranch %101 325 %101 = OpLabel 326 %221 = OpPhi %7 %99 %5 %210 %104 327 %220 = OpPhi %6 %18 %5 %113 %104 328 %108 = OpSLessThan %19 %220 %107 329 OpLoopMerge %103 %104 None 330 OpBranchConditional %108 %102 %103 331 %102 = OpLabel 332 %170 = OpCompositeExtract %6 %221 0 333 %171 = OpSGreaterThan %19 %170 %18 334 OpSelectionMerge %176 None 335 OpBranchConditional %171 %172 %176 336 %172 = OpLabel 337 %174 = OpCompositeExtract %6 %221 1 338 %175 = OpISub %6 %174 %26 339 %202 = OpCompositeInsert %7 %175 %221 1 340 OpBranch %176 341 %176 = OpLabel 342 %224 = OpPhi %7 %221 %102 %202 %172 343 %178 = OpCompositeExtract %6 %224 0 344 %179 = OpSLessThan %19 %178 %18 345 OpSelectionMerge %184 None 346 OpBranchConditional %179 %180 %184 347 %180 = OpLabel 348 %182 = OpCompositeExtract %6 %224 1 349 %183 = OpIAdd %6 %182 %26 350 %206 = OpCompositeInsert %7 %183 %224 1 351 OpBranch %184 352 %184 = OpLabel 353 %225 = OpPhi %7 %224 %176 %206 %180 354 %186 = OpCompositeExtract %6 %225 1 355 %187 = OpSDiv %6 %186 %38 356 %189 = OpCompositeExtract %6 %225 0 357 %190 = OpIAdd %6 %189 %187 358 %210 = OpCompositeInsert %7 %190 %225 0 359 OpBranch %104 360 %104 = OpLabel 361 %113 = OpIAdd %6 %220 %26 362 OpBranch %101 363 %103 = OpLabel 364 %115 = OpCompositeExtract %6 %221 0 365 %116 = OpSLessThan %19 %115 %18 366 OpSelectionMerge %118 None 367 OpBranchConditional %116 %117 %118 368 %117 = OpLabel 369 %121 = OpSNegate %6 %115 370 %214 = OpCompositeInsert %7 %121 %229 0 371 OpBranch %118 372 %118 = OpLabel 373 %223 = OpPhi %7 %221 %103 %214 %117 374 OpBranch %123 375 %123 = OpLabel 376 %222 = OpPhi %7 %223 %118 %218 %124 377 %129 = OpCompositeExtract %6 %222 0 378 %131 = OpSGreaterThan %19 %129 %130 379 OpLoopMerge %125 %124 None 380 OpBranchConditional %131 %124 %125 381 %124 = OpLabel 382 %135 = OpISub %6 %129 %132 383 %218 = OpCompositeInsert %7 %135 %229 0 384 OpBranch %123 385 %125 = OpLabel 386 OpStore %163 %159 387 %398 = OpLoad %140 %163 388 OpStore %163 %356 389 OpStore %163 %398 390 %165 = OpAccessChain %164 %163 %129 391 %166 = OpLoad %51 %165 392 OpStore %138 %166 393 OpReturn 394 OpFunctionEnd 395END 396 397# uniforms for variant 398 399# resolution 400BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA 401 256.0 256.0 402END 403 404BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 405 406PIPELINE graphics variant_pipeline 407 ATTACH variant_vertex_shader 408 ATTACH variant_fragment_shader 409 FRAMEBUFFER_SIZE 256 256 410 BIND BUFFER variant_framebuffer AS color LOCATION 0 411 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 412END 413CLEAR_COLOR variant_pipeline 0 0 0 255 414 415CLEAR variant_pipeline 416RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 417 418EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005 419