3 # Copyright 2021 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 LLVM 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_0 _GLF_uniform_int_values[0]
29 # #define _int_1 _GLF_uniform_int_values[1]
31 # precision highp int;
32 # precision highp float;
34 # // Contents of _GLF_uniform_int_values: [0, 1]
35 # layout(set = 0, binding = 0) uniform buf0
37 # int _GLF_uniform_int_values[2];
40 # layout(location = 0) out vec4 _GLF_color;
42 # // This function returns 0.
45 # return findLSB(ivec2(1)).g;
51 # if(func() == _int_0)
53 # _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
57 # _GLF_color = vec4(_int_0);
60 SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
63 ; Generator: Khronos Glslang Reference Front End; 10
67 %1 = OpExtInstImport "GLSL.std.450"
68 OpMemoryModel Logical GLSL450
69 OpEntryPoint Fragment %4 "main" %39
70 OpExecutionMode %4 OriginUpperLeft
75 OpMemberName %25 0 "_GLF_uniform_int_values"
77 OpName %39 "_GLF_color"
78 OpDecorate %13 RelaxedPrecision
79 OpDecorate %16 RelaxedPrecision
80 OpDecorate %24 ArrayStride 16
81 OpMemberDecorate %25 0 Offset 0
83 OpDecorate %27 DescriptorSet 0
84 OpDecorate %27 Binding 0
85 OpDecorate %39 Location 0
87 %3 = OpTypeFunction %2
89 %7 = OpTypeFunction %6
90 %10 = OpTypeVector %6 2
92 %12 = OpConstantComposite %10 %11 %11
94 %15 = OpConstant %14 1
95 %17 = OpTypePointer Function %6
96 %23 = OpConstant %14 2
97 %24 = OpTypeArray %6 %23
98 %25 = OpTypeStruct %24
99 %26 = OpTypePointer Uniform %25
100 %27 = OpVariable %26 Uniform
101 %28 = OpConstant %6 0
102 %29 = OpTypePointer Uniform %6
105 %37 = OpTypeVector %36 4
106 %38 = OpTypePointer Output %37
107 %39 = OpVariable %38 Output
108 %4 = OpFunction %2 None %3
110 %22 = OpFunctionCall %6 %8
111 %30 = OpAccessChain %29 %27 %28 %28
113 %33 = OpIEqual %32 %22 %31
114 OpSelectionMerge %35 None
115 OpBranchConditional %33 %34 %53
117 %40 = OpAccessChain %29 %27 %28 %11
119 %42 = OpConvertSToF %36 %41
120 %43 = OpAccessChain %29 %27 %28 %28
122 %45 = OpConvertSToF %36 %44
123 %46 = OpAccessChain %29 %27 %28 %28
125 %48 = OpConvertSToF %36 %47
126 %49 = OpAccessChain %29 %27 %28 %11
128 %51 = OpConvertSToF %36 %50
129 %52 = OpCompositeConstruct %37 %42 %45 %48 %51
133 %54 = OpAccessChain %29 %27 %28 %28
135 %56 = OpConvertSToF %36 %55
136 %57 = OpCompositeConstruct %37 %56 %56 %56 %56
142 %8 = OpFunction %6 None %7
144 %18 = OpVariable %17 Function
145 %13 = OpExtInst %10 %1 FindILsb %12
146 %16 = OpCompositeExtract %6 %13 1
153 # uniforms for variant
155 # _GLF_uniform_int_values
156 BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
160 BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
162 PIPELINE graphics variant_pipeline
163 ATTACH variant_vertex_shader
164 ATTACH variant_fragment_shader
165 FRAMEBUFFER_SIZE 256 256
166 BIND BUFFER variant_framebuffer AS color LOCATION 0
167 BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
169 CLEAR_COLOR variant_pipeline 0 0 0 255
171 CLEAR variant_pipeline
172 RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
174 EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255