{
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)
{
"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
*//*--------------------------------------------------------------------*/
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
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;
}
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;
}