1#!amber 2 3# Copyright 2019 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 GraphicsFuzz. 19 20# Short description: A fragment shader with an arr value set to itself squared 21 22# The test passes because shader always writes red. 23 24SHADER vertex variant_vertex_shader PASSTHROUGH 25 26# variant_fragment_shader is derived from the following GLSL: 27# #version 310 es 28# precision highp float; 29# 30# precision highp int; 31# 32# layout(location = 0) out vec4 _GLF_color; 33# 34# layout(set = 0, binding = 0) uniform buf0 { 35# vec2 resolution; 36# }; 37# struct QuicksortObject { 38# int numbers[10]; 39# } ; 40# 41# QuicksortObject obj; 42# 43# void swap(int i, int j) 44# { 45# int temp = obj.numbers[i]; 46# obj.numbers[i] = obj.numbers[j]; 47# obj.numbers[j] = temp; 48# } 49# int performPartition(int l, int h) 50# { 51# int pivot = obj.numbers[h]; 52# int i = (l - 1); 53# for( 54# int j = l; 55# j <= h - 1; 56# j ++ 57# ) 58# { 59# if(obj.numbers[j] <= pivot) 60# { 61# i ++; 62# swap(i, j); 63# } 64# } 65# swap(i + 1, h); 66# return (i + 1); 67# } 68# void quicksort() 69# { 70# int l = 0, h = 9; 71# int stack[10]; 72# int top = - 1; 73# stack[++ top] = l; 74# stack[++ top] = h; 75# while(top >= 0) 76# { 77# h = stack[top --]; 78# l = stack[top --]; 79# int p = performPartition(l, h); 80# if(p - 1 > l) 81# { 82# stack[++ top] = l; 83# stack[++ top] = p - 1; 84# } 85# if(p + 1 < h) 86# { 87# stack[++ top] = p + 1; 88# stack[++ top] = h; 89# } 90# } 91# } 92# void main() 93# { 94# for( 95# int i = 0; 96# i < 10; 97# i ++ 98# ) 99# { 100# obj.numbers[i] = (10 - i); 101# obj.numbers[i] = obj.numbers[i] * obj.numbers[i]; 102# } 103# quicksort(); 104# 105# if (obj.numbers[0] < obj.numbers[4]) 106# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); 107# else 108# _GLF_color = vec4(0.0, 1.0, 0.0, 1.0); 109# 110# } 111SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 112; SPIR-V 113; Version: 1.0 114; Generator: Khronos Glslang Reference Front End; 8 115; Bound: 198 116; Schema: 0 117 OpCapability Shader 118 %1 = OpExtInstImport "GLSL.std.450" 119 OpMemoryModel Logical GLSL450 120 OpEntryPoint Fragment %4 "main" %188 121 OpExecutionMode %4 OriginUpperLeft 122 OpSource ESSL 310 123 OpName %4 "main" 124 OpName %11 "swap(i1;i1;" 125 OpName %9 "i" 126 OpName %10 "j" 127 OpName %16 "performPartition(i1;i1;" 128 OpName %14 "l" 129 OpName %15 "h" 130 OpName %18 "quicksort(" 131 OpName %20 "temp" 132 OpName %24 "QuicksortObject" 133 OpMemberName %24 0 "numbers" 134 OpName %26 "obj" 135 OpName %40 "pivot" 136 OpName %44 "i" 137 OpName %48 "j" 138 OpName %69 "param" 139 OpName %71 "param" 140 OpName %78 "param" 141 OpName %79 "param" 142 OpName %86 "l" 143 OpName %87 "h" 144 OpName %89 "top" 145 OpName %92 "stack" 146 OpName %116 "p" 147 OpName %117 "param" 148 OpName %119 "param" 149 OpName %152 "i" 150 OpName %188 "_GLF_color" 151 OpName %195 "buf0" 152 OpMemberName %195 0 "resolution" 153 OpName %197 "" 154 OpDecorate %188 Location 0 155 OpMemberDecorate %195 0 Offset 0 156 OpDecorate %195 Block 157 OpDecorate %197 DescriptorSet 0 158 OpDecorate %197 Binding 0 159 %2 = OpTypeVoid 160 %3 = OpTypeFunction %2 161 %6 = OpTypeInt 32 1 162 %7 = OpTypePointer Function %6 163 %8 = OpTypeFunction %2 %7 %7 164 %13 = OpTypeFunction %6 %7 %7 165 %21 = OpTypeInt 32 0 166 %22 = OpConstant %21 10 167 %23 = OpTypeArray %6 %22 168 %24 = OpTypeStruct %23 169 %25 = OpTypePointer Private %24 170 %26 = OpVariable %25 Private 171 %27 = OpConstant %6 0 172 %29 = OpTypePointer Private %6 173 %46 = OpConstant %6 1 174 %58 = OpTypeBool 175 %88 = OpConstant %6 9 176 %90 = OpConstant %6 -1 177 %91 = OpTypePointer Function %23 178 %159 = OpConstant %6 10 179 %179 = OpConstant %6 4 180 %185 = OpTypeFloat 32 181 %186 = OpTypeVector %185 4 182 %187 = OpTypePointer Output %186 183 %188 = OpVariable %187 Output 184 %189 = OpConstant %185 1 185 %190 = OpConstant %185 0 186 %191 = OpConstantComposite %186 %189 %190 %190 %189 187 %193 = OpConstantComposite %186 %190 %189 %190 %189 188 %194 = OpTypeVector %185 2 189 %195 = OpTypeStruct %194 190 %196 = OpTypePointer Uniform %195 191 %197 = OpVariable %196 Uniform 192 %4 = OpFunction %2 None %3 193 %5 = OpLabel 194 %152 = OpVariable %7 Function 195 OpStore %152 %27 196 OpBranch %153 197 %153 = OpLabel 198 OpLoopMerge %155 %156 None 199 OpBranch %157 200 %157 = OpLabel 201 %158 = OpLoad %6 %152 202 %160 = OpSLessThan %58 %158 %159 203 OpBranchConditional %160 %154 %155 204 %154 = OpLabel 205 %161 = OpLoad %6 %152 206 %162 = OpLoad %6 %152 207 %163 = OpISub %6 %159 %162 208 %164 = OpAccessChain %29 %26 %27 %161 209 OpStore %164 %163 210 %165 = OpLoad %6 %152 211 %166 = OpLoad %6 %152 212 %167 = OpAccessChain %29 %26 %27 %166 213 %168 = OpLoad %6 %167 214 %169 = OpLoad %6 %152 215 %170 = OpAccessChain %29 %26 %27 %169 216 %171 = OpLoad %6 %170 217 %172 = OpIMul %6 %168 %171 218 %173 = OpAccessChain %29 %26 %27 %165 219 OpStore %173 %172 220 OpBranch %156 221 %156 = OpLabel 222 %174 = OpLoad %6 %152 223 %175 = OpIAdd %6 %174 %46 224 OpStore %152 %175 225 OpBranch %153 226 %155 = OpLabel 227 %176 = OpFunctionCall %2 %18 228 %177 = OpAccessChain %29 %26 %27 %27 229 %178 = OpLoad %6 %177 230 %180 = OpAccessChain %29 %26 %27 %179 231 %181 = OpLoad %6 %180 232 %182 = OpSLessThan %58 %178 %181 233 OpSelectionMerge %184 None 234 OpBranchConditional %182 %183 %192 235 %183 = OpLabel 236 OpStore %188 %191 237 OpBranch %184 238 %192 = OpLabel 239 OpStore %188 %193 240 OpBranch %184 241 %184 = OpLabel 242 OpReturn 243 OpFunctionEnd 244 %11 = OpFunction %2 None %8 245 %9 = OpFunctionParameter %7 246 %10 = OpFunctionParameter %7 247 %12 = OpLabel 248 %20 = OpVariable %7 Function 249 %28 = OpLoad %6 %9 250 %30 = OpAccessChain %29 %26 %27 %28 251 %31 = OpLoad %6 %30 252 OpStore %20 %31 253 %32 = OpLoad %6 %9 254 %33 = OpLoad %6 %10 255 %34 = OpAccessChain %29 %26 %27 %33 256 %35 = OpLoad %6 %34 257 %36 = OpAccessChain %29 %26 %27 %32 258 OpStore %36 %35 259 %37 = OpLoad %6 %10 260 %38 = OpLoad %6 %20 261 %39 = OpAccessChain %29 %26 %27 %37 262 OpStore %39 %38 263 OpReturn 264 OpFunctionEnd 265 %16 = OpFunction %6 None %13 266 %14 = OpFunctionParameter %7 267 %15 = OpFunctionParameter %7 268 %17 = OpLabel 269 %40 = OpVariable %7 Function 270 %44 = OpVariable %7 Function 271 %48 = OpVariable %7 Function 272 %69 = OpVariable %7 Function 273 %71 = OpVariable %7 Function 274 %78 = OpVariable %7 Function 275 %79 = OpVariable %7 Function 276 %41 = OpLoad %6 %15 277 %42 = OpAccessChain %29 %26 %27 %41 278 %43 = OpLoad %6 %42 279 OpStore %40 %43 280 %45 = OpLoad %6 %14 281 %47 = OpISub %6 %45 %46 282 OpStore %44 %47 283 %49 = OpLoad %6 %14 284 OpStore %48 %49 285 OpBranch %50 286 %50 = OpLabel 287 OpLoopMerge %52 %53 None 288 OpBranch %54 289 %54 = OpLabel 290 %55 = OpLoad %6 %48 291 %56 = OpLoad %6 %15 292 %57 = OpISub %6 %56 %46 293 %59 = OpSLessThanEqual %58 %55 %57 294 OpBranchConditional %59 %51 %52 295 %51 = OpLabel 296 %60 = OpLoad %6 %48 297 %61 = OpAccessChain %29 %26 %27 %60 298 %62 = OpLoad %6 %61 299 %63 = OpLoad %6 %40 300 %64 = OpSLessThanEqual %58 %62 %63 301 OpSelectionMerge %66 None 302 OpBranchConditional %64 %65 %66 303 %65 = OpLabel 304 %67 = OpLoad %6 %44 305 %68 = OpIAdd %6 %67 %46 306 OpStore %44 %68 307 %70 = OpLoad %6 %44 308 OpStore %69 %70 309 %72 = OpLoad %6 %48 310 OpStore %71 %72 311 %73 = OpFunctionCall %2 %11 %69 %71 312 OpBranch %66 313 %66 = OpLabel 314 OpBranch %53 315 %53 = OpLabel 316 %74 = OpLoad %6 %48 317 %75 = OpIAdd %6 %74 %46 318 OpStore %48 %75 319 OpBranch %50 320 %52 = OpLabel 321 %76 = OpLoad %6 %44 322 %77 = OpIAdd %6 %76 %46 323 OpStore %78 %77 324 %80 = OpLoad %6 %15 325 OpStore %79 %80 326 %81 = OpFunctionCall %2 %11 %78 %79 327 %82 = OpLoad %6 %44 328 %83 = OpIAdd %6 %82 %46 329 OpReturnValue %83 330 OpFunctionEnd 331 %18 = OpFunction %2 None %3 332 %19 = OpLabel 333 %86 = OpVariable %7 Function 334 %87 = OpVariable %7 Function 335 %89 = OpVariable %7 Function 336 %92 = OpVariable %91 Function 337 %116 = OpVariable %7 Function 338 %117 = OpVariable %7 Function 339 %119 = OpVariable %7 Function 340 OpStore %86 %27 341 OpStore %87 %88 342 OpStore %89 %90 343 %93 = OpLoad %6 %89 344 %94 = OpIAdd %6 %93 %46 345 OpStore %89 %94 346 %95 = OpLoad %6 %86 347 %96 = OpAccessChain %7 %92 %94 348 OpStore %96 %95 349 %97 = OpLoad %6 %89 350 %98 = OpIAdd %6 %97 %46 351 OpStore %89 %98 352 %99 = OpLoad %6 %87 353 %100 = OpAccessChain %7 %92 %98 354 OpStore %100 %99 355 OpBranch %101 356 %101 = OpLabel 357 OpLoopMerge %103 %104 None 358 OpBranch %105 359 %105 = OpLabel 360 %106 = OpLoad %6 %89 361 %107 = OpSGreaterThanEqual %58 %106 %27 362 OpBranchConditional %107 %102 %103 363 %102 = OpLabel 364 %108 = OpLoad %6 %89 365 %109 = OpISub %6 %108 %46 366 OpStore %89 %109 367 %110 = OpAccessChain %7 %92 %108 368 %111 = OpLoad %6 %110 369 OpStore %87 %111 370 %112 = OpLoad %6 %89 371 %113 = OpISub %6 %112 %46 372 OpStore %89 %113 373 %114 = OpAccessChain %7 %92 %112 374 %115 = OpLoad %6 %114 375 OpStore %86 %115 376 %118 = OpLoad %6 %86 377 OpStore %117 %118 378 %120 = OpLoad %6 %87 379 OpStore %119 %120 380 %121 = OpFunctionCall %6 %16 %117 %119 381 OpStore %116 %121 382 %122 = OpLoad %6 %116 383 %123 = OpISub %6 %122 %46 384 %124 = OpLoad %6 %86 385 %125 = OpSGreaterThan %58 %123 %124 386 OpSelectionMerge %127 None 387 OpBranchConditional %125 %126 %127 388 %126 = OpLabel 389 %128 = OpLoad %6 %89 390 %129 = OpIAdd %6 %128 %46 391 OpStore %89 %129 392 %130 = OpLoad %6 %86 393 %131 = OpAccessChain %7 %92 %129 394 OpStore %131 %130 395 %132 = OpLoad %6 %89 396 %133 = OpIAdd %6 %132 %46 397 OpStore %89 %133 398 %134 = OpLoad %6 %116 399 %135 = OpISub %6 %134 %46 400 %136 = OpAccessChain %7 %92 %133 401 OpStore %136 %135 402 OpBranch %127 403 %127 = OpLabel 404 %137 = OpLoad %6 %116 405 %138 = OpIAdd %6 %137 %46 406 %139 = OpLoad %6 %87 407 %140 = OpSLessThan %58 %138 %139 408 OpSelectionMerge %142 None 409 OpBranchConditional %140 %141 %142 410 %141 = OpLabel 411 %143 = OpLoad %6 %89 412 %144 = OpIAdd %6 %143 %46 413 OpStore %89 %144 414 %145 = OpLoad %6 %116 415 %146 = OpIAdd %6 %145 %46 416 %147 = OpAccessChain %7 %92 %144 417 OpStore %147 %146 418 %148 = OpLoad %6 %89 419 %149 = OpIAdd %6 %148 %46 420 OpStore %89 %149 421 %150 = OpLoad %6 %87 422 %151 = OpAccessChain %7 %92 %149 423 OpStore %151 %150 424 OpBranch %142 425 %142 = OpLabel 426 OpBranch %104 427 %104 = OpLabel 428 OpBranch %101 429 %103 = OpLabel 430 OpReturn 431 OpFunctionEnd 432END 433 434# uniforms for variant 435 436# resolution 437BUFFER variant_resolution DATA_TYPE vec2<float> DATA 438 256.0 256.0 439END 440 441BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 442 443PIPELINE graphics variant_pipeline 444 ATTACH variant_vertex_shader 445 ATTACH variant_fragment_shader 446 FRAMEBUFFER_SIZE 256 256 447 BIND BUFFER variant_framebuffer AS color LOCATION 0 448 BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 449END 450CLEAR_COLOR variant_pipeline 0 0 0 255 451 452CLEAR variant_pipeline 453RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 454 455EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 456