Fix result verification in loop_control tests
authorAlexander Galazin <alexander.galazin@arm.com>
Wed, 4 Oct 2017 16:04:31 +0000 (18:04 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 6 Oct 2017 07:37:07 +0000 (03:37 -0400)
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

external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepInfTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmLoopDepLenTests.cpp

index d3ad3f3..cc2f1d3 100644 (file)
@@ -27,6 +27,37 @@ namespace vkt
 {
 namespace SpirVAssembly
 {
+namespace
+{
+bool verifyOutputWithEpsilon (const std::vector<AllocationSp>& outputAllocs, const std::vector<BufferSp>& 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<deUint8>    expectedBytes;
+               expectedOutputs[outputNdx]->getBytes(expectedBytes);
+
+               std::vector<float>      expectedFloats  (expectedBytes.size() / sizeof (float));
+               std::vector<float>      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<BufferSp>&, const std::vector<AllocationSp>& outputAllocs, const std::vector<BufferSp>& expectedOutputs, tcu::TestLog& log)
+{
+       const float     epsilon = 0.00001f;
+       return verifyOutputWithEpsilon(outputAllocs, expectedOutputs, log, epsilon);
+}
+
 } // SpirVAssembly
 } // vkt
index 2e871ef..d675c8e 100644 (file)
@@ -267,6 +267,11 @@ const char* getComputeAsmInputOutputBuffer                 (void);
  *//*--------------------------------------------------------------------*/
 const char* getComputeAsmInputOutputBufferTraits       (void);
 
+bool verifyOutput                                                                      (const std::vector<BufferSp>&,
+                                                                                                       const std::vector<AllocationSp>& outputAllocs,
+                                                                                                       const std::vector<BufferSp>&            expectedOutputs,
+                                                                                                       tcu::TestLog&                                           log);
+
 } // SpirVAssembly
 } // vkt
 
index c2c6e2e..b988eac 100644 (file)
@@ -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;
 }
index 935dbc2..f9f3306 100644 (file)
@@ -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;
 }