From d6e345f30972905ffde897a61917b409ee14670c Mon Sep 17 00:00:00 2001 From: Paul Thomson Date: Wed, 15 Jan 2020 16:03:36 +0000 Subject: [PATCH] dEQP-VK.graphicsfuzz.global-array-loops Components: Vulkan New Tests: dEQP-VK.graphicsfuzz.global-array-loops Change-Id: Icd9b68e77695f2ae01a085897fcd15225e90b0e7 --- android/cts/master/vk-master.txt | 1 + .../amber/graphicsfuzz/global-array-loops.amber | 404 +++++++++++++++++++++ .../data/vulkan/amber/graphicsfuzz/index.txt | 1 + .../mustpass/master/vk-default-no-waivers.txt | 1 + external/vulkancts/mustpass/master/vk-default.txt | 1 + 5 files changed, 408 insertions(+) create mode 100644 external/vulkancts/data/vulkan/amber/graphicsfuzz/global-array-loops.amber diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 7047969..57bbe38 100644 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -568765,6 +568765,7 @@ dEQP-VK.graphicsfuzz.for-loop-with-return dEQP-VK.graphicsfuzz.for-with-ifs-and-return dEQP-VK.graphicsfuzz.fragcoord-control-flow dEQP-VK.graphicsfuzz.fragcoord-control-flow-2 +dEQP-VK.graphicsfuzz.global-array-loops dEQP-VK.graphicsfuzz.if-and-switch dEQP-VK.graphicsfuzz.int-mat2-struct dEQP-VK.graphicsfuzz.loop-call-discard diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/global-array-loops.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/global-array-loops.amber new file mode 100644 index 0000000..08a4031 --- /dev/null +++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/global-array-loops.amber @@ -0,0 +1,404 @@ +#!amber + +# Copyright 2020 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 loop that writes then reads a global array + +# The test passes because the first 4-iteration loop increments acc, and then the +# shader writes red if acc == 4, which is always the case. + +# Optimized using spirv-opt with the following arguments: +# '--reduce-load-size' +# '--combine-access-chains' +# '--ccp' +# '--inline-entry-points-exhaustive' +# '--eliminate-dead-code-aggressive' +# '--eliminate-dead-branches' +# '--merge-return' +# '--combine-access-chains' +# '--scalar-replacement=100' +# '--private-to-local' +# '--convert-local-access-chains' +# '--private-to-local' +# '--scalar-replacement=100' +# '--eliminate-local-single-block' +# '--scalar-replacement=100' +# '--vector-dce' +# '--eliminate-local-multi-store' +# '--redundancy-elimination' +# '--eliminate-local-multi-store' +# '--vector-dce' +# '--inline-entry-points-exhaustive' +# spirv-opt commit hash: 18b3b94567a9251a6f8491a6d07c4422abadd22c + + + +SHADER vertex variant_vertex_shader PASSTHROUGH + +# variant_fragment_shader is derived from the following GLSL: +# #version 310 es +# precision highp float; +# +# layout(location = 0) out vec4 _GLF_color; +# +# layout(set = 0, binding = 0) uniform buf0 +# { +# float one; +# }; +# +# int globalNumbers[10]; +# +# // Sets globalNumbers[0] to 1. +# // We assume: +# // n == 0 +# // globalNumbers[0] == 0 +# int setGlobalNumberZeroToOne(int n) +# { +# for ( +# int i = 0; +# i <= n; +# i++) +# { +# if (globalNumbers[n] <= 1) +# { +# globalNumbers[n] = 1; +# } +# } +# return 2; +# } +# +# int yieldsZero() +# { +# for ( +# int i = 0; +# i < int(one); +# i++) +# { +# return i; +# } +# } +# +# void main() +# { +# int acc = 0; +# int localNumbers[2]; +# for ( +# int i = 0; +# i < 4; +# i++) +# { +# localNumbers[1] = yieldsZero(); +# globalNumbers[0] = 0; +# setGlobalNumberZeroToOne(localNumbers[1]); +# acc += globalNumbers[int(one) - 1]; // acc += 1; +# } +# +# // acc should be 4. +# +# if (acc == 4) +# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); +# else +# _GLF_color = vec4(0.0, 0.0, 0.0, 1.0); +# } +SHADER fragment variant_fragment_shader SPIRV-ASM +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 8 +; Bound: 191 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %104 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %13 "yieldsZero(" + OpName %30 "globalNumbers" + OpName %46 "i" + OpName %54 "buf0" + OpMemberName %54 0 "one" + OpName %56 "" + OpName %67 "acc" + OpName %68 "i" + OpName %80 "localNumbers" + OpName %84 "param" + OpName %104 "_GLF_color" + OpDecorate %13 RelaxedPrecision + OpDecorate %30 RelaxedPrecision + OpDecorate %46 RelaxedPrecision + OpMemberDecorate %54 0 Offset 0 + OpDecorate %54 Block + OpDecorate %56 DescriptorSet 0 + OpDecorate %56 Binding 0 + OpDecorate %67 RelaxedPrecision + OpDecorate %68 RelaxedPrecision + OpDecorate %80 RelaxedPrecision + OpDecorate %86 RelaxedPrecision + OpDecorate %93 RelaxedPrecision + OpDecorate %95 RelaxedPrecision + OpDecorate %97 RelaxedPrecision + OpDecorate %104 Location 0 + OpDecorate %110 RelaxedPrecision + OpDecorate %122 RelaxedPrecision + OpDecorate %129 RelaxedPrecision + OpDecorate %131 RelaxedPrecision + OpDecorate %143 RelaxedPrecision + OpDecorate %144 RelaxedPrecision + OpDecorate %146 RelaxedPrecision + OpDecorate %147 RelaxedPrecision + OpDecorate %148 RelaxedPrecision + OpDecorate %161 RelaxedPrecision + OpDecorate %160 RelaxedPrecision + OpDecorate %156 RelaxedPrecision + OpDecorate %167 RelaxedPrecision + OpDecorate %168 RelaxedPrecision + OpDecorate %169 RelaxedPrecision + OpDecorate %178 RelaxedPrecision + OpDecorate %186 RelaxedPrecision + OpDecorate %190 RelaxedPrecision + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %12 = OpTypeFunction %6 + %16 = OpConstant %6 0 + %24 = OpTypeBool + %26 = OpTypeInt 32 0 + %27 = OpConstant %26 10 + %28 = OpTypeArray %6 %27 + %29 = OpTypePointer Private %28 + %32 = OpTypePointer Private %6 + %35 = OpConstant %6 1 + %53 = OpTypeFloat 32 + %54 = OpTypeStruct %53 + %55 = OpTypePointer Uniform %54 + %56 = OpVariable %55 Uniform + %57 = OpTypePointer Uniform %53 + %75 = OpConstant %6 4 + %77 = OpConstant %26 2 + %78 = OpTypeArray %6 %77 + %79 = OpTypePointer Function %78 + %102 = OpTypeVector %53 4 + %103 = OpTypePointer Output %102 + %104 = OpVariable %103 Output + %105 = OpConstant %53 1 + %106 = OpConstant %53 0 + %107 = OpConstantComposite %102 %105 %106 %106 %105 + %109 = OpConstantComposite %102 %106 %106 %106 %105 + %136 = OpConstantFalse %24 + %137 = OpTypePointer Function %24 + %139 = OpConstantTrue %24 + %142 = OpTypePointer Function %28 + %164 = OpUndef %6 + %165 = OpUndef %24 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %166 = OpVariable %137 Function %136 + %167 = OpVariable %7 Function + %168 = OpVariable %7 Function + %169 = OpVariable %7 Function + %30 = OpVariable %142 Function + %110 = OpVariable %7 Function + %67 = OpVariable %7 Function + %68 = OpVariable %7 Function + %80 = OpVariable %79 Function + %84 = OpVariable %7 Function + OpStore %67 %16 + OpStore %68 %16 + OpBranch %69 + %69 = OpLabel + %147 = OpPhi %6 %16 %5 %95 %72 + %146 = OpPhi %6 %16 %5 %97 %72 + OpLoopMerge %71 %72 None + OpBranch %73 + %73 = OpLabel + %76 = OpSLessThan %24 %146 %75 + OpBranchConditional %76 %70 %71 + %70 = OpLabel + OpStore %166 %136 + OpBranch %170 + %170 = OpLabel + %172 = OpPhi %24 %136 %70 %165 %171 + OpLoopMerge %173 %171 None + OpBranch %174 + %174 = OpLabel + OpStore %168 %16 + OpBranch %175 + %175 = OpLabel + %177 = OpPhi %24 %172 %174 %165 %176 + %178 = OpPhi %6 %16 %174 %164 %176 + OpLoopMerge %179 %176 None + OpBranch %180 + %180 = OpLabel + %181 = OpAccessChain %57 %56 %16 + %182 = OpLoad %53 %181 + %183 = OpConvertFToS %6 %182 + %184 = OpSLessThan %24 %178 %183 + OpBranchConditional %184 %185 %179 + %185 = OpLabel + OpStore %166 %139 + OpStore %167 %178 + OpBranch %179 + %176 = OpLabel + OpBranch %175 + %179 = OpLabel + %186 = OpPhi %6 %164 %180 %178 %185 + %187 = OpPhi %24 %177 %180 %139 %185 + OpSelectionMerge %188 None + OpBranchConditional %187 %173 %188 + %188 = OpLabel + %189 = OpUndef %6 + OpStore %166 %139 + OpStore %167 %189 + OpBranch %173 + %171 = OpLabel + OpBranch %170 + %173 = OpLabel + %190 = OpPhi %6 %186 %179 %189 %188 + OpStore %169 %190 + %81 = OpLoad %6 %169 + %143 = OpLoad %78 %80 + %144 = OpCompositeInsert %78 %81 %143 1 + OpStore %80 %144 + %83 = OpAccessChain %7 %30 %16 + OpStore %83 %16 + %85 = OpAccessChain %7 %80 %35 + %86 = OpCompositeExtract %6 %144 1 + OpStore %84 %86 + OpStore %110 %16 + OpBranch %112 + %112 = OpLabel + %148 = OpPhi %6 %16 %173 %129 %114 + OpLoopMerge %113 %114 None + OpBranch %115 + %115 = OpLabel + %118 = OpSLessThanEqual %24 %148 %86 + OpBranchConditional %118 %119 %113 + %119 = OpLabel + %121 = OpAccessChain %7 %30 %86 + %122 = OpLoad %6 %121 + %123 = OpSLessThanEqual %24 %122 %35 + OpSelectionMerge %124 None + OpBranchConditional %123 %125 %124 + %125 = OpLabel + OpStore %121 %35 + OpBranch %124 + %124 = OpLabel + OpBranch %114 + %114 = OpLabel + %129 = OpIAdd %6 %148 %35 + OpStore %110 %129 + OpBranch %112 + %113 = OpLabel + %88 = OpAccessChain %57 %56 %16 + %89 = OpLoad %53 %88 + %90 = OpConvertFToS %6 %89 + %91 = OpISub %6 %90 %35 + %92 = OpAccessChain %7 %30 %91 + %93 = OpLoad %6 %92 + %95 = OpIAdd %6 %147 %93 + OpStore %67 %95 + OpBranch %72 + %72 = OpLabel + %97 = OpIAdd %6 %146 %35 + OpStore %68 %97 + OpBranch %69 + %71 = OpLabel + %99 = OpIEqual %24 %147 %75 + OpSelectionMerge %101 None + OpBranchConditional %99 %100 %108 + %100 = OpLabel + OpStore %104 %107 + OpBranch %101 + %108 = OpLabel + OpStore %104 %109 + OpBranch %101 + %101 = OpLabel + OpReturn + OpFunctionEnd + %13 = OpFunction %6 None %12 + %14 = OpLabel + %138 = OpVariable %137 Function %136 + %131 = OpVariable %7 Function + %46 = OpVariable %7 Function + OpBranch %133 + %133 = OpLabel + %159 = OpPhi %24 %136 %14 %165 %135 + OpLoopMerge %130 %135 None + OpBranch %134 + %134 = OpLabel + OpStore %46 %16 + OpBranch %47 + %47 = OpLabel + %158 = OpPhi %24 %159 %134 %165 %50 + %156 = OpPhi %6 %16 %134 %164 %50 + OpLoopMerge %49 %50 None + OpBranch %51 + %51 = OpLabel + %58 = OpAccessChain %57 %56 %16 + %59 = OpLoad %53 %58 + %60 = OpConvertFToS %6 %59 + %61 = OpSLessThan %24 %156 %60 + OpBranchConditional %61 %48 %49 + %48 = OpLabel + OpStore %138 %139 + OpStore %131 %156 + OpBranch %49 + %50 = OpLabel + OpBranch %47 + %49 = OpLabel + %161 = OpPhi %6 %164 %51 %156 %48 + %157 = OpPhi %24 %158 %51 %139 %48 + OpSelectionMerge %140 None + OpBranchConditional %157 %130 %140 + %140 = OpLabel + %66 = OpUndef %6 + OpStore %138 %139 + OpStore %131 %66 + OpBranch %130 + %135 = OpLabel + OpBranch %133 + %130 = OpLabel + %160 = OpPhi %6 %161 %49 %66 %140 + OpReturnValue %160 + OpFunctionEnd +END + +# uniforms for variant + +# one +BUFFER variant_one DATA_TYPE float DATA + 1.0 +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_one 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 diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/index.txt b/external/vulkancts/data/vulkan/amber/graphicsfuzz/index.txt index a5a7572..fd77cc6 100644 --- a/external/vulkancts/data/vulkan/amber/graphicsfuzz/index.txt +++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/index.txt @@ -26,6 +26,7 @@ { "for-with-ifs-and-return.amber", "for-with-ifs-and-return", "A fragment shader with two ifs and return/continue inside a for loop" }, { "fragcoord-control-flow.amber", "fragcoord-control-flow", "A fragment shader that uses FragCoord and somewhat complex control flow" }, { "fragcoord-control-flow-2.amber", "fragcoord-control-flow-2", "A fragment shader that uses FragCoord and somewhat complex control flow" }, +{ "global-array-loops.amber", "global-array-loops", "A loop that writes then reads a global array" }, { "if-and-switch.amber", "if-and-switch", "A fragment shader with a switch and some data flow" }, { "int-mat2-struct.amber", "int-mat2-struct", "Fragment shader using (int, mat2) struct" }, { "loop-call-discard.amber", "loop-call-discard", "A fragment shader with nested loops and a function call" }, diff --git a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt index b6fc0ae..05e93fe 100644 --- a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt +++ b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt @@ -571018,6 +571018,7 @@ dEQP-VK.graphicsfuzz.for-loop-with-return dEQP-VK.graphicsfuzz.for-with-ifs-and-return dEQP-VK.graphicsfuzz.fragcoord-control-flow dEQP-VK.graphicsfuzz.fragcoord-control-flow-2 +dEQP-VK.graphicsfuzz.global-array-loops dEQP-VK.graphicsfuzz.if-and-switch dEQP-VK.graphicsfuzz.int-mat2-struct dEQP-VK.graphicsfuzz.loop-call-discard diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt index acb0d78..601c56c 100644 --- a/external/vulkancts/mustpass/master/vk-default.txt +++ b/external/vulkancts/mustpass/master/vk-default.txt @@ -570865,6 +570865,7 @@ dEQP-VK.graphicsfuzz.for-loop-with-return dEQP-VK.graphicsfuzz.for-with-ifs-and-return dEQP-VK.graphicsfuzz.fragcoord-control-flow dEQP-VK.graphicsfuzz.fragcoord-control-flow-2 +dEQP-VK.graphicsfuzz.global-array-loops dEQP-VK.graphicsfuzz.if-and-switch dEQP-VK.graphicsfuzz.int-mat2-struct dEQP-VK.graphicsfuzz.loop-call-discard -- 2.7.4