yes
This commit is contained in:
@@ -0,0 +1,373 @@
|
||||
# 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: A compute shader with an unreachable barrier in a loop nest
|
||||
|
||||
# The test passes because the compute shader has a single global invocation that
|
||||
# is guaranteed to set 'value' to (0.0, 0.0, 0.0, 1.0), and that writes the
|
||||
# components of 'value', cast to integers, to '_compute_data' at the end of
|
||||
# execution. The early return is unreachable.
|
||||
|
||||
# Derived from the following GLSL.
|
||||
|
||||
# Compute shader GLSL:
|
||||
# #version 310 es
|
||||
#
|
||||
# precision highp float;
|
||||
#
|
||||
# layout(set = 0, binding = 2) uniform buf2 {
|
||||
# vec2 resolution;
|
||||
# };
|
||||
#
|
||||
# layout(set = 0, binding = 1) uniform buf1 {
|
||||
# vec2 injectionSwitch;
|
||||
# };
|
||||
#
|
||||
# layout(std430, binding = 0) buffer doesNotMatter {
|
||||
# int _compute_data[];
|
||||
# };
|
||||
#
|
||||
# layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||
#
|
||||
# void main(void)
|
||||
# {
|
||||
# vec4 value;
|
||||
# float A[1];
|
||||
# A[0] = 0.0;
|
||||
# for(int i = 0; i < 50; i++) {
|
||||
# if(i > 0) {
|
||||
# A[0] += A[0];
|
||||
# }
|
||||
# }
|
||||
# do {
|
||||
# if(gl_GlobalInvocationID.x < 100u) {
|
||||
# value = vec4(0.0, 0.0, 0.0, 1.0);
|
||||
# for(int m = 0; m < 1; m++) {
|
||||
# for(int l = 0; l < 1; l++) {
|
||||
# if(injectionSwitch.x > injectionSwitch.y)
|
||||
# return;
|
||||
# }
|
||||
# }
|
||||
# for(int n = 0; n < 1; n ++) {
|
||||
# if(injectionSwitch.x > injectionSwitch.y)
|
||||
# barrier();
|
||||
# }
|
||||
# } else {
|
||||
# if(gl_GlobalInvocationID.x < 120u) {
|
||||
# value = vec4(A[0] / resolution.x, A[0] / resolution.y, 0.0, 1.0);
|
||||
# } else {
|
||||
# if(injectionSwitch.x > injectionSwitch.y)
|
||||
# continue;
|
||||
# }
|
||||
# }
|
||||
# } while(false);
|
||||
# _compute_data[0] = int(value.x);
|
||||
# _compute_data[1] = int(value.y);
|
||||
# _compute_data[2] = int(value.z);
|
||||
# _compute_data[3] = int(value.w);
|
||||
# }
|
||||
|
||||
[compute shader spirv]
|
||||
; SPIR-V
|
||||
; Version: 1.0
|
||||
; Generator: Khronos Glslang Reference Front End; 7
|
||||
; Bound: 168
|
||||
; Schema: 0
|
||||
OpCapability Shader
|
||||
%1 = OpExtInstImport "GLSL.std.450"
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %4 "main" %47
|
||||
OpExecutionMode %4 LocalSize 1 1 1
|
||||
OpSource ESSL 310
|
||||
OpName %4 "main"
|
||||
OpName %11 "A"
|
||||
OpName %18 "i"
|
||||
OpName %47 "gl_GlobalInvocationID"
|
||||
OpName %58 "value"
|
||||
OpName %61 "m"
|
||||
OpName %69 "l"
|
||||
OpName %78 "buf1"
|
||||
OpMemberName %78 0 "injectionSwitch"
|
||||
OpName %80 ""
|
||||
OpName %94 "n"
|
||||
OpName %122 "buf2"
|
||||
OpMemberName %122 0 "resolution"
|
||||
OpName %124 ""
|
||||
OpName %145 "doesNotMatter"
|
||||
OpMemberName %145 0 "_compute_data"
|
||||
OpName %147 ""
|
||||
OpDecorate %47 BuiltIn GlobalInvocationId
|
||||
OpMemberDecorate %78 0 Offset 0
|
||||
OpDecorate %78 Block
|
||||
OpDecorate %80 DescriptorSet 0
|
||||
OpDecorate %80 Binding 1
|
||||
OpMemberDecorate %122 0 Offset 0
|
||||
OpDecorate %122 Block
|
||||
OpDecorate %124 DescriptorSet 0
|
||||
OpDecorate %124 Binding 2
|
||||
OpDecorate %144 ArrayStride 4
|
||||
OpMemberDecorate %145 0 Offset 0
|
||||
OpDecorate %145 BufferBlock
|
||||
OpDecorate %147 DescriptorSet 0
|
||||
OpDecorate %147 Binding 0
|
||||
%2 = OpTypeVoid
|
||||
%3 = OpTypeFunction %2
|
||||
%6 = OpTypeFloat 32
|
||||
%7 = OpTypeInt 32 0
|
||||
%8 = OpConstant %7 1
|
||||
%9 = OpTypeArray %6 %8
|
||||
%10 = OpTypePointer Function %9
|
||||
%12 = OpTypeInt 32 1
|
||||
%13 = OpConstant %12 0
|
||||
%14 = OpConstant %6 0
|
||||
%15 = OpTypePointer Function %6
|
||||
%17 = OpTypePointer Function %12
|
||||
%25 = OpConstant %12 50
|
||||
%26 = OpTypeBool
|
||||
%39 = OpConstant %12 1
|
||||
%45 = OpTypeVector %7 3
|
||||
%46 = OpTypePointer Input %45
|
||||
%47 = OpVariable %46 Input
|
||||
%48 = OpConstant %7 0
|
||||
%49 = OpTypePointer Input %7
|
||||
%52 = OpConstant %7 100
|
||||
%56 = OpTypeVector %6 4
|
||||
%57 = OpTypePointer Function %56
|
||||
%59 = OpConstant %6 1
|
||||
%60 = OpConstantComposite %56 %14 %14 %14 %59
|
||||
%77 = OpTypeVector %6 2
|
||||
%78 = OpTypeStruct %77
|
||||
%79 = OpTypePointer Uniform %78
|
||||
%80 = OpVariable %79 Uniform
|
||||
%81 = OpTypePointer Uniform %6
|
||||
%109 = OpConstant %7 2
|
||||
%110 = OpConstant %7 264
|
||||
%116 = OpConstant %7 120
|
||||
%122 = OpTypeStruct %77
|
||||
%123 = OpTypePointer Uniform %122
|
||||
%124 = OpVariable %123 Uniform
|
||||
%143 = OpConstantFalse %26
|
||||
%144 = OpTypeRuntimeArray %12
|
||||
%145 = OpTypeStruct %144
|
||||
%146 = OpTypePointer Uniform %145
|
||||
%147 = OpVariable %146 Uniform
|
||||
%151 = OpTypePointer Uniform %12
|
||||
%157 = OpConstant %12 2
|
||||
%162 = OpConstant %12 3
|
||||
%163 = OpConstant %7 3
|
||||
%4 = OpFunction %2 None %3
|
||||
%5 = OpLabel
|
||||
%11 = OpVariable %10 Function
|
||||
%18 = OpVariable %17 Function
|
||||
%58 = OpVariable %57 Function
|
||||
%61 = OpVariable %17 Function
|
||||
%69 = OpVariable %17 Function
|
||||
%94 = OpVariable %17 Function
|
||||
%16 = OpAccessChain %15 %11 %13
|
||||
OpStore %16 %14
|
||||
OpStore %18 %13
|
||||
OpBranch %19
|
||||
%19 = OpLabel
|
||||
OpLoopMerge %21 %22 None
|
||||
OpBranch %23
|
||||
%23 = OpLabel
|
||||
%24 = OpLoad %12 %18
|
||||
%27 = OpSLessThan %26 %24 %25
|
||||
OpBranchConditional %27 %20 %21
|
||||
%20 = OpLabel
|
||||
%28 = OpLoad %12 %18
|
||||
%29 = OpSGreaterThan %26 %28 %13
|
||||
OpSelectionMerge %31 None
|
||||
OpBranchConditional %29 %30 %31
|
||||
%30 = OpLabel
|
||||
%32 = OpAccessChain %15 %11 %13
|
||||
%33 = OpLoad %6 %32
|
||||
%34 = OpAccessChain %15 %11 %13
|
||||
%35 = OpLoad %6 %34
|
||||
%36 = OpFAdd %6 %35 %33
|
||||
%37 = OpAccessChain %15 %11 %13
|
||||
OpStore %37 %36
|
||||
OpBranch %31
|
||||
%31 = OpLabel
|
||||
OpBranch %22
|
||||
%22 = OpLabel
|
||||
%38 = OpLoad %12 %18
|
||||
%40 = OpIAdd %12 %38 %39
|
||||
OpStore %18 %40
|
||||
OpBranch %19
|
||||
%21 = OpLabel
|
||||
OpBranch %41
|
||||
%41 = OpLabel
|
||||
OpLoopMerge %43 %44 None
|
||||
OpBranch %42
|
||||
%42 = OpLabel
|
||||
%50 = OpAccessChain %49 %47 %48
|
||||
%51 = OpLoad %7 %50
|
||||
%53 = OpULessThan %26 %51 %52
|
||||
OpSelectionMerge %55 None
|
||||
OpBranchConditional %53 %54 %113
|
||||
%54 = OpLabel
|
||||
OpStore %58 %60
|
||||
OpStore %61 %13
|
||||
OpBranch %62
|
||||
%62 = OpLabel
|
||||
OpLoopMerge %64 %65 None
|
||||
OpBranch %66
|
||||
%66 = OpLabel
|
||||
%67 = OpLoad %12 %61
|
||||
%68 = OpSLessThan %26 %67 %39
|
||||
OpBranchConditional %68 %63 %64
|
||||
%63 = OpLabel
|
||||
OpStore %69 %13
|
||||
OpBranch %70
|
||||
%70 = OpLabel
|
||||
OpLoopMerge %72 %73 None
|
||||
OpBranch %74
|
||||
%74 = OpLabel
|
||||
%75 = OpLoad %12 %69
|
||||
%76 = OpSLessThan %26 %75 %39
|
||||
OpBranchConditional %76 %71 %72
|
||||
%71 = OpLabel
|
||||
%82 = OpAccessChain %81 %80 %13 %48
|
||||
%83 = OpLoad %6 %82
|
||||
%84 = OpAccessChain %81 %80 %13 %8
|
||||
%85 = OpLoad %6 %84
|
||||
%86 = OpFOrdGreaterThan %26 %83 %85
|
||||
OpSelectionMerge %88 None
|
||||
OpBranchConditional %86 %87 %88
|
||||
%87 = OpLabel
|
||||
OpReturn
|
||||
%88 = OpLabel
|
||||
OpBranch %73
|
||||
%73 = OpLabel
|
||||
%90 = OpLoad %12 %69
|
||||
%91 = OpIAdd %12 %90 %39
|
||||
OpStore %69 %91
|
||||
OpBranch %70
|
||||
%72 = OpLabel
|
||||
OpBranch %65
|
||||
%65 = OpLabel
|
||||
%92 = OpLoad %12 %61
|
||||
%93 = OpIAdd %12 %92 %39
|
||||
OpStore %61 %93
|
||||
OpBranch %62
|
||||
%64 = OpLabel
|
||||
OpStore %94 %13
|
||||
OpBranch %95
|
||||
%95 = OpLabel
|
||||
OpLoopMerge %97 %98 None
|
||||
OpBranch %99
|
||||
%99 = OpLabel
|
||||
%100 = OpLoad %12 %94
|
||||
%101 = OpSLessThan %26 %100 %39
|
||||
OpBranchConditional %101 %96 %97
|
||||
%96 = OpLabel
|
||||
%102 = OpAccessChain %81 %80 %13 %48
|
||||
%103 = OpLoad %6 %102
|
||||
%104 = OpAccessChain %81 %80 %13 %8
|
||||
%105 = OpLoad %6 %104
|
||||
%106 = OpFOrdGreaterThan %26 %103 %105
|
||||
OpSelectionMerge %108 None
|
||||
OpBranchConditional %106 %107 %108
|
||||
%107 = OpLabel
|
||||
OpControlBarrier %109 %109 %110
|
||||
OpBranch %108
|
||||
%108 = OpLabel
|
||||
OpBranch %98
|
||||
%98 = OpLabel
|
||||
%111 = OpLoad %12 %94
|
||||
%112 = OpIAdd %12 %111 %39
|
||||
OpStore %94 %112
|
||||
OpBranch %95
|
||||
%97 = OpLabel
|
||||
OpBranch %55
|
||||
%113 = OpLabel
|
||||
%114 = OpAccessChain %49 %47 %48
|
||||
%115 = OpLoad %7 %114
|
||||
%117 = OpULessThan %26 %115 %116
|
||||
OpSelectionMerge %119 None
|
||||
OpBranchConditional %117 %118 %134
|
||||
%118 = OpLabel
|
||||
%120 = OpAccessChain %15 %11 %13
|
||||
%121 = OpLoad %6 %120
|
||||
%125 = OpAccessChain %81 %124 %13 %48
|
||||
%126 = OpLoad %6 %125
|
||||
%127 = OpFDiv %6 %121 %126
|
||||
%128 = OpAccessChain %15 %11 %13
|
||||
%129 = OpLoad %6 %128
|
||||
%130 = OpAccessChain %81 %124 %13 %8
|
||||
%131 = OpLoad %6 %130
|
||||
%132 = OpFDiv %6 %129 %131
|
||||
%133 = OpCompositeConstruct %56 %127 %132 %14 %59
|
||||
OpStore %58 %133
|
||||
OpBranch %119
|
||||
%134 = OpLabel
|
||||
%135 = OpAccessChain %81 %80 %13 %48
|
||||
%136 = OpLoad %6 %135
|
||||
%137 = OpAccessChain %81 %80 %13 %8
|
||||
%138 = OpLoad %6 %137
|
||||
%139 = OpFOrdGreaterThan %26 %136 %138
|
||||
OpSelectionMerge %141 None
|
||||
OpBranchConditional %139 %140 %141
|
||||
%140 = OpLabel
|
||||
OpBranch %44
|
||||
%141 = OpLabel
|
||||
OpBranch %119
|
||||
%119 = OpLabel
|
||||
OpBranch %55
|
||||
%55 = OpLabel
|
||||
OpBranch %44
|
||||
%44 = OpLabel
|
||||
OpBranchConditional %143 %41 %43
|
||||
%43 = OpLabel
|
||||
%148 = OpAccessChain %15 %58 %48
|
||||
%149 = OpLoad %6 %148
|
||||
%150 = OpConvertFToS %12 %149
|
||||
%152 = OpAccessChain %151 %147 %13 %13
|
||||
OpStore %152 %150
|
||||
%153 = OpAccessChain %15 %58 %8
|
||||
%154 = OpLoad %6 %153
|
||||
%155 = OpConvertFToS %12 %154
|
||||
%156 = OpAccessChain %151 %147 %13 %39
|
||||
OpStore %156 %155
|
||||
%158 = OpAccessChain %15 %58 %109
|
||||
%159 = OpLoad %6 %158
|
||||
%160 = OpConvertFToS %12 %159
|
||||
%161 = OpAccessChain %151 %147 %13 %157
|
||||
OpStore %161 %160
|
||||
%164 = OpAccessChain %15 %58 %163
|
||||
%165 = OpLoad %6 %164
|
||||
%166 = OpConvertFToS %12 %165
|
||||
%167 = OpAccessChain %151 %147 %13 %162
|
||||
OpStore %167 %166
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
||||
|
||||
[test]
|
||||
## Uniforms
|
||||
# injectionSwitch
|
||||
uniform ubo 0:1 vec2 0 0.0 1.0
|
||||
# resolution
|
||||
uniform ubo 0:2 vec2 0 256.0 256.0
|
||||
## SSBO
|
||||
ssbo 0 subdata int 0 0 0 0 0
|
||||
|
||||
compute 3 1 1
|
||||
probe ssbo int 0 0 == 0
|
||||
probe ssbo int 0 4 == 0
|
||||
probe ssbo int 0 8 == 0
|
||||
probe ssbo int 0 12 == 1
|
||||
Reference in New Issue
Block a user