#!amber # Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # A test for a bug found by the GraphicsFuzz project. # Short description: Three shaders diff: mutate var, vector shuffle # The test renders three images using semantically equivalent shaders, and then # checks that the images are similar. # The test passes because the shaders have the same semantics and so the images # should be the same. SHADER vertex reference_vertex_shader PASSTHROUGH SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 7 ; Bound: 107 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %12 %74 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 320 OpName %4 "main" OpName %12 "gl_FragCoord" OpName %15 "buf0" OpMemberName %15 0 "resolution" OpName %17 "" OpName %74 "_GLF_color" OpName %100 "indexable" OpDecorate %12 BuiltIn FragCoord OpMemberDecorate %15 0 Offset 0 OpDecorate %15 Block OpDecorate %17 DescriptorSet 0 OpDecorate %17 Binding 0 OpDecorate %74 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeVector %6 2 %10 = OpTypeVector %6 4 %11 = OpTypePointer Input %10 %12 = OpVariable %11 Input %15 = OpTypeStruct %7 %16 = OpTypePointer Uniform %15 %17 = OpVariable %16 Uniform %18 = OpTypeInt 32 1 %19 = OpConstant %18 0 %20 = OpTypePointer Uniform %7 %27 = OpTypeInt 32 0 %32 = OpConstant %6 10 %47 = OpConstant %18 10 %51 = OpConstant %18 100 %60 = OpTypeBool %62 = OpConstant %18 4 %65 = OpConstant %18 1000 %71 = OpConstant %18 1 %73 = OpTypePointer Output %10 %74 = OpVariable %73 Output %75 = OpConstant %27 16 %76 = OpTypeArray %10 %75 %77 = OpConstant %6 0 %78 = OpConstant %6 1 %79 = OpConstantComposite %10 %77 %77 %77 %78 %80 = OpConstant %6 0.5 %81 = OpConstantComposite %10 %80 %77 %77 %78 %82 = OpConstantComposite %10 %77 %80 %77 %78 %83 = OpConstantComposite %10 %80 %80 %77 %78 %84 = OpConstantComposite %10 %77 %77 %80 %78 %85 = OpConstantComposite %10 %80 %77 %80 %78 %86 = OpConstantComposite %10 %77 %80 %80 %78 %87 = OpConstantComposite %10 %80 %80 %80 %78 %88 = OpConstantComposite %10 %78 %77 %77 %78 %89 = OpConstantComposite %10 %77 %78 %77 %78 %90 = OpConstantComposite %10 %78 %78 %77 %78 %91 = OpConstantComposite %10 %77 %77 %78 %78 %92 = OpConstantComposite %10 %78 %77 %78 %78 %93 = OpConstantComposite %10 %77 %78 %78 %78 %94 = OpConstantComposite %10 %78 %78 %78 %78 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94 %97 = OpConstant %18 16 %99 = OpTypePointer Function %76 %101 = OpTypePointer Function %10 %4 = OpFunction %2 None %3 %5 = OpLabel %100 = OpVariable %99 Function %13 = OpLoad %10 %12 %14 = OpVectorShuffle %7 %13 %13 0 1 %21 = OpAccessChain %20 %17 %19 %22 = OpLoad %7 %21 %23 = OpFDiv %7 %14 %22 %31 = OpCompositeExtract %6 %23 0 %33 = OpFMul %6 %31 %32 %34 = OpConvertFToS %18 %33 %37 = OpCompositeExtract %6 %23 1 %38 = OpFMul %6 %37 %32 %39 = OpConvertFToS %18 %38 %48 = OpIMul %18 %39 %47 %49 = OpIAdd %18 %34 %48 OpBranch %53 %53 = OpLabel %106 = OpPhi %18 %51 %5 %69 %54 %104 = OpPhi %18 %19 %5 %72 %54 %61 = OpSLessThan %60 %104 %49 OpLoopMerge %55 %54 None OpBranchConditional %61 %54 %55 %54 = OpLabel %64 = OpIMul %18 %62 %106 %67 = OpISub %18 %65 %106 %68 = OpIMul %18 %64 %67 %69 = OpSDiv %18 %68 %65 %72 = OpIAdd %18 %104 %71 OpBranch %53 %55 = OpLabel %98 = OpSMod %18 %106 %97 OpStore %100 %95 %102 = OpAccessChain %101 %100 %98 %103 = OpLoad %10 %102 OpStore %74 %103 OpReturn OpFunctionEnd END # uniforms for reference # resolution BUFFER reference_resolution DATA_TYPE vec2 STD140 DATA 256.0 256.0 END BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM PIPELINE graphics reference_pipeline ATTACH reference_vertex_shader ATTACH reference_fragment_shader FRAMEBUFFER_SIZE 256 256 BIND BUFFER reference_framebuffer AS color LOCATION 0 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 END CLEAR_COLOR reference_pipeline 0 0 0 255 CLEAR reference_pipeline RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256 SHADER vertex variant_vertex_shader PASSTHROUGH SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 7 ; Bound: 263 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %12 %74 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 320 OpName %4 "main" OpName %12 "gl_FragCoord" OpName %15 "buf0" OpMemberName %15 0 "resolution" OpName %17 "" OpName %74 "_GLF_color" OpName %100 "indexable" OpDecorate %12 BuiltIn FragCoord OpMemberDecorate %15 0 Offset 0 OpDecorate %15 Block OpDecorate %17 DescriptorSet 0 OpDecorate %17 Binding 0 OpDecorate %74 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeVector %6 2 %10 = OpTypeVector %6 4 %11 = OpTypePointer Input %10 %12 = OpVariable %11 Input %15 = OpTypeStruct %7 %16 = OpTypePointer Uniform %15 %17 = OpVariable %16 Uniform %18 = OpTypeInt 32 1 %19 = OpConstant %18 0 %20 = OpTypePointer Uniform %7 %27 = OpTypeInt 32 0 %32 = OpConstant %6 10 %47 = OpConstant %18 10 %51 = OpConstant %18 100 %60 = OpTypeBool %62 = OpConstant %18 4 %65 = OpConstant %18 1000 %71 = OpConstant %18 1 %73 = OpTypePointer Output %10 %74 = OpVariable %73 Output %75 = OpConstant %27 16 %76 = OpTypeArray %10 %75 %77 = OpConstant %6 0 %78 = OpConstant %6 1 %79 = OpConstantComposite %10 %77 %77 %77 %78 %80 = OpConstant %6 0.5 %81 = OpConstantComposite %10 %80 %77 %77 %78 %82 = OpConstantComposite %10 %77 %80 %77 %78 %83 = OpConstantComposite %10 %80 %80 %77 %78 %84 = OpConstantComposite %10 %77 %77 %80 %78 %85 = OpConstantComposite %10 %80 %77 %80 %78 %86 = OpConstantComposite %10 %77 %80 %80 %78 %87 = OpConstantComposite %10 %80 %80 %80 %78 %88 = OpConstantComposite %10 %78 %77 %77 %78 %89 = OpConstantComposite %10 %77 %78 %77 %78 %90 = OpConstantComposite %10 %78 %78 %77 %78 %91 = OpConstantComposite %10 %77 %77 %78 %78 %92 = OpConstantComposite %10 %78 %77 %78 %78 %93 = OpConstantComposite %10 %77 %78 %78 %78 %94 = OpConstantComposite %10 %78 %78 %78 %78 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94 %97 = OpConstant %18 16 %99 = OpTypePointer Function %76 %101 = OpTypePointer Function %10 %234 = OpConstant %6 0 %235 = OpConstantComposite %10 %234 %234 %234 %234 %236 = OpConstantComposite %76 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %4 = OpFunction %2 None %3 %5 = OpLabel %100 = OpVariable %99 Function %13 = OpLoad %10 %12 %14 = OpVectorShuffle %7 %13 %13 0 1 %21 = OpAccessChain %20 %17 %19 %22 = OpLoad %7 %21 %23 = OpFDiv %7 %14 %22 %31 = OpCompositeExtract %6 %23 0 %33 = OpFMul %6 %31 %32 %34 = OpConvertFToS %18 %33 %37 = OpCompositeExtract %6 %23 1 %38 = OpFMul %6 %37 %32 %39 = OpConvertFToS %18 %38 %48 = OpIMul %18 %39 %47 %49 = OpIAdd %18 %34 %48 OpBranch %53 %53 = OpLabel %106 = OpPhi %18 %51 %5 %69 %54 %104 = OpPhi %18 %19 %5 %72 %54 %61 = OpSLessThan %60 %104 %49 OpLoopMerge %55 %54 None OpBranchConditional %61 %54 %55 %54 = OpLabel %64 = OpIMul %18 %62 %106 %67 = OpISub %18 %65 %106 %68 = OpIMul %18 %64 %67 %69 = OpSDiv %18 %68 %65 %72 = OpIAdd %18 %104 %71 OpBranch %53 %55 = OpLabel %98 = OpSMod %18 %106 %97 OpStore %100 %95 %262 = OpLoad %76 %100 OpStore %100 %236 OpStore %100 %262 %231 = OpVectorShuffle %7 %89 %85 1 4 %102 = OpAccessChain %101 %100 %98 %103 = OpLoad %10 %102 OpStore %74 %103 OpReturn OpFunctionEnd END # uniforms for variant # resolution BUFFER variant_resolution DATA_TYPE vec2 STD140 DATA 256.0 256.0 END BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM PIPELINE graphics variant_pipeline ATTACH variant_vertex_shader ATTACH variant_fragment_shader FRAMEBUFFER_SIZE 256 256 BIND BUFFER variant_framebuffer AS color LOCATION 0 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 END CLEAR_COLOR variant_pipeline 0 0 0 255 CLEAR variant_pipeline RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 SHADER vertex variant_2_vertex_shader PASSTHROUGH SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 ; SPIR-V ; Version: 1.0 ; Generator: Khronos Glslang Reference Front End; 7 ; Bound: 237 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %12 %74 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 320 OpName %4 "main" OpName %12 "gl_FragCoord" OpName %15 "buf0" OpMemberName %15 0 "resolution" OpName %17 "" OpName %74 "_GLF_color" OpName %100 "indexable" OpDecorate %12 BuiltIn FragCoord OpMemberDecorate %15 0 Offset 0 OpDecorate %15 Block OpDecorate %17 DescriptorSet 0 OpDecorate %17 Binding 0 OpDecorate %74 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeVector %6 2 %10 = OpTypeVector %6 4 %11 = OpTypePointer Input %10 %12 = OpVariable %11 Input %15 = OpTypeStruct %7 %16 = OpTypePointer Uniform %15 %17 = OpVariable %16 Uniform %18 = OpTypeInt 32 1 %19 = OpConstant %18 0 %20 = OpTypePointer Uniform %7 %27 = OpTypeInt 32 0 %32 = OpConstant %6 10 %47 = OpConstant %18 10 %51 = OpConstant %18 100 %60 = OpTypeBool %62 = OpConstant %18 4 %65 = OpConstant %18 1000 %71 = OpConstant %18 1 %73 = OpTypePointer Output %10 %74 = OpVariable %73 Output %75 = OpConstant %27 16 %76 = OpTypeArray %10 %75 %77 = OpConstant %6 0 %78 = OpConstant %6 1 %79 = OpConstantComposite %10 %77 %77 %77 %78 %80 = OpConstant %6 0.5 %81 = OpConstantComposite %10 %80 %77 %77 %78 %82 = OpConstantComposite %10 %77 %80 %77 %78 %83 = OpConstantComposite %10 %80 %80 %77 %78 %84 = OpConstantComposite %10 %77 %77 %80 %78 %85 = OpConstantComposite %10 %80 %77 %80 %78 %86 = OpConstantComposite %10 %77 %80 %80 %78 %87 = OpConstantComposite %10 %80 %80 %80 %78 %88 = OpConstantComposite %10 %78 %77 %77 %78 %89 = OpConstantComposite %10 %77 %78 %77 %78 %90 = OpConstantComposite %10 %78 %78 %77 %78 %91 = OpConstantComposite %10 %77 %77 %78 %78 %92 = OpConstantComposite %10 %78 %77 %78 %78 %93 = OpConstantComposite %10 %77 %78 %78 %78 %94 = OpConstantComposite %10 %78 %78 %78 %78 %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94 %97 = OpConstant %18 16 %99 = OpTypePointer Function %76 %101 = OpTypePointer Function %10 %234 = OpConstant %6 0 %235 = OpConstantComposite %10 %234 %234 %234 %234 %236 = OpConstantComposite %76 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %4 = OpFunction %2 None %3 %5 = OpLabel %100 = OpVariable %99 Function %13 = OpLoad %10 %12 %14 = OpVectorShuffle %7 %13 %13 0 1 %21 = OpAccessChain %20 %17 %19 %22 = OpLoad %7 %21 %23 = OpFDiv %7 %14 %22 %31 = OpCompositeExtract %6 %23 0 %33 = OpFMul %6 %31 %32 %34 = OpConvertFToS %18 %33 %37 = OpCompositeExtract %6 %23 1 %38 = OpFMul %6 %37 %32 %39 = OpConvertFToS %18 %38 %48 = OpIMul %18 %39 %47 %49 = OpIAdd %18 %34 %48 OpBranch %53 %53 = OpLabel %106 = OpPhi %18 %51 %5 %69 %54 %104 = OpPhi %18 %19 %5 %72 %54 %61 = OpSLessThan %60 %104 %49 OpLoopMerge %55 %54 None OpBranchConditional %61 %54 %55 %54 = OpLabel %64 = OpIMul %18 %62 %106 %67 = OpISub %18 %65 %106 %68 = OpIMul %18 %64 %67 %69 = OpSDiv %18 %68 %65 %72 = OpIAdd %18 %104 %71 OpBranch %53 %55 = OpLabel %98 = OpSMod %18 %106 %97 OpStore %100 %95 %231 = OpVectorShuffle %7 %89 %85 1 4 %102 = OpAccessChain %101 %100 %98 %103 = OpLoad %10 %102 OpStore %74 %103 OpReturn OpFunctionEnd END # uniforms for variant_2 # resolution BUFFER variant_2_resolution DATA_TYPE vec2 STD140 DATA 256.0 256.0 END BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM PIPELINE graphics variant_2_pipeline ATTACH variant_2_vertex_shader ATTACH variant_2_fragment_shader FRAMEBUFFER_SIZE 256 256 BIND BUFFER variant_2_framebuffer AS color LOCATION 0 BIND BUFFER variant_2_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 END CLEAR_COLOR variant_2_pipeline 0 0 0 255 CLEAR variant_2_pipeline RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005