#!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: Two shaders with diff: variable mutated # The test renders two 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: 230 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %53 %138 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 320 OpName %4 "main" OpName %53 "gl_FragCoord" OpName %56 "buf0" OpMemberName %56 0 "resolution" OpName %58 "" OpName %138 "_GLF_color" OpName %163 "indexable" OpDecorate %53 BuiltIn FragCoord OpMemberDecorate %56 0 Offset 0 OpDecorate %56 Block OpDecorate %58 DescriptorSet 0 OpDecorate %58 Binding 0 OpDecorate %138 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypeVector %6 2 %13 = OpTypeInt 32 0 %18 = OpConstant %6 0 %19 = OpTypeBool %26 = OpConstant %6 1 %38 = OpConstant %6 2 %47 = OpTypeFloat 32 %48 = OpTypeVector %47 2 %51 = OpTypeVector %47 4 %52 = OpTypePointer Input %51 %53 = OpVariable %52 Input %56 = OpTypeStruct %48 %57 = OpTypePointer Uniform %56 %58 = OpVariable %57 Uniform %59 = OpTypePointer Uniform %48 %67 = OpConstant %47 8 %78 = OpConstant %6 5 %82 = OpConstant %6 10 %95 = OpConstant %6 8 %107 = OpConstant %6 100 %130 = OpConstant %6 15 %132 = OpConstant %6 16 %137 = OpTypePointer Output %51 %138 = OpVariable %137 Output %139 = OpConstant %13 16 %140 = OpTypeArray %51 %139 %141 = OpConstant %47 0 %142 = OpConstant %47 1 %143 = OpConstantComposite %51 %141 %141 %141 %142 %144 = OpConstant %47 0.5 %145 = OpConstantComposite %51 %144 %141 %141 %142 %146 = OpConstantComposite %51 %141 %144 %141 %142 %147 = OpConstantComposite %51 %144 %144 %141 %142 %148 = OpConstantComposite %51 %141 %141 %144 %142 %149 = OpConstantComposite %51 %144 %141 %144 %142 %150 = OpConstantComposite %51 %141 %144 %144 %142 %151 = OpConstantComposite %51 %144 %144 %144 %142 %152 = OpConstantComposite %51 %142 %141 %141 %142 %153 = OpConstantComposite %51 %141 %142 %141 %142 %154 = OpConstantComposite %51 %142 %142 %141 %142 %155 = OpConstantComposite %51 %141 %141 %142 %142 %156 = OpConstantComposite %51 %142 %141 %142 %142 %157 = OpConstantComposite %51 %141 %142 %142 %142 %158 = OpConstantComposite %51 %142 %142 %142 %142 %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158 %162 = OpTypePointer Function %140 %164 = OpTypePointer Function %51 %229 = OpUndef %7 %4 = OpFunction %2 None %3 %5 = OpLabel %163 = OpVariable %162 Function %54 = OpLoad %51 %53 %55 = OpVectorShuffle %48 %54 %54 0 1 %60 = OpAccessChain %59 %58 %18 %61 = OpLoad %48 %60 %62 = OpFDiv %48 %55 %61 %66 = OpCompositeExtract %47 %62 0 %68 = OpFMul %47 %66 %67 %69 = OpConvertFToS %6 %68 %71 = OpCompositeExtract %47 %62 1 %72 = OpFMul %47 %71 %67 %73 = OpConvertFToS %6 %72 %79 = OpBitwiseAnd %6 %69 %78 %83 = OpBitwiseAnd %6 %73 %82 %84 = OpBitwiseOr %6 %79 %83 %88 = OpBitwiseAnd %6 %73 %78 %91 = OpBitwiseAnd %6 %69 %82 %92 = OpBitwiseOr %6 %88 %91 %96 = OpIMul %6 %84 %95 %98 = OpIAdd %6 %96 %92 %99 = OpCompositeConstruct %7 %98 %18 OpBranch %101 %101 = OpLabel %221 = OpPhi %7 %99 %5 %210 %104 %220 = OpPhi %6 %18 %5 %113 %104 %108 = OpSLessThan %19 %220 %107 OpLoopMerge %103 %104 None OpBranchConditional %108 %102 %103 %102 = OpLabel %170 = OpCompositeExtract %6 %221 0 %171 = OpSGreaterThan %19 %170 %18 OpSelectionMerge %176 None OpBranchConditional %171 %172 %176 %172 = OpLabel %174 = OpCompositeExtract %6 %221 1 %175 = OpISub %6 %174 %26 %202 = OpCompositeInsert %7 %175 %221 1 OpBranch %176 %176 = OpLabel %224 = OpPhi %7 %221 %102 %202 %172 %178 = OpCompositeExtract %6 %224 0 %179 = OpSLessThan %19 %178 %18 OpSelectionMerge %184 None OpBranchConditional %179 %180 %184 %180 = OpLabel %182 = OpCompositeExtract %6 %224 1 %183 = OpIAdd %6 %182 %26 %206 = OpCompositeInsert %7 %183 %224 1 OpBranch %184 %184 = OpLabel %225 = OpPhi %7 %224 %176 %206 %180 %186 = OpCompositeExtract %6 %225 1 %187 = OpSDiv %6 %186 %38 %189 = OpCompositeExtract %6 %225 0 %190 = OpIAdd %6 %189 %187 %210 = OpCompositeInsert %7 %190 %225 0 OpBranch %104 %104 = OpLabel %113 = OpIAdd %6 %220 %26 OpBranch %101 %103 = OpLabel %115 = OpCompositeExtract %6 %221 0 %116 = OpSLessThan %19 %115 %18 OpSelectionMerge %118 None OpBranchConditional %116 %117 %118 %117 = OpLabel %121 = OpSNegate %6 %115 %214 = OpCompositeInsert %7 %121 %229 0 OpBranch %118 %118 = OpLabel %223 = OpPhi %7 %221 %103 %214 %117 OpBranch %123 %123 = OpLabel %222 = OpPhi %7 %223 %118 %218 %124 %129 = OpCompositeExtract %6 %222 0 %131 = OpSGreaterThan %19 %129 %130 OpLoopMerge %125 %124 None OpBranchConditional %131 %124 %125 %124 = OpLabel %135 = OpISub %6 %129 %132 %218 = OpCompositeInsert %7 %135 %229 0 OpBranch %123 %125 = OpLabel OpStore %163 %159 %165 = OpAccessChain %164 %163 %129 %166 = OpLoad %51 %165 OpStore %138 %166 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: 399 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %53 %138 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 320 OpName %4 "main" OpName %53 "gl_FragCoord" OpName %56 "buf0" OpMemberName %56 0 "resolution" OpName %58 "" OpName %138 "_GLF_color" OpName %163 "indexable" OpDecorate %53 BuiltIn FragCoord OpMemberDecorate %56 0 Offset 0 OpDecorate %56 Block OpDecorate %58 DescriptorSet 0 OpDecorate %58 Binding 0 OpDecorate %138 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypeVector %6 2 %13 = OpTypeInt 32 0 %18 = OpConstant %6 0 %19 = OpTypeBool %26 = OpConstant %6 1 %38 = OpConstant %6 2 %47 = OpTypeFloat 32 %48 = OpTypeVector %47 2 %51 = OpTypeVector %47 4 %52 = OpTypePointer Input %51 %53 = OpVariable %52 Input %56 = OpTypeStruct %48 %57 = OpTypePointer Uniform %56 %58 = OpVariable %57 Uniform %59 = OpTypePointer Uniform %48 %67 = OpConstant %47 8 %78 = OpConstant %6 5 %82 = OpConstant %6 10 %95 = OpConstant %6 8 %107 = OpConstant %6 100 %130 = OpConstant %6 15 %132 = OpConstant %6 16 %137 = OpTypePointer Output %51 %138 = OpVariable %137 Output %139 = OpConstant %13 16 %140 = OpTypeArray %51 %139 %141 = OpConstant %47 0 %142 = OpConstant %47 1 %143 = OpConstantComposite %51 %141 %141 %141 %142 %144 = OpConstant %47 0.5 %145 = OpConstantComposite %51 %144 %141 %141 %142 %146 = OpConstantComposite %51 %141 %144 %141 %142 %147 = OpConstantComposite %51 %144 %144 %141 %142 %148 = OpConstantComposite %51 %141 %141 %144 %142 %149 = OpConstantComposite %51 %144 %141 %144 %142 %150 = OpConstantComposite %51 %141 %144 %144 %142 %151 = OpConstantComposite %51 %144 %144 %144 %142 %152 = OpConstantComposite %51 %142 %141 %141 %142 %153 = OpConstantComposite %51 %141 %142 %141 %142 %154 = OpConstantComposite %51 %142 %142 %141 %142 %155 = OpConstantComposite %51 %141 %141 %142 %142 %156 = OpConstantComposite %51 %142 %141 %142 %142 %157 = OpConstantComposite %51 %141 %142 %142 %142 %158 = OpConstantComposite %51 %142 %142 %142 %142 %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158 %162 = OpTypePointer Function %140 %164 = OpTypePointer Function %51 %229 = OpUndef %7 %354 = OpConstant %47 0 %355 = OpConstantComposite %51 %354 %354 %354 %354 %356 = OpConstantComposite %140 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %4 = OpFunction %2 None %3 %5 = OpLabel %163 = OpVariable %162 Function %54 = OpLoad %51 %53 %55 = OpVectorShuffle %48 %54 %54 0 1 %60 = OpAccessChain %59 %58 %18 %61 = OpLoad %48 %60 %62 = OpFDiv %48 %55 %61 %66 = OpCompositeExtract %47 %62 0 %68 = OpFMul %47 %66 %67 %69 = OpConvertFToS %6 %68 %71 = OpCompositeExtract %47 %62 1 %72 = OpFMul %47 %71 %67 %73 = OpConvertFToS %6 %72 %79 = OpBitwiseAnd %6 %69 %78 %83 = OpBitwiseAnd %6 %73 %82 %84 = OpBitwiseOr %6 %79 %83 %88 = OpBitwiseAnd %6 %73 %78 %91 = OpBitwiseAnd %6 %69 %82 %92 = OpBitwiseOr %6 %88 %91 %96 = OpIMul %6 %84 %95 %98 = OpIAdd %6 %96 %92 %99 = OpCompositeConstruct %7 %98 %18 OpBranch %101 %101 = OpLabel %221 = OpPhi %7 %99 %5 %210 %104 %220 = OpPhi %6 %18 %5 %113 %104 %108 = OpSLessThan %19 %220 %107 OpLoopMerge %103 %104 None OpBranchConditional %108 %102 %103 %102 = OpLabel %170 = OpCompositeExtract %6 %221 0 %171 = OpSGreaterThan %19 %170 %18 OpSelectionMerge %176 None OpBranchConditional %171 %172 %176 %172 = OpLabel %174 = OpCompositeExtract %6 %221 1 %175 = OpISub %6 %174 %26 %202 = OpCompositeInsert %7 %175 %221 1 OpBranch %176 %176 = OpLabel %224 = OpPhi %7 %221 %102 %202 %172 %178 = OpCompositeExtract %6 %224 0 %179 = OpSLessThan %19 %178 %18 OpSelectionMerge %184 None OpBranchConditional %179 %180 %184 %180 = OpLabel %182 = OpCompositeExtract %6 %224 1 %183 = OpIAdd %6 %182 %26 %206 = OpCompositeInsert %7 %183 %224 1 OpBranch %184 %184 = OpLabel %225 = OpPhi %7 %224 %176 %206 %180 %186 = OpCompositeExtract %6 %225 1 %187 = OpSDiv %6 %186 %38 %189 = OpCompositeExtract %6 %225 0 %190 = OpIAdd %6 %189 %187 %210 = OpCompositeInsert %7 %190 %225 0 OpBranch %104 %104 = OpLabel %113 = OpIAdd %6 %220 %26 OpBranch %101 %103 = OpLabel %115 = OpCompositeExtract %6 %221 0 %116 = OpSLessThan %19 %115 %18 OpSelectionMerge %118 None OpBranchConditional %116 %117 %118 %117 = OpLabel %121 = OpSNegate %6 %115 %214 = OpCompositeInsert %7 %121 %229 0 OpBranch %118 %118 = OpLabel %223 = OpPhi %7 %221 %103 %214 %117 OpBranch %123 %123 = OpLabel %222 = OpPhi %7 %223 %118 %218 %124 %129 = OpCompositeExtract %6 %222 0 %131 = OpSGreaterThan %19 %129 %130 OpLoopMerge %125 %124 None OpBranchConditional %131 %124 %125 %124 = OpLabel %135 = OpISub %6 %129 %132 %218 = OpCompositeInsert %7 %135 %229 0 OpBranch %123 %125 = OpLabel OpStore %163 %159 %398 = OpLoad %140 %163 OpStore %163 %356 OpStore %163 %398 %165 = OpAccessChain %164 %163 %129 %166 = OpLoad %51 %165 OpStore %138 %166 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 EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005