3 # Copyright 2020 Google LLC
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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.
18 # A test for a coverage-gap found by the GraphicsFuzz project.
20 # Short description: A fragment shader that covers specific NIR code paths
22 # The test passes because the shader always writes red.
24 SHADER vertex variant_vertex_shader PASSTHROUGH
26 # variant_fragment_shader is derived from the following GLSL:
28 # #define _int_1 _GLF_uniform_int_values[0]
29 # #define _float_0_4 _GLF_uniform_float_values[0]
30 # #define _float_256_0 _GLF_uniform_float_values[1]
31 # #define _float_1_0 _GLF_uniform_float_values[2]
32 # #define _float_0_0 _GLF_uniform_float_values[3]
34 # precision highp int;
35 # precision highp float;
37 # // Contents of _GLF_uniform_int_values: 1
38 # layout(set = 0, binding = 0) uniform buf0
40 # int _GLF_uniform_int_values[1];
42 # // Contents of _GLF_uniform_float_values: [0.4, 256.0, 1.0, 0.0]
43 # layout(set = 0, binding = 1) uniform buf1
45 # float _GLF_uniform_float_values[4];
47 # layout(location = 0) out vec4 _GLF_color;
52 # if(gl_FragCoord.x * _float_256_0 > _float_0_4)
54 # ivec2 icoord = ivec2(((gl_FragCoord.xy * _float_256_0) - vec2(_float_0_4, _float_1_0)));
55 # _GLF_color = vec4(_float_1_0, _float_0_0, icoord.x * icoord.y != _int_1 ? _float_0_0 : _float_1_0, _int_1);
59 # ivec2 icoord = ivec2(((gl_FragCoord.xy * _float_256_0) - vec2(_float_0_4, _float_1_0)));
60 # _GLF_color = vec4(_float_0_0, _float_0_0, icoord.x, _float_0_0);
63 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
66 ; Generator: Khronos Glslang Reference Front End; 10
70 %1 = OpExtInstImport "GLSL.std.450"
71 OpMemoryModel Logical GLSL450
72 OpEntryPoint Fragment %4 "main" %9 %51
73 OpExecutionMode %4 OriginUpperLeft
76 OpName %9 "gl_FragCoord"
78 OpMemberName %17 0 "_GLF_uniform_float_values"
81 OpName %51 "_GLF_color"
83 OpMemberName %65 0 "_GLF_uniform_int_values"
86 OpDecorate %9 BuiltIn FragCoord
87 OpDecorate %16 ArrayStride 16
88 OpMemberDecorate %17 0 Offset 0
90 OpDecorate %19 DescriptorSet 0
91 OpDecorate %19 Binding 1
92 OpDecorate %51 Location 0
93 OpDecorate %64 ArrayStride 16
94 OpMemberDecorate %65 0 Offset 0
96 OpDecorate %67 DescriptorSet 0
97 OpDecorate %67 Binding 0
99 %3 = OpTypeFunction %2
101 %7 = OpTypeVector %6 4
102 %8 = OpTypePointer Input %7
103 %9 = OpVariable %8 Input
105 %11 = OpConstant %10 0
106 %12 = OpTypePointer Input %6
107 %15 = OpConstant %10 4
108 %16 = OpTypeArray %6 %15
109 %17 = OpTypeStruct %16
110 %18 = OpTypePointer Uniform %17
111 %19 = OpVariable %18 Uniform
113 %21 = OpConstant %20 0
114 %22 = OpConstant %20 1
115 %23 = OpTypePointer Uniform %6
117 %33 = OpTypeVector %20 2
118 %34 = OpTypePointer Function %33
119 %36 = OpTypeVector %6 2
120 %44 = OpConstant %20 2
121 %50 = OpTypePointer Output %7
122 %51 = OpVariable %50 Output
123 %54 = OpConstant %20 3
124 %57 = OpTypePointer Function %20
125 %60 = OpConstant %10 1
126 %64 = OpTypeArray %20 %60
127 %65 = OpTypeStruct %64
128 %66 = OpTypePointer Uniform %65
129 %67 = OpVariable %66 Uniform
130 %68 = OpTypePointer Uniform %20
131 %72 = OpTypePointer Function %6
132 %4 = OpFunction %2 None %3
134 %35 = OpVariable %34 Function
135 %73 = OpVariable %72 Function
136 %87 = OpVariable %34 Function
137 %13 = OpAccessChain %12 %9 %11
139 %24 = OpAccessChain %23 %19 %21 %22
141 %26 = OpFMul %6 %14 %25
142 %27 = OpAccessChain %23 %19 %21 %21
144 %30 = OpFOrdGreaterThan %29 %26 %28
145 OpSelectionMerge %32 None
146 OpBranchConditional %30 %31 %86
149 %38 = OpVectorShuffle %36 %37 %37 0 1
150 %39 = OpAccessChain %23 %19 %21 %22
152 %41 = OpVectorTimesScalar %36 %38 %40
153 %42 = OpAccessChain %23 %19 %21 %21
155 %45 = OpAccessChain %23 %19 %21 %44
157 %47 = OpCompositeConstruct %36 %43 %46
158 %48 = OpFSub %36 %41 %47
159 %49 = OpConvertFToS %33 %48
161 %52 = OpAccessChain %23 %19 %21 %44
163 %55 = OpAccessChain %23 %19 %21 %54
165 %58 = OpAccessChain %57 %35 %11
167 %61 = OpAccessChain %57 %35 %60
169 %63 = OpIMul %20 %59 %62
170 %69 = OpAccessChain %68 %67 %21 %21
172 %71 = OpINotEqual %29 %63 %70
173 OpSelectionMerge %75 None
174 OpBranchConditional %71 %74 %78
176 %76 = OpAccessChain %23 %19 %21 %54
181 %79 = OpAccessChain %23 %19 %21 %44
187 %82 = OpAccessChain %68 %67 %21 %21
189 %84 = OpConvertSToF %6 %83
190 %85 = OpCompositeConstruct %7 %53 %56 %81 %84
195 %89 = OpVectorShuffle %36 %88 %88 0 1
196 %90 = OpAccessChain %23 %19 %21 %22
198 %92 = OpVectorTimesScalar %36 %89 %91
199 %93 = OpAccessChain %23 %19 %21 %21
201 %95 = OpAccessChain %23 %19 %21 %44
203 %97 = OpCompositeConstruct %36 %94 %96
204 %98 = OpFSub %36 %92 %97
205 %99 = OpConvertFToS %33 %98
207 %100 = OpAccessChain %23 %19 %21 %54
208 %101 = OpLoad %6 %100
209 %102 = OpAccessChain %23 %19 %21 %54
210 %103 = OpLoad %6 %102
211 %104 = OpAccessChain %57 %87 %11
212 %105 = OpLoad %20 %104
213 %106 = OpConvertSToF %6 %105
214 %107 = OpAccessChain %23 %19 %21 %54
215 %108 = OpLoad %6 %107
216 %109 = OpCompositeConstruct %7 %101 %103 %106 %108
224 # uniforms for variant
226 # _GLF_uniform_float_values
227 BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
230 # _GLF_uniform_int_values
231 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
235 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
237 PIPELINE graphics variant_pipeline
238 ATTACH variant_vertex_shader
239 ATTACH variant_fragment_shader
240 FRAMEBUFFER_SIZE 256 256
241 BIND BUFFER variant_framebuffer AS color LOCATION 0
242 BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
243 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
245 CLEAR_COLOR variant_pipeline 0 0 0 255
247 CLEAR variant_pipeline
248 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
250 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255