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 diff: mutate var, comp extract/construct 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: 138 34; Schema: 0 35 OpCapability Shader 36 %1 = OpExtInstImport "GLSL.std.450" 37 OpMemoryModel Logical GLSL450 38 OpEntryPoint Fragment %4 "main" %47 %76 39 OpExecutionMode %4 OriginUpperLeft 40 OpSource ESSL 320 41 OpName %4 "main" 42 OpName %47 "gl_FragCoord" 43 OpName %50 "buf0" 44 OpMemberName %50 0 "resolution" 45 OpName %52 "" 46 OpName %76 "_GLF_color" 47 OpName %104 "indexable" 48 OpDecorate %47 BuiltIn FragCoord 49 OpMemberDecorate %50 0 Offset 0 50 OpDecorate %50 Block 51 OpDecorate %52 DescriptorSet 0 52 OpDecorate %52 Binding 0 53 OpDecorate %76 Location 0 54 %2 = OpTypeVoid 55 %3 = OpTypeFunction %2 56 %6 = OpTypeInt 32 1 57 %13 = OpConstant %6 0 58 %20 = OpConstant %6 1 59 %21 = OpTypeBool 60 %28 = OpConstant %6 3 61 %33 = OpConstant %6 2 62 %41 = OpTypeFloat 32 63 %42 = OpTypeVector %41 2 64 %45 = OpTypeVector %41 4 65 %46 = OpTypePointer Input %45 66 %47 = OpVariable %46 Input 67 %50 = OpTypeStruct %42 68 %51 = OpTypePointer Uniform %50 69 %52 = OpVariable %51 Uniform 70 %53 = OpTypePointer Uniform %42 71 %58 = OpConstant %41 8 72 %62 = OpTypeInt 32 0 73 %68 = OpConstant %6 8 74 %75 = OpTypePointer Output %45 75 %76 = OpVariable %75 Output 76 %77 = OpConstant %62 16 77 %78 = OpTypeArray %45 %77 78 %79 = OpConstant %41 0 79 %80 = OpConstant %41 1 80 %81 = OpConstantComposite %45 %79 %79 %79 %80 81 %82 = OpConstant %41 0.5 82 %83 = OpConstantComposite %45 %82 %79 %79 %80 83 %84 = OpConstantComposite %45 %79 %82 %79 %80 84 %85 = OpConstantComposite %45 %82 %82 %79 %80 85 %86 = OpConstantComposite %45 %79 %79 %82 %80 86 %87 = OpConstantComposite %45 %82 %79 %82 %80 87 %88 = OpConstantComposite %45 %79 %82 %82 %80 88 %89 = OpConstantComposite %45 %82 %82 %82 %80 89 %90 = OpConstantComposite %45 %80 %79 %79 %80 90 %91 = OpConstantComposite %45 %79 %80 %79 %80 91 %92 = OpConstantComposite %45 %80 %80 %79 %80 92 %93 = OpConstantComposite %45 %79 %79 %80 %80 93 %94 = OpConstantComposite %45 %80 %79 %80 %80 94 %95 = OpConstantComposite %45 %79 %80 %80 %80 95 %96 = OpConstantComposite %45 %80 %80 %80 %80 96 %97 = OpConstantComposite %78 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96 97 %101 = OpConstant %6 16 98 %103 = OpTypePointer Function %78 99 %105 = OpTypePointer Function %45 100 %4 = OpFunction %2 None %3 101 %5 = OpLabel 102 %104 = OpVariable %103 Function 103 %48 = OpLoad %45 %47 104 %49 = OpVectorShuffle %42 %48 %48 0 1 105 %54 = OpAccessChain %53 %52 %13 106 %55 = OpLoad %42 %54 107 %56 = OpFDiv %42 %49 %55 108 %59 = OpVectorTimesScalar %42 %56 %58 109 %60 = OpExtInst %42 %1 Floor %59 110 %66 = OpCompositeExtract %41 %60 0 111 %67 = OpConvertFToS %6 %66 112 %69 = OpIMul %6 %67 %68 113 %72 = OpCompositeExtract %41 %60 1 114 %73 = OpConvertFToS %6 %72 115 %74 = OpIAdd %6 %69 %73 116 OpBranch %111 117 %111 = OpLabel 118 %135 = OpPhi %6 %13 %5 %128 %129 119 %134 = OpPhi %6 %74 %5 %137 %129 120 %114 = OpSGreaterThan %21 %134 %20 121 OpLoopMerge %130 %129 None 122 OpBranchConditional %114 %115 %130 123 %115 = OpLabel 124 %117 = OpBitwiseAnd %6 %134 %20 125 %118 = OpIEqual %21 %117 %20 126 OpSelectionMerge %126 None 127 OpBranchConditional %118 %119 %123 128 %119 = OpLabel 129 %121 = OpIMul %6 %28 %134 130 %122 = OpIAdd %6 %121 %20 131 OpBranch %126 132 %123 = OpLabel 133 %125 = OpSDiv %6 %134 %33 134 OpBranch %126 135 %126 = OpLabel 136 %137 = OpPhi %6 %122 %119 %125 %123 137 %128 = OpIAdd %6 %135 %20 138 OpBranch %129 139 %129 = OpLabel 140 OpBranch %111 141 %130 = OpLabel 142 %102 = OpSMod %6 %135 %101 143 OpStore %104 %97 144 %106 = OpAccessChain %105 %104 %102 145 %107 = OpLoad %45 %106 146 OpStore %76 %107 147 OpReturn 148 OpFunctionEnd 149END 150 151# uniforms for reference 152 153# resolution 154BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA 155 256.0 256.0 156END 157 158BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM 159 160PIPELINE graphics reference_pipeline 161 ATTACH reference_vertex_shader 162 ATTACH reference_fragment_shader 163 FRAMEBUFFER_SIZE 256 256 164 BIND BUFFER reference_framebuffer AS color LOCATION 0 165 BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 166END 167CLEAR_COLOR reference_pipeline 0 0 0 255 168 169CLEAR reference_pipeline 170RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256 171 172 173SHADER vertex variant_vertex_shader PASSTHROUGH 174 175SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 176; SPIR-V 177; Version: 1.0 178; Generator: Khronos Glslang Reference Front End; 7 179; Bound: 502 180; Schema: 0 181 OpCapability Shader 182 %1 = OpExtInstImport "GLSL.std.450" 183 OpMemoryModel Logical GLSL450 184 OpEntryPoint Fragment %4 "main" %47 %76 185 OpExecutionMode %4 OriginUpperLeft 186 OpSource ESSL 320 187 OpName %4 "main" 188 OpName %47 "gl_FragCoord" 189 OpName %50 "buf0" 190 OpMemberName %50 0 "resolution" 191 OpName %52 "" 192 OpName %76 "_GLF_color" 193 OpName %104 "indexable" 194 OpDecorate %47 BuiltIn FragCoord 195 OpMemberDecorate %50 0 Offset 0 196 OpDecorate %50 Block 197 OpDecorate %52 DescriptorSet 0 198 OpDecorate %52 Binding 0 199 OpDecorate %76 Location 0 200 %2 = OpTypeVoid 201 %3 = OpTypeFunction %2 202 %6 = OpTypeInt 32 1 203 %13 = OpConstant %6 0 204 %20 = OpConstant %6 1 205 %21 = OpTypeBool 206 %28 = OpConstant %6 3 207 %33 = OpConstant %6 2 208 %41 = OpTypeFloat 32 209 %42 = OpTypeVector %41 2 210 %45 = OpTypeVector %41 4 211 %46 = OpTypePointer Input %45 212 %47 = OpVariable %46 Input 213 %50 = OpTypeStruct %42 214 %51 = OpTypePointer Uniform %50 215 %52 = OpVariable %51 Uniform 216 %53 = OpTypePointer Uniform %42 217 %58 = OpConstant %41 8 218 %62 = OpTypeInt 32 0 219 %68 = OpConstant %6 8 220 %75 = OpTypePointer Output %45 221 %76 = OpVariable %75 Output 222 %77 = OpConstant %62 16 223 %78 = OpTypeArray %45 %77 224 %79 = OpConstant %41 0 225 %80 = OpConstant %41 1 226 %81 = OpConstantComposite %45 %79 %79 %79 %80 227 %82 = OpConstant %41 0.5 228 %83 = OpConstantComposite %45 %82 %79 %79 %80 229 %84 = OpConstantComposite %45 %79 %82 %79 %80 230 %85 = OpConstantComposite %45 %82 %82 %79 %80 231 %86 = OpConstantComposite %45 %79 %79 %82 %80 232 %87 = OpConstantComposite %45 %82 %79 %82 %80 233 %88 = OpConstantComposite %45 %79 %82 %82 %80 234 %89 = OpConstantComposite %45 %82 %82 %82 %80 235 %90 = OpConstantComposite %45 %80 %79 %79 %80 236 %91 = OpConstantComposite %45 %79 %80 %79 %80 237 %92 = OpConstantComposite %45 %80 %80 %79 %80 238 %93 = OpConstantComposite %45 %79 %79 %80 %80 239 %94 = OpConstantComposite %45 %80 %79 %80 %80 240 %95 = OpConstantComposite %45 %79 %80 %80 %80 241 %96 = OpConstantComposite %45 %80 %80 %80 %80 242 %97 = OpConstantComposite %78 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96 243 %101 = OpConstant %6 16 244 %103 = OpTypePointer Function %78 245 %105 = OpTypePointer Function %45 246 %403 = OpConstant %41 0 247 %404 = OpConstantComposite %45 %403 %403 %403 %403 248 %405 = OpConstantComposite %78 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 249 %4 = OpFunction %2 None %3 250 %5 = OpLabel 251 %104 = OpVariable %103 Function 252 %48 = OpLoad %45 %47 253 %49 = OpVectorShuffle %42 %48 %48 0 1 254 %238 = OpCompositeConstruct %45 %79 %58 %49 255 %54 = OpAccessChain %53 %52 %13 256 %55 = OpLoad %42 %54 257 %239 = OpCompositeConstruct %78 %86 %94 %88 %95 %96 %88 %88 %87 %92 %48 %86 %85 %84 %83 %91 %90 258 %56 = OpFDiv %42 %49 %55 259 %59 = OpVectorTimesScalar %42 %56 %58 260 %60 = OpExtInst %42 %1 Floor %59 261 %241 = OpCompositeConstruct %45 %59 %82 %80 262 %66 = OpCompositeExtract %41 %60 0 263 %67 = OpConvertFToS %6 %66 264 %69 = OpIMul %6 %67 %68 265 %72 = OpCompositeExtract %41 %60 1 266 %73 = OpConvertFToS %6 %72 267 %74 = OpIAdd %6 %69 %73 268 OpBranch %111 269 %111 = OpLabel 270 %135 = OpPhi %6 %13 %5 %128 %129 271 %134 = OpPhi %6 %74 %5 %137 %129 272 %114 = OpSGreaterThan %21 %134 %20 273 OpLoopMerge %130 %129 None 274 OpBranchConditional %114 %115 %130 275 %115 = OpLabel 276 %117 = OpBitwiseAnd %6 %134 %20 277 %118 = OpIEqual %21 %117 %20 278 OpSelectionMerge %126 None 279 OpBranchConditional %118 %119 %123 280 %119 = OpLabel 281 %121 = OpIMul %6 %28 %134 282 %122 = OpIAdd %6 %121 %20 283 OpBranch %126 284 %123 = OpLabel 285 %125 = OpSDiv %6 %134 %33 286 OpBranch %126 287 %126 = OpLabel 288 %137 = OpPhi %6 %122 %119 %125 %123 289 %128 = OpIAdd %6 %135 %20 290 OpBranch %129 291 %129 = OpLabel 292 OpBranch %111 293 %130 = OpLabel 294 %102 = OpSMod %6 %135 %101 295 OpStore %104 %97 296 %501 = OpLoad %78 %104 297 OpStore %104 %405 298 OpStore %104 %501 299 %248 = OpCompositeExtract %45 %239 1 300 %245 = OpCompositeConstruct %78 %87 %87 %91 %81 %87 %89 %94 %81 %91 %238 %86 %88 %87 %92 %94 %241 301 %106 = OpAccessChain %105 %104 %102 302 %107 = OpLoad %45 %106 303 OpStore %76 %107 304 OpReturn 305 OpFunctionEnd 306END 307 308# uniforms for variant 309 310# resolution 311BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA 312 256.0 256.0 313END 314 315BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 316 317PIPELINE graphics variant_pipeline 318 ATTACH variant_vertex_shader 319 ATTACH variant_fragment_shader 320 FRAMEBUFFER_SIZE 256 256 321 BIND BUFFER variant_framebuffer AS color LOCATION 0 322 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 323END 324CLEAR_COLOR variant_pipeline 0 0 0 255 325 326CLEAR variant_pipeline 327RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 328 329EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005 330