Fix results-check for floating-point intermediate atomic operations
authorLiam Middlebrook <lmiddlebrook@nvidia.com>
Fri, 23 Oct 2020 02:09:22 +0000 (19:09 -0700)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Wed, 18 Nov 2020 07:52:48 +0000 (02:52 -0500)
This commit fixes the results checking function for a set of tests that
verify atomic operations on floating-point formats. Previously when
compiled with GCC 4.8.4 the generated code would store incorrect values
into `resultValues[i]` rather than correctly interpreting the uint32_t
input data as a float and converting to a uint32_t before storing in
`resultValues[i]`.

Affects:
dEQP-VK.image.atomic_operations.add*r32f*
dEQP-VK.image.atomic_operations.exchange*r32f*

Components: Vulkan

VK-GL-CTS issue: 2632

Change-Id: I34e55d8ef109b5a14bda86d28821a0053c874546

external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp

index fb48319..5a21588 100644 (file)
@@ -1530,13 +1530,14 @@ bool BinaryAtomicIntermValuesInstance::areValuesCorrect(tcu::ConstPixelBufferAcc
        for (deInt32 i = 0; i < static_cast<deInt32>(NUM_INVOCATIONS_PER_PIXEL); i++)
        {
                IVec3 gid(x + i*gridSize.x(), y, z);
-
-               resultValues[i] = *((T*)resultBuffer.getPixelPtr(gid.x(), gid.y(), gid.z()));
+               T data = *((T*)resultBuffer.getPixelPtr(gid.x(), gid.y(), gid.z()));
                if (isFloatingPoint)
                {
-                       float *floatPtr = reinterpret_cast<float*>(&resultValues[i]);
-                       resultValues[i] = static_cast<T>(*floatPtr);
+                       float fData;
+                       deMemcpy(&fData, &data, sizeof(fData));
+                       data = static_cast<T>(fData);
                }
+               resultValues[i] = data;
                atomicArgs[i]   = getAtomicFuncArgument<T>(m_operation, gid, extendedGridSize);
                argsUsed[i]             = false;
        }