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: Fragment shader with 1-iteration loop and smoothstep 21 22# The test passes because the loop exits immediately and red is written 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# void main() 35# { 36# while(true) 37# { 38# if(true) 39# { 40# break; 41# } 42# int GLF_live9r; 43# vec2(1.0)[clamp(GLF_live9r, 0, 1)]; 44# } 45# float g = 3.0; 46# _GLF_color = vec4(smoothstep(0.0, 1.0, g), 0.0, 0.0, 1.0); 47# } 48SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 49; SPIR-V 50; Version: 1.0 51; Generator: Khronos Glslang Reference Front End; 7 52; Bound: 37 53; Schema: 0 54 OpCapability Shader 55 %1 = OpExtInstImport "GLSL.std.450" 56 OpMemoryModel Logical GLSL450 57 OpEntryPoint Fragment %4 "main" %32 58 OpExecutionMode %4 OriginUpperLeft 59 OpSource ESSL 310 60 OpName %4 "main" 61 OpName %22 "GLF_live9r" 62 OpName %28 "g" 63 OpName %32 "_GLF_color" 64 OpDecorate %32 Location 0 65 %2 = OpTypeVoid 66 %3 = OpTypeFunction %2 67 %11 = OpTypeBool 68 %12 = OpConstantTrue %11 69 %16 = OpTypeFloat 32 70 %17 = OpTypeVector %16 2 71 %18 = OpConstant %16 1 72 %19 = OpConstantComposite %17 %18 %18 73 %20 = OpTypeInt 32 1 74 %21 = OpTypePointer Function %20 75 %24 = OpConstant %20 0 76 %25 = OpConstant %20 1 77 %27 = OpTypePointer Function %16 78 %29 = OpConstant %16 3 79 %30 = OpTypeVector %16 4 80 %31 = OpTypePointer Output %30 81 %32 = OpVariable %31 Output 82 %33 = OpConstant %16 0 83 %4 = OpFunction %2 None %3 84 %5 = OpLabel 85 %22 = OpVariable %21 Function 86 %28 = OpVariable %27 Function 87 OpBranch %6 88 %6 = OpLabel 89 OpLoopMerge %8 %9 None 90 OpBranch %10 91 %10 = OpLabel 92 OpBranchConditional %12 %7 %8 93 %7 = OpLabel 94 OpSelectionMerge %14 None 95 OpBranchConditional %12 %13 %14 96 %13 = OpLabel 97 OpBranch %8 98 %14 = OpLabel 99 %23 = OpLoad %20 %22 100 %26 = OpExtInst %20 %1 SClamp %23 %24 %25 101 OpBranch %9 102 %9 = OpLabel 103 OpBranch %6 104 %8 = OpLabel 105 OpStore %28 %29 106 %34 = OpLoad %16 %28 107 %35 = OpExtInst %16 %1 SmoothStep %33 %18 %34 108 %36 = OpCompositeConstruct %30 %35 %33 %33 %18 109 OpStore %32 %36 110 OpReturn 111 OpFunctionEnd 112END 113 114# uniforms for variant 115 116 117BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 118 119PIPELINE graphics variant_pipeline 120 ATTACH variant_vertex_shader 121 ATTACH variant_fragment_shader 122 FRAMEBUFFER_SIZE 256 256 123 BIND BUFFER variant_framebuffer AS color LOCATION 0 124END 125CLEAR_COLOR variant_pipeline 0 0 0 255 126 127CLEAR variant_pipeline 128RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 129 130EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 131