blob: b7fb85cdf230025520cf7fa7c0f3184ebba384f7 [file] [log] [blame]
# Copyright 2018 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.
# A fragment shader that uses FragCoord and somewhat complex control flow.
# Derived from the following GLSL fragment shader.
# We check that the top-left pixel is red. The test passes because _GLF_color is
# initially set to red, all other writes to _GLF_color write red, and the discard
# statement only executes for pixels with an x coordinate >= 180.
# #version 310 es
#
# precision highp float;
# precision highp int;
#
# layout(location=0) out vec4 _GLF_color;
#
# void main() {
# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
# for (int i = 0; i < 1; i++) {
# if (1.0 < gl_FragCoord.x) {
# break;
# }
# if (gl_FragCoord.x < 0.0) {
# return;
# }
# }
# do {
# if (gl_FragCoord.x < 40.0) {
# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
# } else {
# if (gl_FragCoord.x < 140.0) {
# } else {
# for (int j = 1; j > 0; j--) {
# if (gl_FragCoord.x < 160.0) {
# for (int k = 1; k > 0; k--) {
# if (gl_FragCoord.y < 0.0) {
# } else {
# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
# }
# }
# } else {
# if (gl_FragCoord.x < 180.0) {
# for (int l = 1; l != 0; l--) {
# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
# }
# } else {
# if (gl_FragCoord.x < 180.0) {
# for (int m = 0; m != 1; m++) {
# for (int n = 0; n < 1; n++) {
# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
# }
# }
# vec4 backup;
# for (int o = 1; o != 0; o--) {
# backup = vec4(1.0, 0.0, 0.0, 1.0);
# }
# _GLF_color = backup;
# } else {
# discard;
# }
# }
# }
# }
# }
# return;
# }
# } while (false);
# }
[vertex shader passthrough]
[fragment shader spirv]
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 201
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
OpExecutionMode %main OriginUpperLeft
OpSource ESSL 310
OpName %main "main"
OpName %_GLF_color "_GLF_color"
OpName %gl_FragCoord "gl_FragCoord"
OpDecorate %_GLF_color Location 0
OpDecorate %gl_FragCoord BuiltIn FragCoord
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%_GLF_color = OpVariable %_ptr_Output_v4float Output
%float_1 = OpConstant %float 1
%float_0 = OpConstant %float 0
%12 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%bool = OpTypeBool
%_ptr_Input_v4float = OpTypePointer Input %v4float
%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
%uint = OpTypeInt 32 0
%uint_0 = OpConstant %uint 0
%_ptr_Input_float = OpTypePointer Input %float
%float_40 = OpConstant %float 40
%float_140 = OpConstant %float 140
%float_160 = OpConstant %float 160
%uint_1 = OpConstant %uint 1
%float_180 = OpConstant %float 180
%false = OpConstantFalse %bool
%true = OpConstantTrue %bool
%181 = OpUndef %v4float
%main = OpFunction %void None %3
%5 = OpLabel
OpBranch %157
%157 = OpLabel
OpStore %_GLF_color %12
OpLoopMerge %156 %159 None
OpBranch %17
%17 = OpLabel
%167 = OpPhi %int %int_0 %157 %44 %41
%25 = OpSLessThan %bool %167 %int_1
OpLoopMerge %19 %41 None
OpBranchConditional %25 %18 %19
%18 = OpLabel
%31 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
%32 = OpLoad %float %31
%33 = OpFOrdLessThan %bool %float_1 %32
OpSelectionMerge %35 None
OpBranchConditional %33 %34 %35
%34 = OpLabel
OpBranch %19
%35 = OpLabel
%39 = OpFOrdLessThan %bool %32 %float_0
OpSelectionMerge %41 None
OpBranchConditional %39 %40 %41
%40 = OpLabel
OpBranch %19
%41 = OpLabel
%44 = OpIAdd %int %167 %int_1
OpBranch %17
%19 = OpLabel
%168 = OpPhi %bool %false %17 %false %34 %true %40
OpSelectionMerge %163 None
OpBranchConditional %168 %156 %163
%163 = OpLabel
OpBranch %45
%45 = OpLabel
OpLoopMerge %47 %53 None
OpBranch %46
%46 = OpLabel
%49 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
%50 = OpLoad %float %49
%52 = OpFOrdLessThan %bool %50 %float_40
OpSelectionMerge %53 None
OpBranchConditional %52 %53 %55
%53 = OpLabel
OpStore %_GLF_color %12
OpBranchConditional %false %45 %47
%55 = OpLabel
%59 = OpFOrdLessThan %bool %50 %float_140
OpSelectionMerge %61 None
OpBranchConditional %59 %60 %62
%60 = OpLabel
OpBranch %61
%62 = OpLabel
OpBranch %64
%64 = OpLabel
%176 = OpPhi %v4float %181 %62 %197 %76
%171 = OpPhi %int %int_1 %62 %153 %76
%70 = OpSGreaterThan %bool %171 %int_0
OpLoopMerge %66 %76 None
OpBranchConditional %70 %65 %66
%65 = OpLabel
%74 = OpFOrdLessThan %bool %50 %float_160
OpSelectionMerge %76 None
OpBranchConditional %74 %75 %94
%75 = OpLabel
OpBranch %78
%78 = OpLabel
%185 = OpPhi %int %int_1 %75 %93 %90
%84 = OpSGreaterThan %bool %185 %int_0
OpLoopMerge %80 %90 None
OpBranchConditional %84 %79 %80
%79 = OpLabel
%86 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
%87 = OpLoad %float %86
%88 = OpFOrdLessThan %bool %87 %float_0
OpSelectionMerge %90 None
OpBranchConditional %88 %89 %91
%89 = OpLabel
OpBranch %90
%91 = OpLabel
OpStore %_GLF_color %12
OpBranch %90
%90 = OpLabel
%93 = OpISub %int %185 %int_1
OpBranch %78
%80 = OpLabel
OpBranch %76
%94 = OpLabel
%98 = OpFOrdLessThan %bool %50 %float_180
OpSelectionMerge %100 None
OpBranchConditional %98 %99 %111
%99 = OpLabel
OpBranch %102
%102 = OpLabel
%184 = OpPhi %int %int_1 %99 %110 %103
%108 = OpINotEqual %bool %184 %int_0
OpLoopMerge %104 %103 None
OpBranchConditional %108 %103 %104
%103 = OpLabel
OpStore %_GLF_color %12
%110 = OpISub %int %184 %int_1
OpBranch %102
%104 = OpLabel
OpBranch %100
%111 = OpLabel
OpSelectionMerge %116 None
OpBranchConditional %98 %115 %150
%115 = OpLabel
OpBranch %118
%118 = OpLabel
%172 = OpPhi %int %int_0 %115 %136 %128
%124 = OpINotEqual %bool %172 %int_1
OpLoopMerge %120 %128 None
OpBranchConditional %124 %119 %120
%119 = OpLabel
OpBranch %126
%126 = OpLabel
%182 = OpPhi %int %int_0 %119 %134 %127
%132 = OpSLessThan %bool %182 %int_1
OpLoopMerge %128 %127 None
OpBranchConditional %132 %127 %128
%127 = OpLabel
OpStore %_GLF_color %12
%134 = OpIAdd %int %182 %int_1
OpBranch %126
%128 = OpLabel
%136 = OpIAdd %int %172 %int_1
OpBranch %118
%120 = OpLabel
OpBranch %138
%138 = OpLabel
%174 = OpPhi %v4float %176 %120 %12 %139
%173 = OpPhi %int %int_1 %120 %148 %139
%144 = OpINotEqual %bool %173 %int_0
OpLoopMerge %140 %139 None
OpBranchConditional %144 %139 %140
%139 = OpLabel
%148 = OpISub %int %173 %int_1
OpBranch %138
%140 = OpLabel
OpStore %_GLF_color %174
OpBranch %116
%150 = OpLabel
OpKill
%116 = OpLabel
OpBranch %100
%100 = OpLabel
%200 = OpPhi %v4float %176 %104 %174 %116
OpBranch %76
%76 = OpLabel
%197 = OpPhi %v4float %176 %80 %200 %100
%153 = OpISub %int %171 %int_1
OpBranch %64
%66 = OpLabel
OpBranch %61
%61 = OpLabel
OpBranch %47
%47 = OpLabel
%194 = OpPhi %bool %true %61 %168 %53
OpSelectionMerge %165 None
OpBranchConditional %194 %156 %165
%165 = OpLabel
OpBranch %156
%159 = OpLabel
OpBranch %157
%156 = OpLabel
OpReturn
OpFunctionEnd
[test]
draw rect -1 -1 2 2
probe rgba (0, 0) (1, 0, 0, 1)