From 658bcdaa15cfe3b39c3f16cd1e34bb7491324a5f Mon Sep 17 00:00:00 2001 From: Alexander Galazin Date: Wed, 4 Oct 2017 18:04:31 +0200 Subject: [PATCH] Fix result verification in loop_control tests Add some epsilon to float comparisons Component: Vulkan VK-GL-CTS issue: 742 Affects: dEQP-VK.spirv_assembly.instruction.compute.loop_control.* Change-Id: Iee88abe4946626e3c1c9656ab08092c04c0181d6 --- .../vktSpvAsmComputeShaderTestUtil.cpp | 37 ++++++++++++++++++++++ .../vktSpvAsmComputeShaderTestUtil.hpp | 5 +++ .../spirv_assembly/vktSpvAsmLoopDepInfTests.cpp | 3 +- .../spirv_assembly/vktSpvAsmLoopDepLenTests.cpp | 3 +- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp index d3ad3f3..cc2f1d3 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp @@ -27,6 +27,37 @@ namespace vkt { namespace SpirVAssembly { +namespace +{ +bool verifyOutputWithEpsilon (const std::vector& outputAllocs, const std::vector& expectedOutputs, tcu::TestLog& log, const float epsilon) +{ + DE_ASSERT(outputAllocs.size() != 0); + DE_ASSERT(outputAllocs.size() == expectedOutputs.size()); + + for (size_t outputNdx = 0; outputNdx < outputAllocs.size(); ++outputNdx) + { + std::vector expectedBytes; + expectedOutputs[outputNdx]->getBytes(expectedBytes); + + std::vector expectedFloats (expectedBytes.size() / sizeof (float)); + std::vector actualFloats (expectedBytes.size() / sizeof (float)); + + memcpy(&expectedFloats[0], &expectedBytes.front(), expectedBytes.size()); + memcpy(&actualFloats[0], outputAllocs[outputNdx]->getHostPtr(), expectedBytes.size()); + for (size_t floatNdx = 0; floatNdx < actualFloats.size(); ++floatNdx) + { + // Use custom epsilon because of the float->string conversion + if (fabs(expectedFloats[floatNdx] - actualFloats[floatNdx]) > epsilon) + { + log << tcu::TestLog::Message << "Error: The actual and expected values not matching." + << " Expected: " << expectedFloats[floatNdx] << " Actual: " << actualFloats[floatNdx] << " Epsilon: " << epsilon << tcu::TestLog::EndMessage; + return false; + } + } + } + return true; +} +} const char* getComputeAsmShaderPreamble (void) { @@ -84,5 +115,11 @@ const char* getComputeAsmInputOutputBufferTraits (void) "OpMemberDecorate %buf 0 Offset 0\n"; } +bool verifyOutput (const std::vector&, const std::vector& outputAllocs, const std::vector& expectedOutputs, tcu::TestLog& log) +{ + const float epsilon = 0.00001f; + return verifyOutputWithEpsilon(outputAllocs, expectedOutputs, log, epsilon); +} + } // SpirVAssembly } // vkt diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp index 2e871ef..d675c8e 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp @@ -267,6 +267,11 @@ const char* getComputeAsmInputOutputBuffer (void); *//*--------------------------------------------------------------------*/ const char* getComputeAsmInputOutputBufferTraits (void); +bool verifyOutput (const std::vector&, + const std::vector& outputAllocs, + const std::vector& expectedOutputs, + tcu::TestLog& log); + } // SpirVAssembly } // vkt diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepInfTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepInfTests.cpp index c2c6e2e..b988eac 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepInfTests.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepInfTests.cpp @@ -174,7 +174,8 @@ static ComputeShaderSpec getComputeShaderSpec () spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats))); spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats))); - spec.numWorkGroups = tcu::IVec3(numElements, 1, 1); + spec.numWorkGroups = tcu::IVec3(numElements, 1, 1); + spec.verifyIO = &verifyOutput; return spec; } diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepLenTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepLenTests.cpp index 935dbc2..f9f3306 100644 --- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepLenTests.cpp +++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepLenTests.cpp @@ -189,7 +189,8 @@ static ComputeShaderSpec getComputeShaderSpec () spec.inputs.push_back(BufferSp(new Float32Buffer(inputFloats))); spec.outputs.push_back(BufferSp(new Float32Buffer(outputFloats))); - spec.numWorkGroups = tcu::IVec3(numElements, 1, 1); + spec.numWorkGroups = tcu::IVec3(numElements, 1, 1); + spec.verifyIO = &verifyOutput; return spec; } -- 2.7.4