blob: 8ecbcb81f9e998ce6d916ff39e5138d1ff808350 [file] [log] [blame]
#!amber
# Copyright 2021 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 coverage-gap found by the GraphicsFuzz project.
# Short description: A fragment shader that covers specific NIR code paths
# The test passes because the shader always writes red.
SHADER vertex variant_vertex_shader PASSTHROUGH
# variant_fragment_shader is derived from the following GLSL:
# #version 320 es
#
# #define _int_2 _GLF_uniform_int_values[0]
# #define _int_0 _GLF_uniform_int_values[1]
# #define _int_1 _GLF_uniform_int_values[2]
# #define _int_3 _GLF_uniform_int_values[3]
#
# precision highp int;
# precision highp float;
#
# // Contents of _GLF_uniform_int_values: [2, 0, 1, 3]
# layout(set = 0, binding = 0) uniform buf0
# {
# int _GLF_uniform_int_values[4];
# };
#
# layout(location = 0) out vec4 _GLF_color;
#
# void main()
# {
# float f;
# mat2 m;
#
# // Always false.
# if (_int_0 == 1)
# {
# // Uses an undefined value, but this is never executed.
# m = mat2(f);
# }
#
# // Initialize all matrix elements in a loop.
# for(int i = _int_0; i < _int_2; i++)
# {
# for(int j = _int_0; j < _int_2; j++)
# {
# m[i][j] = float(i * _int_2 + j);
# }
# }
#
# // Always true.
# if(m == mat2(_int_0, _int_1, _int_2, _int_3))
# {
# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
# }
# else
# {
# _GLF_color = vec4(_int_0);
# }
# }
SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 125
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %4 "main" %106
OpExecutionMode %4 OriginUpperLeft
OpSource ESSL 320
OpName %4 "main"
OpName %10 "buf0"
OpMemberName %10 0 "_GLF_uniform_int_values"
OpName %12 ""
OpName %26 "m"
OpName %28 "f"
OpName %36 "i"
OpName %48 "j"
OpName %106 "_GLF_color"
OpDecorate %9 ArrayStride 16
OpMemberDecorate %10 0 Offset 0
OpDecorate %10 Block
OpDecorate %12 DescriptorSet 0
OpDecorate %12 Binding 0
OpDecorate %106 Location 0
%2 = OpTypeVoid
%3 = OpTypeFunction %2
%6 = OpTypeInt 32 1
%7 = OpTypeInt 32 0
%8 = OpConstant %7 4
%9 = OpTypeArray %6 %8
%10 = OpTypeStruct %9
%11 = OpTypePointer Uniform %10
%12 = OpVariable %11 Uniform
%13 = OpConstant %6 0
%14 = OpConstant %6 1
%15 = OpTypePointer Uniform %6
%18 = OpTypeBool
%22 = OpTypeFloat 32
%23 = OpTypeVector %22 2
%24 = OpTypeMatrix %23 2
%25 = OpTypePointer Function %24
%27 = OpTypePointer Function %22
%30 = OpConstant %22 1
%31 = OpConstant %22 0
%35 = OpTypePointer Function %6
%78 = OpConstant %6 2
%85 = OpConstant %6 3
%94 = OpTypeVector %18 2
%104 = OpTypeVector %22 4
%105 = OpTypePointer Output %104
%106 = OpVariable %105 Output
%4 = OpFunction %2 None %3
%5 = OpLabel
%26 = OpVariable %25 Function
%28 = OpVariable %27 Function
%36 = OpVariable %35 Function
%48 = OpVariable %35 Function
%16 = OpAccessChain %15 %12 %13 %14
%17 = OpLoad %6 %16
%19 = OpIEqual %18 %17 %14
OpSelectionMerge %21 None
OpBranchConditional %19 %20 %21
%20 = OpLabel
%29 = OpLoad %22 %28
%32 = OpCompositeConstruct %23 %29 %31
%33 = OpCompositeConstruct %23 %31 %29
%34 = OpCompositeConstruct %24 %32 %33
OpStore %26 %34
OpBranch %21
%21 = OpLabel
%37 = OpAccessChain %15 %12 %13 %14
%38 = OpLoad %6 %37
OpStore %36 %38
OpBranch %39
%39 = OpLabel
OpLoopMerge %41 %42 None
OpBranch %43
%43 = OpLabel
%44 = OpLoad %6 %36
%45 = OpAccessChain %15 %12 %13 %13
%46 = OpLoad %6 %45
%47 = OpSLessThan %18 %44 %46
OpBranchConditional %47 %40 %41
%40 = OpLabel
%49 = OpAccessChain %15 %12 %13 %14
%50 = OpLoad %6 %49
OpStore %48 %50
OpBranch %51
%51 = OpLabel
OpLoopMerge %53 %54 None
OpBranch %55
%55 = OpLabel
%56 = OpLoad %6 %48
%57 = OpAccessChain %15 %12 %13 %13
%58 = OpLoad %6 %57
%59 = OpSLessThan %18 %56 %58
OpBranchConditional %59 %52 %53
%52 = OpLabel
%60 = OpLoad %6 %36
%61 = OpLoad %6 %48
%62 = OpLoad %6 %36
%63 = OpAccessChain %15 %12 %13 %13
%64 = OpLoad %6 %63
%65 = OpIMul %6 %62 %64
%66 = OpLoad %6 %48
%67 = OpIAdd %6 %65 %66
%68 = OpConvertSToF %22 %67
%69 = OpAccessChain %27 %26 %60 %61
OpStore %69 %68
OpBranch %54
%54 = OpLabel
%70 = OpLoad %6 %48
%71 = OpIAdd %6 %70 %14
OpStore %48 %71
OpBranch %51
%53 = OpLabel
OpBranch %42
%42 = OpLabel
%72 = OpLoad %6 %36
%73 = OpIAdd %6 %72 %14
OpStore %36 %73
OpBranch %39
%41 = OpLabel
%74 = OpLoad %24 %26
%75 = OpAccessChain %15 %12 %13 %14
%76 = OpLoad %6 %75
%77 = OpConvertSToF %22 %76
%79 = OpAccessChain %15 %12 %13 %78
%80 = OpLoad %6 %79
%81 = OpConvertSToF %22 %80
%82 = OpAccessChain %15 %12 %13 %13
%83 = OpLoad %6 %82
%84 = OpConvertSToF %22 %83
%86 = OpAccessChain %15 %12 %13 %85
%87 = OpLoad %6 %86
%88 = OpConvertSToF %22 %87
%89 = OpCompositeConstruct %23 %77 %81
%90 = OpCompositeConstruct %23 %84 %88
%91 = OpCompositeConstruct %24 %89 %90
%92 = OpCompositeExtract %23 %74 0
%93 = OpCompositeExtract %23 %91 0
%95 = OpFOrdEqual %94 %92 %93
%96 = OpAll %18 %95
%97 = OpCompositeExtract %23 %74 1
%98 = OpCompositeExtract %23 %91 1
%99 = OpFOrdEqual %94 %97 %98
%100 = OpAll %18 %99
%101 = OpLogicalAnd %18 %96 %100
OpSelectionMerge %103 None
OpBranchConditional %101 %102 %120
%102 = OpLabel
%107 = OpAccessChain %15 %12 %13 %78
%108 = OpLoad %6 %107
%109 = OpConvertSToF %22 %108
%110 = OpAccessChain %15 %12 %13 %14
%111 = OpLoad %6 %110
%112 = OpConvertSToF %22 %111
%113 = OpAccessChain %15 %12 %13 %14
%114 = OpLoad %6 %113
%115 = OpConvertSToF %22 %114
%116 = OpAccessChain %15 %12 %13 %78
%117 = OpLoad %6 %116
%118 = OpConvertSToF %22 %117
%119 = OpCompositeConstruct %104 %109 %112 %115 %118
OpStore %106 %119
OpBranch %103
%120 = OpLabel
%121 = OpAccessChain %15 %12 %13 %14
%122 = OpLoad %6 %121
%123 = OpConvertSToF %22 %122
%124 = OpCompositeConstruct %104 %123 %123 %123 %123
OpStore %106 %124
OpBranch %103
%103 = OpLabel
OpReturn
OpFunctionEnd
END
# uniforms for variant
# _GLF_uniform_int_values
BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
2 0 1 3
END
BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
PIPELINE graphics variant_pipeline
ATTACH variant_vertex_shader
ATTACH variant_fragment_shader
FRAMEBUFFER_SIZE 256 256
BIND BUFFER variant_framebuffer AS color LOCATION 0
BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
END
CLEAR_COLOR variant_pipeline 0 0 0 255
CLEAR variant_pipeline
RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255