From b8a5c96b5ebb21a9789671d0b2144ec5d92226a2 Mon Sep 17 00:00:00 2001 From: Venni Ihanakangas Date: Mon, 14 Oct 2019 15:32:08 +0300 Subject: [PATCH] dEQP-VK.graphicsfuzz.undefined-assign-in-infinite-loop Components: Vulkan New Tests: dEQP-VK.graphicsfuzz.undefined-assign-in-infinite-loop Change-Id: I8dac4a3fe6570bf3a38de206434af534862e0544 --- android/cts/master/vk-master.txt | 2 +- .../undefined-assign-in-infinite-loop.amber | 164 +++++++++++++++++++++ .../vulkan/amber/vktAmberGraphicsFuzzTests.cpp | 2 +- .../mustpass/master/vk-default-no-waivers.txt | 2 +- external/vulkancts/mustpass/master/vk-default.txt | 2 +- 5 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 external/vulkancts/data/vulkan/amber/graphicsfuzz/undefined-assign-in-infinite-loop.amber diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 154a0ca..1315828 100644 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -521001,6 +521001,7 @@ dEQP-VK.graphicsfuzz.two-nested-do-whiles dEQP-VK.graphicsfuzz.two-nested-for-loops-with-returns dEQP-VK.graphicsfuzz.two-nested-infinite-loops-discard dEQP-VK.graphicsfuzz.uninitialized-var-decrement-and-add +dEQP-VK.graphicsfuzz.undefined-assign-in-infinite-loop dEQP-VK.graphicsfuzz.unreachable-barrier-in-loops dEQP-VK.graphicsfuzz.unreachable-continue-statement dEQP-VK.graphicsfuzz.unreachable-discard-statement-in-if @@ -521010,7 +521011,6 @@ dEQP-VK.graphicsfuzz.unreachable-loops-in-switch dEQP-VK.graphicsfuzz.unreachable-return-in-loop dEQP-VK.graphicsfuzz.while-inside-switch dEQP-VK.graphicsfuzz.write-before-break -dEQP-VK.graphicsfuzz.write-red-after-search dEQP-VK.graphicsfuzz.write-red-in-loop-nest dEQP-VK.graphicsfuzz.wrong-color-in-always-false-if dEQP-VK.transform_feedback.simple.basic_1_256 diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/undefined-assign-in-infinite-loop.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/undefined-assign-in-infinite-loop.amber new file mode 100644 index 0000000..59b08f6 --- /dev/null +++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/undefined-assign-in-infinite-loop.amber @@ -0,0 +1,164 @@ +#!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 fragment shader with uninitialized read in infinite loop + +# The test passes because the shader always writes the color red. Uninitialized read in loop is never reached. + +SHADER vertex variant_vertex_shader PASSTHROUGH + +# variant_fragment_shader is derived from the following GLSL: +# #version 310 es +# precision highp float; +# +# layout(set = 0, binding = 0) uniform buf0 { +# vec2 injectionSwitch; +# }; +# +# layout(location = 0) out vec4 _GLF_color; +# +# +# void main() +# { +# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0); // Write color red +# +# int donor_replacementGLF_dead6tree[1]; +# int GLF_dead6currentNode; +# int GLF_dead6index = 0; +# +# if (injectionSwitch.y < 0.0){ // always false +# while (true) +# { +# GLF_dead6currentNode = donor_replacementGLF_dead6tree[GLF_dead6index]; +# GLF_dead6index = GLF_dead6currentNode; +# } +# } +# } +SHADER fragment variant_fragment_shader SPIRV-ASM +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 44 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %9 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %9 "_GLF_color" + OpName %15 "GLF_dead6index" + OpName %18 "buf0" + OpMemberName %18 0 "injectionSwitch" + OpName %20 "" + OpName %36 "GLF_dead6currentNode" + OpName %39 "donor_replacementGLF_dead6tree" + OpDecorate %9 Location 0 + OpDecorate %15 RelaxedPrecision + OpMemberDecorate %18 0 Offset 0 + OpDecorate %18 Block + OpDecorate %20 DescriptorSet 0 + OpDecorate %20 Binding 0 + OpDecorate %36 RelaxedPrecision + OpDecorate %39 RelaxedPrecision + OpDecorate %40 RelaxedPrecision + OpDecorate %42 RelaxedPrecision + OpDecorate %43 RelaxedPrecision + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %7 = OpTypeVector %6 4 + %8 = OpTypePointer Output %7 + %9 = OpVariable %8 Output + %10 = OpConstant %6 1 + %11 = OpConstant %6 0 + %12 = OpConstantComposite %7 %10 %11 %11 %10 + %13 = OpTypeInt 32 1 + %14 = OpTypePointer Function %13 + %16 = OpConstant %13 0 + %17 = OpTypeVector %6 2 + %18 = OpTypeStruct %17 + %19 = OpTypePointer Uniform %18 + %20 = OpVariable %19 Uniform + %21 = OpTypeInt 32 0 + %22 = OpConstant %21 1 + %23 = OpTypePointer Uniform %6 + %26 = OpTypeBool + %35 = OpConstantTrue %26 + %37 = OpTypeArray %13 %22 + %38 = OpTypePointer Function %37 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %15 = OpVariable %14 Function + %36 = OpVariable %14 Function + %39 = OpVariable %38 Function + OpStore %9 %12 + OpStore %15 %16 + %24 = OpAccessChain %23 %20 %16 %22 + %25 = OpLoad %6 %24 + %27 = OpFOrdLessThan %26 %25 %11 + OpSelectionMerge %29 None + OpBranchConditional %27 %28 %29 + %28 = OpLabel + OpBranch %30 + %30 = OpLabel + OpLoopMerge %32 %33 None + OpBranch %34 + %34 = OpLabel + OpBranchConditional %35 %31 %32 + %31 = OpLabel + %40 = OpLoad %13 %15 + %41 = OpAccessChain %14 %39 %40 + %42 = OpLoad %13 %41 + OpStore %36 %42 + %43 = OpLoad %13 %36 + OpStore %15 %43 + OpBranch %33 + %33 = OpLabel + OpBranch %30 + %32 = OpLabel + OpBranch %29 + %29 = OpLabel + OpReturn + OpFunctionEnd +END + +# uniforms for variant + +# injectionSwitch +BUFFER variant_injectionSwitch DATA_TYPE vec2 DATA + 0.0 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_injectionSwitch 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/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp b/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp index 07701a7..a63de99 100644 --- a/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp +++ b/external/vulkancts/modules/vulkan/amber/vktAmberGraphicsFuzzTests.cpp @@ -101,6 +101,7 @@ void createAmberTests (tcu::TestCaseGroup* group) { "two-nested-for-loops-with-returns.amber", "two-nested-for-loops-with-returns", "A compute shader with two nested for loops" }, { "two-nested-infinite-loops-discard.amber", "two-nested-infinite-loops-discard", "A fragment shader with an always false if function" }, { "uninitialized-var-decrement-and-add.amber", "uninitialized-var-decrement-and-add", "A fragment shader that uses an uninitialized variable" }, + { "undefined-assign-in-infinite-loop.amber", "undefined-assign-in-infinite-loop", "A fragment shader with uninitialized read in infinite loop" }, { "unreachable-barrier-in-loops.amber", "unreachable-barrier-in-loops", "A compute shader with an unreachable barrier in a loop nest" }, { "unreachable-continue-statement.amber", "unreachable-continue-statement", "A fragment shader with unreachable continue statement" }, { "unreachable-discard-statement-in-if.amber", "unreachable-discard-statement-in-if", "A fragment shader with discard keyword and a return" }, @@ -110,7 +111,6 @@ void createAmberTests (tcu::TestCaseGroup* group) { "unreachable-return-in-loop.amber", "unreachable-return-in-loop", "A fragment shader with an unreachable return in a loop" }, { "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" }, { "write-red-in-loop-nest.amber", "write-red-in-loop-nest", "A fragment shader that writes red in a nest of loops" }, { "wrong-color-in-always-false-if.amber", "wrong-color-in-always-false-if", "A fragment shader with wrong color write in false if" }, }; diff --git a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt index 0f509a8..d1bba07 100644 --- a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt +++ b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt @@ -523344,6 +523344,7 @@ dEQP-VK.graphicsfuzz.two-nested-do-whiles dEQP-VK.graphicsfuzz.two-nested-for-loops-with-returns dEQP-VK.graphicsfuzz.two-nested-infinite-loops-discard dEQP-VK.graphicsfuzz.uninitialized-var-decrement-and-add +dEQP-VK.graphicsfuzz.undefined-assign-in-infinite-loop dEQP-VK.graphicsfuzz.unreachable-barrier-in-loops dEQP-VK.graphicsfuzz.unreachable-continue-statement dEQP-VK.graphicsfuzz.unreachable-discard-statement-in-if @@ -523353,7 +523354,6 @@ dEQP-VK.graphicsfuzz.unreachable-loops-in-switch dEQP-VK.graphicsfuzz.unreachable-return-in-loop dEQP-VK.graphicsfuzz.while-inside-switch dEQP-VK.graphicsfuzz.write-before-break -dEQP-VK.graphicsfuzz.write-red-after-search dEQP-VK.graphicsfuzz.write-red-in-loop-nest dEQP-VK.graphicsfuzz.wrong-color-in-always-false-if 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 b2d399a..4e0d8fa 100644 --- a/external/vulkancts/mustpass/master/vk-default.txt +++ b/external/vulkancts/mustpass/master/vk-default.txt @@ -523191,6 +523191,7 @@ dEQP-VK.graphicsfuzz.two-nested-do-whiles dEQP-VK.graphicsfuzz.two-nested-for-loops-with-returns dEQP-VK.graphicsfuzz.two-nested-infinite-loops-discard dEQP-VK.graphicsfuzz.uninitialized-var-decrement-and-add +dEQP-VK.graphicsfuzz.undefined-assign-in-infinite-loop dEQP-VK.graphicsfuzz.unreachable-barrier-in-loops dEQP-VK.graphicsfuzz.unreachable-continue-statement dEQP-VK.graphicsfuzz.unreachable-discard-statement-in-if @@ -523200,7 +523201,6 @@ dEQP-VK.graphicsfuzz.unreachable-loops-in-switch dEQP-VK.graphicsfuzz.unreachable-return-in-loop dEQP-VK.graphicsfuzz.while-inside-switch dEQP-VK.graphicsfuzz.write-before-break -dEQP-VK.graphicsfuzz.write-red-after-search dEQP-VK.graphicsfuzz.write-red-in-loop-nest dEQP-VK.graphicsfuzz.wrong-color-in-always-false-if dEQP-VK.transform_feedback.simple.basic_1_256 -- 2.7.4