From c0a6ba2a4d21694b84510b7114e33189666b6916 Mon Sep 17 00:00:00 2001 From: Alastair Donaldson Date: Wed, 21 Aug 2019 08:53:19 +0100 Subject: [PATCH] dEQP-VK.graphicsfuzz.write-before-break Components: Vulkan New Tests: dEQP-VK.graphicsfuzz.write-before-break Change-Id: I0a03a211a2d0696e4f6562c4604155be6eca7c24 --- android/cts/master/vk-master.txt | 1 + .../amber/graphicsfuzz/write-before-break.amber | 342 +++++++++++++++++++++ .../vulkan/amber/vktAmberGraphicsFuzzTests.cpp | 1 + .../mustpass/master/vk-default-no-waivers.txt | 1 + external/vulkancts/mustpass/master/vk-default.txt | 1 + 5 files changed, 346 insertions(+) create mode 100644 external/vulkancts/data/vulkan/amber/graphicsfuzz/write-before-break.amber diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 5ca1a9d..a1f0155 100644 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -464794,6 +464794,7 @@ dEQP-VK.graphicsfuzz.swizzle-struct-init-min dEQP-VK.graphicsfuzz.unreachable-barrier-in-loops dEQP-VK.graphicsfuzz.unreachable-loops-in-switch dEQP-VK.graphicsfuzz.while-inside-switch +dEQP-VK.graphicsfuzz.write-before-break dEQP-VK.graphicsfuzz.write-red-after-search dEQP-VK.graphicsfuzz.for-condition-always-false dEQP-VK.transform_feedback.simple.basic_1_256 diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/write-before-break.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/write-before-break.amber new file mode 100644 index 0000000..7db380f --- /dev/null +++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/write-before-break.amber @@ -0,0 +1,342 @@ +#!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: Fragment shader that writes red before loop break + +# The test passes because the write of red is the only reachable write and is +# guaranteed to be reached, and all loops are designed to terminate after a small +# number of iterations. For the loop with guard '1 < z' this is guaranteed due +# to the runtime value of 'injected'. + +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 { +# int injected; +# }; +# +# void main() +# { +# int idx = 0; +# mat4x3 m43 = mat4x3(1.0); +# float GLF_live6sums[9]; +# int ll_1 = 0; +# for(int GLF_live6rows = 2;;) +# { +# if(ll_1 >= injected) { +# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); +# break; +# } +# ll_1++; +# +# int z = injected; +# int ll_2 = 0; +# for( +# int ctr = 0; +# ctr < 1; +# ctr ++ +# ) +# { +# if(ll_2 >= injected) { +# break; +# } +# ll_2++; +# +# mat4x3 tempm43; +# tempm43 = m43; +# int ll_3 = 0; +# for( +# int c = 0; +# 1 < z; // False, because 'injected' is 1 +# c ++ +# ) +# { +# int d = 0; +# tempm43[c >= 0 && c < 4 ? c : 0][d >= 0 && d < 3 ? d : 0] = 1.0; +# } +# GLF_live6sums[idx >= 0 && idx < 9 ? idx : 0] += m43[ctr][1]; +# } +# idx ++; +# } +# } +SHADER fragment variant_fragment_shader SPIRV-ASM +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 126 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %42 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %8 "idx" + OpName %14 "m43" + OpName %22 "ll_1" + OpName %23 "GLF_live6rows" + OpName %30 "buf0" + OpMemberName %30 0 "injected" + OpName %32 "" + OpName %42 "_GLF_color" + OpName %48 "z" + OpName %51 "ll_2" + OpName %52 "ctr" + OpName %69 "tempm43" + OpName %71 "ll_3" + OpName %72 "c" + OpName %80 "d" + OpName %105 "GLF_live6sums" + OpDecorate %8 RelaxedPrecision + OpDecorate %22 RelaxedPrecision + OpDecorate %23 RelaxedPrecision + OpDecorate %29 RelaxedPrecision + OpMemberDecorate %30 0 RelaxedPrecision + OpMemberDecorate %30 0 Offset 0 + OpDecorate %30 Block + OpDecorate %32 DescriptorSet 0 + OpDecorate %32 Binding 0 + OpDecorate %35 RelaxedPrecision + OpDecorate %42 Location 0 + OpDecorate %45 RelaxedPrecision + OpDecorate %47 RelaxedPrecision + OpDecorate %48 RelaxedPrecision + OpDecorate %50 RelaxedPrecision + OpDecorate %51 RelaxedPrecision + OpDecorate %52 RelaxedPrecision + OpDecorate %58 RelaxedPrecision + OpDecorate %60 RelaxedPrecision + OpDecorate %62 RelaxedPrecision + OpDecorate %67 RelaxedPrecision + OpDecorate %68 RelaxedPrecision + OpDecorate %71 RelaxedPrecision + OpDecorate %72 RelaxedPrecision + OpDecorate %78 RelaxedPrecision + OpDecorate %80 RelaxedPrecision + OpDecorate %81 RelaxedPrecision + OpDecorate %83 RelaxedPrecision + OpDecorate %87 RelaxedPrecision + OpDecorate %89 RelaxedPrecision + OpDecorate %91 RelaxedPrecision + OpDecorate %95 RelaxedPrecision + OpDecorate %99 RelaxedPrecision + OpDecorate %100 RelaxedPrecision + OpDecorate %106 RelaxedPrecision + OpDecorate %108 RelaxedPrecision + OpDecorate %112 RelaxedPrecision + OpDecorate %114 RelaxedPrecision + OpDecorate %122 RelaxedPrecision + OpDecorate %123 RelaxedPrecision + OpDecorate %124 RelaxedPrecision + OpDecorate %125 RelaxedPrecision + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %10 = OpTypeFloat 32 + %11 = OpTypeVector %10 3 + %12 = OpTypeMatrix %11 4 + %13 = OpTypePointer Function %12 + %15 = OpConstant %10 1 + %16 = OpConstant %10 0 + %17 = OpConstantComposite %11 %15 %16 %16 + %18 = OpConstantComposite %11 %16 %15 %16 + %19 = OpConstantComposite %11 %16 %16 %15 + %20 = OpConstantComposite %11 %16 %16 %16 + %21 = OpConstantComposite %12 %17 %18 %19 %20 + %24 = OpConstant %6 2 + %30 = OpTypeStruct %6 + %31 = OpTypePointer Uniform %30 + %32 = OpVariable %31 Uniform + %33 = OpTypePointer Uniform %6 + %36 = OpTypeBool + %40 = OpTypeVector %10 4 + %41 = OpTypePointer Output %40 + %42 = OpVariable %41 Output + %43 = OpConstantComposite %40 %15 %16 %16 %15 + %46 = OpConstant %6 1 + %84 = OpConstant %6 4 + %92 = OpConstant %6 3 + %97 = OpTypePointer Function %10 + %101 = OpTypeInt 32 0 + %102 = OpConstant %101 9 + %103 = OpTypeArray %10 %102 + %104 = OpTypePointer Function %103 + %109 = OpConstant %6 9 + %115 = OpConstant %101 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %14 = OpVariable %13 Function + %22 = OpVariable %7 Function + %23 = OpVariable %7 Function + %48 = OpVariable %7 Function + %51 = OpVariable %7 Function + %52 = OpVariable %7 Function + %69 = OpVariable %13 Function + %71 = OpVariable %7 Function + %72 = OpVariable %7 Function + %80 = OpVariable %7 Function + %105 = OpVariable %104 Function + OpStore %8 %9 + OpStore %14 %21 + OpStore %22 %9 + OpStore %23 %24 + OpBranch %25 + %25 = OpLabel + OpLoopMerge %27 %28 None + OpBranch %26 + %26 = OpLabel + %29 = OpLoad %6 %22 + %34 = OpAccessChain %33 %32 %9 + %35 = OpLoad %6 %34 + %37 = OpSGreaterThanEqual %36 %29 %35 + OpSelectionMerge %39 None + OpBranchConditional %37 %38 %39 + %38 = OpLabel + OpStore %42 %43 + OpBranch %27 + %39 = OpLabel + %45 = OpLoad %6 %22 + %47 = OpIAdd %6 %45 %46 + OpStore %22 %47 + %49 = OpAccessChain %33 %32 %9 + %50 = OpLoad %6 %49 + OpStore %48 %50 + OpStore %51 %9 + OpStore %52 %9 + OpBranch %53 + %53 = OpLabel + OpLoopMerge %55 %56 None + OpBranch %57 + %57 = OpLabel + %58 = OpLoad %6 %52 + %59 = OpSLessThan %36 %58 %46 + OpBranchConditional %59 %54 %55 + %54 = OpLabel + %60 = OpLoad %6 %51 + %61 = OpAccessChain %33 %32 %9 + %62 = OpLoad %6 %61 + %63 = OpSGreaterThanEqual %36 %60 %62 + OpSelectionMerge %65 None + OpBranchConditional %63 %64 %65 + %64 = OpLabel + OpBranch %55 + %65 = OpLabel + %67 = OpLoad %6 %51 + %68 = OpIAdd %6 %67 %46 + OpStore %51 %68 + %70 = OpLoad %12 %14 + OpStore %69 %70 + OpStore %71 %9 + OpStore %72 %9 + OpBranch %73 + %73 = OpLabel + OpLoopMerge %75 %76 None + OpBranch %77 + %77 = OpLabel + %78 = OpLoad %6 %48 + %79 = OpSLessThan %36 %46 %78 + OpBranchConditional %79 %74 %75 + %74 = OpLabel + OpStore %80 %9 + %81 = OpLoad %6 %72 + %82 = OpSGreaterThanEqual %36 %81 %9 + %83 = OpLoad %6 %72 + %85 = OpSLessThan %36 %83 %84 + %86 = OpLogicalAnd %36 %82 %85 + %87 = OpLoad %6 %72 + %88 = OpSelect %6 %86 %87 %9 + %89 = OpLoad %6 %80 + %90 = OpSGreaterThanEqual %36 %89 %9 + %91 = OpLoad %6 %80 + %93 = OpSLessThan %36 %91 %92 + %94 = OpLogicalAnd %36 %90 %93 + %95 = OpLoad %6 %80 + %96 = OpSelect %6 %94 %95 %9 + %98 = OpAccessChain %97 %69 %88 %96 + OpStore %98 %15 + OpBranch %76 + %76 = OpLabel + %99 = OpLoad %6 %72 + %100 = OpIAdd %6 %99 %46 + OpStore %72 %100 + OpBranch %73 + %75 = OpLabel + %106 = OpLoad %6 %8 + %107 = OpSGreaterThanEqual %36 %106 %9 + %108 = OpLoad %6 %8 + %110 = OpSLessThan %36 %108 %109 + %111 = OpLogicalAnd %36 %107 %110 + %112 = OpLoad %6 %8 + %113 = OpSelect %6 %111 %112 %9 + %114 = OpLoad %6 %52 + %116 = OpAccessChain %97 %14 %114 %115 + %117 = OpLoad %10 %116 + %118 = OpAccessChain %97 %105 %113 + %119 = OpLoad %10 %118 + %120 = OpFAdd %10 %119 %117 + %121 = OpAccessChain %97 %105 %113 + OpStore %121 %120 + OpBranch %56 + %56 = OpLabel + %122 = OpLoad %6 %52 + %123 = OpIAdd %6 %122 %46 + OpStore %52 %123 + OpBranch %53 + %55 = OpLabel + %124 = OpLoad %6 %8 + %125 = OpIAdd %6 %124 %46 + OpStore %8 %125 + OpBranch %28 + %28 = OpLabel + OpBranch %25 + %27 = OpLabel + OpReturn + OpFunctionEnd +END + +# uniforms for variant + +# injected +BUFFER variant_injected DATA_TYPE int32 DATA + 1 +END + +BUFFER framebuffer FORMAT B8G8R8A8_UNORM + +PIPELINE graphics gfz_pipeline + ATTACH variant_vertex_shader + ATTACH variant_fragment_shader + FRAMEBUFFER_SIZE 256 256 + BIND BUFFER framebuffer AS color LOCATION 0 + BIND BUFFER variant_injected AS uniform DESCRIPTOR_SET 0 BINDING 0 +END +CLEAR_COLOR gfz_pipeline 0 0 0 255 + +CLEAR gfz_pipeline +RUN gfz_pipeline DRAW_RECT POS 0 0 SIZE 256 256 +EXPECT framebuffer IDX 0 0 SIZE 256 256 EQ_RGB 255 0 0 \ 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 c92354c..3c99582 100644 --- a/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp +++ b/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp @@ -68,6 +68,7 @@ void createAmberTests (tcu::TestCaseGroup* group) { "unreachable-barrier-in-loops.amber", "unreachable-barrier-in-loops", "A compute shader with an unreachable barrier in a loop nest" }, { "unreachable-loops-in-switch.amber", "unreachable-loops-in-switch", "A fragment shader with unreachable loops in a switch" }, { "while-inside-switch.amber", "while-inside-switch", "A fragment shader that uses a while loop inside a switch" }, + { "write-before-break.amber", "write-before-break", "Fragment shader that writes red before loop break" }, { "write-red-after-search.amber", "write-red-after-search", "A fragment shader performing a search computation, then writing red regardless" }, { "for-condition-always-false.amber", "for-condition-always-false", "A fragment shader that uses a for loop with condition always false" }, }; diff --git a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt index 92d206b..8ce7ec0 100644 --- a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt +++ b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt @@ -466940,6 +466940,7 @@ dEQP-VK.graphicsfuzz.swizzle-struct-init-min dEQP-VK.graphicsfuzz.unreachable-barrier-in-loops dEQP-VK.graphicsfuzz.unreachable-loops-in-switch dEQP-VK.graphicsfuzz.while-inside-switch +dEQP-VK.graphicsfuzz.write-before-break dEQP-VK.graphicsfuzz.write-red-after-search dEQP-VK.graphicsfuzz.for-condition-always-false dEQP-VK.transform_feedback.simple.basic_1_256 diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt index 6844d71..6912cda 100644 --- a/external/vulkancts/mustpass/master/vk-default.txt +++ b/external/vulkancts/mustpass/master/vk-default.txt @@ -466787,6 +466787,7 @@ dEQP-VK.graphicsfuzz.swizzle-struct-init-min dEQP-VK.graphicsfuzz.unreachable-barrier-in-loops dEQP-VK.graphicsfuzz.unreachable-loops-in-switch dEQP-VK.graphicsfuzz.while-inside-switch +dEQP-VK.graphicsfuzz.write-before-break dEQP-VK.graphicsfuzz.write-red-after-search dEQP-VK.graphicsfuzz.for-condition-always-false dEQP-VK.transform_feedback.simple.basic_1_256 -- 2.7.4