| #!amber |
| |
| # Copyright 2019 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 GraphicsFuzz. |
| |
| # Short description: Fragment shader that writes red before loop break |
| |
| # The test passes because the write of red is the only reachable write and is |
| # guaranteed to be reached, and all loops are designed to terminate after a small |
| # number of iterations. For the loop with guard '1 < z' this is guaranteed due |
| # to the runtime value of 'injected'. |
| |
| SHADER vertex variant_vertex_shader PASSTHROUGH |
| |
| # variant_fragment_shader is derived from the following GLSL: |
| # #version 310 es |
| # precision highp float; |
| # |
| # layout(location = 0) out vec4 _GLF_color; |
| # |
| # layout(set = 0, binding = 0) uniform buf0 { |
| # int injected; |
| # }; |
| # |
| # void main() |
| # { |
| # int idx = 0; |
| # mat4x3 m43 = mat4x3(1.0); |
| # float GLF_live6sums[9]; |
| # int ll_1 = 0; |
| # for(int GLF_live6rows = 2;;) |
| # { |
| # if(ll_1 >= injected) { |
| # _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); |
| # break; |
| # } |
| # ll_1++; |
| # |
| # int z = injected; |
| # int ll_2 = 0; |
| # for( |
| # int ctr = 0; |
| # ctr < 1; |
| # ctr ++ |
| # ) |
| # { |
| # if(ll_2 >= injected) { |
| # break; |
| # } |
| # ll_2++; |
| # |
| # mat4x3 tempm43; |
| # tempm43 = m43; |
| # int ll_3 = 0; |
| # for( |
| # int c = 0; |
| # 1 < z; // False, because 'injected' is 1 |
| # c ++ |
| # ) |
| # { |
| # int d = 0; |
| # tempm43[c >= 0 && c < 4 ? c : 0][d >= 0 && d < 3 ? d : 0] = 1.0; |
| # } |
| # GLF_live6sums[idx >= 0 && idx < 9 ? idx : 0] += m43[ctr][1]; |
| # } |
| # idx ++; |
| # } |
| # } |
| SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 |
| ; SPIR-V |
| ; Version: 1.0 |
| ; Generator: Khronos Glslang Reference Front End; 7 |
| ; Bound: 126 |
| ; Schema: 0 |
| OpCapability Shader |
| %1 = OpExtInstImport "GLSL.std.450" |
| OpMemoryModel Logical GLSL450 |
| OpEntryPoint Fragment %4 "main" %42 |
| OpExecutionMode %4 OriginUpperLeft |
| OpSource ESSL 310 |
| OpName %4 "main" |
| OpName %8 "idx" |
| OpName %14 "m43" |
| OpName %22 "ll_1" |
| OpName %23 "GLF_live6rows" |
| OpName %30 "buf0" |
| OpMemberName %30 0 "injected" |
| OpName %32 "" |
| OpName %42 "_GLF_color" |
| OpName %48 "z" |
| OpName %51 "ll_2" |
| OpName %52 "ctr" |
| OpName %69 "tempm43" |
| OpName %71 "ll_3" |
| OpName %72 "c" |
| OpName %80 "d" |
| OpName %105 "GLF_live6sums" |
| OpDecorate %8 RelaxedPrecision |
| OpDecorate %22 RelaxedPrecision |
| OpDecorate %23 RelaxedPrecision |
| OpDecorate %29 RelaxedPrecision |
| OpMemberDecorate %30 0 RelaxedPrecision |
| OpMemberDecorate %30 0 Offset 0 |
| OpDecorate %30 Block |
| OpDecorate %32 DescriptorSet 0 |
| OpDecorate %32 Binding 0 |
| OpDecorate %35 RelaxedPrecision |
| OpDecorate %42 Location 0 |
| OpDecorate %45 RelaxedPrecision |
| OpDecorate %47 RelaxedPrecision |
| OpDecorate %48 RelaxedPrecision |
| OpDecorate %50 RelaxedPrecision |
| OpDecorate %51 RelaxedPrecision |
| OpDecorate %52 RelaxedPrecision |
| OpDecorate %58 RelaxedPrecision |
| OpDecorate %60 RelaxedPrecision |
| OpDecorate %62 RelaxedPrecision |
| OpDecorate %67 RelaxedPrecision |
| OpDecorate %68 RelaxedPrecision |
| OpDecorate %71 RelaxedPrecision |
| OpDecorate %72 RelaxedPrecision |
| OpDecorate %78 RelaxedPrecision |
| OpDecorate %80 RelaxedPrecision |
| OpDecorate %81 RelaxedPrecision |
| OpDecorate %83 RelaxedPrecision |
| OpDecorate %87 RelaxedPrecision |
| OpDecorate %89 RelaxedPrecision |
| OpDecorate %91 RelaxedPrecision |
| OpDecorate %95 RelaxedPrecision |
| OpDecorate %99 RelaxedPrecision |
| OpDecorate %100 RelaxedPrecision |
| OpDecorate %106 RelaxedPrecision |
| OpDecorate %108 RelaxedPrecision |
| OpDecorate %112 RelaxedPrecision |
| OpDecorate %114 RelaxedPrecision |
| OpDecorate %122 RelaxedPrecision |
| OpDecorate %123 RelaxedPrecision |
| OpDecorate %124 RelaxedPrecision |
| OpDecorate %125 RelaxedPrecision |
| %2 = OpTypeVoid |
| %3 = OpTypeFunction %2 |
| %6 = OpTypeInt 32 1 |
| %7 = OpTypePointer Function %6 |
| %9 = OpConstant %6 0 |
| %10 = OpTypeFloat 32 |
| %11 = OpTypeVector %10 3 |
| %12 = OpTypeMatrix %11 4 |
| %13 = OpTypePointer Function %12 |
| %15 = OpConstant %10 1 |
| %16 = OpConstant %10 0 |
| %17 = OpConstantComposite %11 %15 %16 %16 |
| %18 = OpConstantComposite %11 %16 %15 %16 |
| %19 = OpConstantComposite %11 %16 %16 %15 |
| %20 = OpConstantComposite %11 %16 %16 %16 |
| %21 = OpConstantComposite %12 %17 %18 %19 %20 |
| %24 = OpConstant %6 2 |
| %30 = OpTypeStruct %6 |
| %31 = OpTypePointer Uniform %30 |
| %32 = OpVariable %31 Uniform |
| %33 = OpTypePointer Uniform %6 |
| %36 = OpTypeBool |
| %40 = OpTypeVector %10 4 |
| %41 = OpTypePointer Output %40 |
| %42 = OpVariable %41 Output |
| %43 = OpConstantComposite %40 %15 %16 %16 %15 |
| %46 = OpConstant %6 1 |
| %84 = OpConstant %6 4 |
| %92 = OpConstant %6 3 |
| %97 = OpTypePointer Function %10 |
| %101 = OpTypeInt 32 0 |
| %102 = OpConstant %101 9 |
| %103 = OpTypeArray %10 %102 |
| %104 = OpTypePointer Function %103 |
| %109 = OpConstant %6 9 |
| %115 = OpConstant %101 1 |
| %4 = OpFunction %2 None %3 |
| %5 = OpLabel |
| %8 = OpVariable %7 Function |
| %14 = OpVariable %13 Function |
| %22 = OpVariable %7 Function |
| %23 = OpVariable %7 Function |
| %48 = OpVariable %7 Function |
| %51 = OpVariable %7 Function |
| %52 = OpVariable %7 Function |
| %69 = OpVariable %13 Function |
| %71 = OpVariable %7 Function |
| %72 = OpVariable %7 Function |
| %80 = OpVariable %7 Function |
| %105 = OpVariable %104 Function |
| OpStore %8 %9 |
| OpStore %14 %21 |
| OpStore %22 %9 |
| OpStore %23 %24 |
| OpBranch %25 |
| %25 = OpLabel |
| OpLoopMerge %27 %28 None |
| OpBranch %26 |
| %26 = OpLabel |
| %29 = OpLoad %6 %22 |
| %34 = OpAccessChain %33 %32 %9 |
| %35 = OpLoad %6 %34 |
| %37 = OpSGreaterThanEqual %36 %29 %35 |
| OpSelectionMerge %39 None |
| OpBranchConditional %37 %38 %39 |
| %38 = OpLabel |
| OpStore %42 %43 |
| OpBranch %27 |
| %39 = OpLabel |
| %45 = OpLoad %6 %22 |
| %47 = OpIAdd %6 %45 %46 |
| OpStore %22 %47 |
| %49 = OpAccessChain %33 %32 %9 |
| %50 = OpLoad %6 %49 |
| OpStore %48 %50 |
| OpStore %51 %9 |
| OpStore %52 %9 |
| OpBranch %53 |
| %53 = OpLabel |
| OpLoopMerge %55 %56 None |
| OpBranch %57 |
| %57 = OpLabel |
| %58 = OpLoad %6 %52 |
| %59 = OpSLessThan %36 %58 %46 |
| OpBranchConditional %59 %54 %55 |
| %54 = OpLabel |
| %60 = OpLoad %6 %51 |
| %61 = OpAccessChain %33 %32 %9 |
| %62 = OpLoad %6 %61 |
| %63 = OpSGreaterThanEqual %36 %60 %62 |
| OpSelectionMerge %65 None |
| OpBranchConditional %63 %64 %65 |
| %64 = OpLabel |
| OpBranch %55 |
| %65 = OpLabel |
| %67 = OpLoad %6 %51 |
| %68 = OpIAdd %6 %67 %46 |
| OpStore %51 %68 |
| %70 = OpLoad %12 %14 |
| OpStore %69 %70 |
| OpStore %71 %9 |
| OpStore %72 %9 |
| OpBranch %73 |
| %73 = OpLabel |
| OpLoopMerge %75 %76 None |
| OpBranch %77 |
| %77 = OpLabel |
| %78 = OpLoad %6 %48 |
| %79 = OpSLessThan %36 %46 %78 |
| OpBranchConditional %79 %74 %75 |
| %74 = OpLabel |
| OpStore %80 %9 |
| %81 = OpLoad %6 %72 |
| %82 = OpSGreaterThanEqual %36 %81 %9 |
| %83 = OpLoad %6 %72 |
| %85 = OpSLessThan %36 %83 %84 |
| %86 = OpLogicalAnd %36 %82 %85 |
| %87 = OpLoad %6 %72 |
| %88 = OpSelect %6 %86 %87 %9 |
| %89 = OpLoad %6 %80 |
| %90 = OpSGreaterThanEqual %36 %89 %9 |
| %91 = OpLoad %6 %80 |
| %93 = OpSLessThan %36 %91 %92 |
| %94 = OpLogicalAnd %36 %90 %93 |
| %95 = OpLoad %6 %80 |
| %96 = OpSelect %6 %94 %95 %9 |
| %98 = OpAccessChain %97 %69 %88 %96 |
| OpStore %98 %15 |
| OpBranch %76 |
| %76 = OpLabel |
| %99 = OpLoad %6 %72 |
| %100 = OpIAdd %6 %99 %46 |
| OpStore %72 %100 |
| OpBranch %73 |
| %75 = OpLabel |
| %106 = OpLoad %6 %8 |
| %107 = OpSGreaterThanEqual %36 %106 %9 |
| %108 = OpLoad %6 %8 |
| %110 = OpSLessThan %36 %108 %109 |
| %111 = OpLogicalAnd %36 %107 %110 |
| %112 = OpLoad %6 %8 |
| %113 = OpSelect %6 %111 %112 %9 |
| %114 = OpLoad %6 %52 |
| %116 = OpAccessChain %97 %14 %114 %115 |
| %117 = OpLoad %10 %116 |
| %118 = OpAccessChain %97 %105 %113 |
| %119 = OpLoad %10 %118 |
| %120 = OpFAdd %10 %119 %117 |
| %121 = OpAccessChain %97 %105 %113 |
| OpStore %121 %120 |
| OpBranch %56 |
| %56 = OpLabel |
| %122 = OpLoad %6 %52 |
| %123 = OpIAdd %6 %122 %46 |
| OpStore %52 %123 |
| OpBranch %53 |
| %55 = OpLabel |
| %124 = OpLoad %6 %8 |
| %125 = OpIAdd %6 %124 %46 |
| OpStore %8 %125 |
| OpBranch %28 |
| %28 = OpLabel |
| OpBranch %25 |
| %27 = OpLabel |
| OpReturn |
| OpFunctionEnd |
| END |
| |
| # uniforms for variant |
| |
| # injected |
| BUFFER variant_injected DATA_TYPE int32 DATA |
| 1 |
| END |
| |
| BUFFER framebuffer FORMAT B8G8R8A8_UNORM |
| |
| PIPELINE graphics gfz_pipeline |
| ATTACH variant_vertex_shader |
| ATTACH variant_fragment_shader |
| FRAMEBUFFER_SIZE 256 256 |
| BIND BUFFER framebuffer AS color LOCATION 0 |
| BIND BUFFER variant_injected AS uniform DESCRIPTOR_SET 0 BINDING 0 |
| END |
| CLEAR_COLOR gfz_pipeline 0 0 0 255 |
| |
| CLEAR gfz_pipeline |
| RUN gfz_pipeline DRAW_RECT POS 0 0 SIZE 256 256 |
| EXPECT framebuffer IDX 0 0 SIZE 256 256 EQ_RGB 255 0 0 |