From 4e79fac4aa3a461a19ed90b99a369a3208bcc212 Mon Sep 17 00:00:00 2001 From: Venni Ihanakangas Date: Thu, 19 Sep 2019 16:19:36 +0300 Subject: [PATCH] dEQP-VK.graphicsfuzz.two-for-loops-with-barrier-function Components: Vulkan New Tests: dEQP-VK.graphicsfuzz.two-for-loops-with-barrier-function Change-Id: Ie5de54846997779caac7db94f9eddf5be77404c0 --- android/cts/master/vk-master.txt | 1 + .../two-for-loops-with-barrier-function.amber | 291 +++++++++++++++++++++ .../vulkan/amber/vktAmberGraphicsFuzzTests.cpp | 1 + .../mustpass/master/vk-default-no-waivers.txt | 1 + external/vulkancts/mustpass/master/vk-default.txt | 1 + 5 files changed, 295 insertions(+) create mode 100644 external/vulkancts/data/vulkan/amber/graphicsfuzz/two-for-loops-with-barrier-function.amber diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 8d6d938..0f500be 100644 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -519534,6 +519534,7 @@ dEQP-VK.graphicsfuzz.struct-used-as-temporary dEQP-VK.graphicsfuzz.switch-if-discard dEQP-VK.graphicsfuzz.switch-with-empty-if-false dEQP-VK.graphicsfuzz.swizzle-struct-init-min +dEQP-VK.graphicsfuzz.two-for-loops-with-barrier-function dEQP-VK.graphicsfuzz.two-loops-matrix dEQP-VK.graphicsfuzz.two-loops-set-struct dEQP-VK.graphicsfuzz.two-loops-with-break diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/two-for-loops-with-barrier-function.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/two-for-loops-with-barrier-function.amber new file mode 100644 index 0000000..e3edf46 --- /dev/null +++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/two-for-loops-with-barrier-function.amber @@ -0,0 +1,291 @@ +#!amber + +# 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 two barrier functions + +# The test passes because main always outputs 42. + +# variant_compute_shader is derived from the following GLSL: +# #version 310 es +# precision highp float; +# +# layout(std430, binding = 0) buffer doesNotMatter +# { +# uint _compute_data[]; +# }; +# layout(local_size_x = 1, local_size_y = 18, local_size_z = 6) in; +# mediump vec4 GLF_live2gl_FragCoord; +# layout(set = 0, binding = 1) uniform buf0 { +# vec2 injectionSwitch; +# }; +# +# void main() +# { +# int GLF_live2_looplimiter1 = 0; +# for ( +# int i = 0; +# i < 1; +# ++i) +# { +# if (GLF_live2_looplimiter1 >= 3) //always false +# { +# for ( +# int j = 0; +# j < 1; +# ++j) +# { +# if (int(GLF_live2gl_FragCoord.x) < 120) +# { +# } +# else +# { +# barrier(); +# } +# } +# break; +# } +# } +# float GLF_dead3x = (injectionSwitch.x > injectionSwitch.y ? GLF_live2gl_FragCoord.x : 0.0); // always 0.0 +# for ( +# int GLF_dead3k = 0; +# GLF_dead3k < 2; +# ++GLF_dead3k) +# { +# if (GLF_dead3x > 4.0) //always false +# { +# break; +# } +# GLF_dead3x = GLF_live2gl_FragCoord.x; +# barrier(); +# } +# +# _compute_data[0] = 42u; +# } +SHADER compute variant_compute_shader SPIRV-ASM +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 106 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %4 "main" + OpExecutionMode %4 LocalSize 1 18 6 + OpSource ESSL 310 + OpName %4 "main" + OpName %8 "GLF_live2_looplimiter1" + OpName %10 "i" + OpName %25 "j" + OpName %36 "GLF_live2gl_FragCoord" + OpName %56 "GLF_dead3x" + OpName %58 "buf0" + OpMemberName %58 0 "injectionSwitch" + OpName %60 "" + OpName %76 "GLF_dead3k" + OpName %96 "doesNotMatter" + OpMemberName %96 0 "_compute_data" + OpName %98 "" + OpDecorate %36 RelaxedPrecision + OpDecorate %41 RelaxedPrecision + OpMemberDecorate %58 0 Offset 0 + OpDecorate %58 Block + OpDecorate %60 DescriptorSet 0 + OpDecorate %60 Binding 1 + OpDecorate %72 RelaxedPrecision + OpDecorate %75 RelaxedPrecision + OpDecorate %92 RelaxedPrecision + OpDecorate %95 ArrayStride 4 + OpMemberDecorate %96 0 Offset 0 + OpDecorate %96 BufferBlock + OpDecorate %98 DescriptorSet 0 + OpDecorate %98 Binding 0 + OpDecorate %105 BuiltIn WorkgroupSize + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %17 = OpConstant %6 1 + %18 = OpTypeBool + %21 = OpConstant %6 3 + %33 = OpTypeFloat 32 + %34 = OpTypeVector %33 4 + %35 = OpTypePointer Private %34 + %36 = OpVariable %35 Private + %37 = OpTypeInt 32 0 + %38 = OpConstant %37 0 + %39 = OpTypePointer Private %33 + %43 = OpConstant %6 120 + %48 = OpConstant %37 2 + %49 = OpConstant %37 264 + %55 = OpTypePointer Function %33 + %57 = OpTypeVector %33 2 + %58 = OpTypeStruct %57 + %59 = OpTypePointer Uniform %58 + %60 = OpVariable %59 Uniform + %61 = OpTypePointer Uniform %33 + %64 = OpConstant %37 1 + %74 = OpConstant %33 0 + %83 = OpConstant %6 2 + %86 = OpConstant %33 4 + %95 = OpTypeRuntimeArray %37 + %96 = OpTypeStruct %95 + %97 = OpTypePointer Uniform %96 + %98 = OpVariable %97 Uniform + %99 = OpConstant %37 42 + %100 = OpTypePointer Uniform %37 + %102 = OpTypeVector %37 3 + %103 = OpConstant %37 18 + %104 = OpConstant %37 6 + %105 = OpConstantComposite %102 %64 %103 %104 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %10 = OpVariable %7 Function + %25 = OpVariable %7 Function + %56 = OpVariable %55 Function + %68 = OpVariable %55 Function + %76 = OpVariable %7 Function + OpStore %8 %9 + OpStore %10 %9 + OpBranch %11 + %11 = OpLabel + OpLoopMerge %13 %14 None + OpBranch %15 + %15 = OpLabel + %16 = OpLoad %6 %10 + %19 = OpSLessThan %18 %16 %17 + OpBranchConditional %19 %12 %13 + %12 = OpLabel + %20 = OpLoad %6 %8 + %22 = OpSGreaterThanEqual %18 %20 %21 + OpSelectionMerge %24 None + OpBranchConditional %22 %23 %24 + %23 = OpLabel + OpStore %25 %9 + OpBranch %26 + %26 = OpLabel + OpLoopMerge %28 %29 None + OpBranch %30 + %30 = OpLabel + %31 = OpLoad %6 %25 + %32 = OpSLessThan %18 %31 %17 + OpBranchConditional %32 %27 %28 + %27 = OpLabel + %40 = OpAccessChain %39 %36 %38 + %41 = OpLoad %33 %40 + %42 = OpConvertFToS %6 %41 + %44 = OpSLessThan %18 %42 %43 + OpSelectionMerge %46 None + OpBranchConditional %44 %45 %47 + %45 = OpLabel + OpBranch %46 + %47 = OpLabel + OpControlBarrier %48 %48 %49 + OpBranch %46 + %46 = OpLabel + OpBranch %29 + %29 = OpLabel + %50 = OpLoad %6 %25 + %51 = OpIAdd %6 %50 %17 + OpStore %25 %51 + OpBranch %26 + %28 = OpLabel + OpBranch %13 + %24 = OpLabel + OpBranch %14 + %14 = OpLabel + %53 = OpLoad %6 %10 + %54 = OpIAdd %6 %53 %17 + OpStore %10 %54 + OpBranch %11 + %13 = OpLabel + %62 = OpAccessChain %61 %60 %9 %38 + %63 = OpLoad %33 %62 + %65 = OpAccessChain %61 %60 %9 %64 + %66 = OpLoad %33 %65 + %67 = OpFOrdGreaterThan %18 %63 %66 + OpSelectionMerge %70 None + OpBranchConditional %67 %69 %73 + %69 = OpLabel + %71 = OpAccessChain %39 %36 %38 + %72 = OpLoad %33 %71 + OpStore %68 %72 + OpBranch %70 + %73 = OpLabel + OpStore %68 %74 + OpBranch %70 + %70 = OpLabel + %75 = OpLoad %33 %68 + OpStore %56 %75 + OpStore %76 %9 + OpBranch %77 + %77 = OpLabel + OpLoopMerge %79 %80 None + OpBranch %81 + %81 = OpLabel + %82 = OpLoad %6 %76 + %84 = OpSLessThan %18 %82 %83 + OpBranchConditional %84 %78 %79 + %78 = OpLabel + %85 = OpLoad %33 %56 + %87 = OpFOrdGreaterThan %18 %85 %86 + OpSelectionMerge %89 None + OpBranchConditional %87 %88 %89 + %88 = OpLabel + OpBranch %79 + %89 = OpLabel + %91 = OpAccessChain %39 %36 %38 + %92 = OpLoad %33 %91 + OpStore %56 %92 + OpControlBarrier %48 %48 %49 + OpBranch %80 + %80 = OpLabel + %93 = OpLoad %6 %76 + %94 = OpIAdd %6 %93 %17 + OpStore %76 %94 + OpBranch %77 + %79 = OpLabel + %101 = OpAccessChain %100 %98 %9 %9 + OpStore %101 %99 + OpReturn + OpFunctionEnd +END + +# uniforms for variant + +# injectionSwitch +BUFFER variant_injectionSwitch DATA_TYPE vec2 DATA + 0.0 1.0 +END + +BUFFER variant_ssbo DATA_TYPE uint32 DATA + 0 0 0 0 0 0 0 0 0 0 +END + +PIPELINE compute variant_pipeline + ATTACH variant_compute_shader + BIND BUFFER variant_ssbo AS storage DESCRIPTOR_SET 0 BINDING 0 + BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 1 +END + +RUN variant_pipeline 1 6 2 + +EXPECT variant_ssbo IDX 0 EQ 42 \ No newline at end of file diff --git a/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp b/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp index 67539ea..215c423 100644 --- a/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp +++ b/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp @@ -83,6 +83,7 @@ void createAmberTests (tcu::TestCaseGroup* group) { "switch-if-discard.amber", "switch-if-discard", "A fragment shader with a switch, if, and discard" }, { "switch-with-empty-if-false.amber", "switch-with-empty-if-false", "A fragment shader with always false if in switch statement" }, { "swizzle-struct-init-min.amber", "swizzle-struct-init-min", "A fragment shader that uses vector swizzles, struct initializers, and min" }, + { "two-for-loops-with-barrier-function.amber", "two-for-loops-with-barrier-function", "A compute shader with two barrier functions" }, { "two-loops-matrix.amber", "two-loops-matrix", "A fragment shader with two loops and some matrices" }, { "two-loops-set-struct.amber", "two-loops-set-struct", "A fragment shader with two loops that write to a struct" }, { "two-loops-with-break.amber", "two-loops-with-break", "A fragment shader with two loops with breaks" }, diff --git a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt index 2999fdf..d85ca56 100644 --- a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt +++ b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt @@ -521877,6 +521877,7 @@ dEQP-VK.graphicsfuzz.struct-used-as-temporary dEQP-VK.graphicsfuzz.switch-if-discard dEQP-VK.graphicsfuzz.switch-with-empty-if-false dEQP-VK.graphicsfuzz.swizzle-struct-init-min +dEQP-VK.graphicsfuzz.two-for-loops-with-barrier-function dEQP-VK.graphicsfuzz.two-loops-matrix dEQP-VK.graphicsfuzz.two-loops-set-struct dEQP-VK.graphicsfuzz.two-loops-with-break diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt index 99ae628..c24d546 100644 --- a/external/vulkancts/mustpass/master/vk-default.txt +++ b/external/vulkancts/mustpass/master/vk-default.txt @@ -521724,6 +521724,7 @@ dEQP-VK.graphicsfuzz.struct-used-as-temporary dEQP-VK.graphicsfuzz.switch-if-discard dEQP-VK.graphicsfuzz.switch-with-empty-if-false dEQP-VK.graphicsfuzz.swizzle-struct-init-min +dEQP-VK.graphicsfuzz.two-for-loops-with-barrier-function dEQP-VK.graphicsfuzz.two-loops-matrix dEQP-VK.graphicsfuzz.two-loops-set-struct dEQP-VK.graphicsfuzz.two-loops-with-break -- 2.7.4