Fixes ycbcr copy tests using NaNs
authorMatthew Netsch <quic_mnetsch@quicinc.com>
Fri, 26 Feb 2021 19:51:41 +0000 (11:51 -0800)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Wed, 26 May 2021 06:59:54 +0000 (06:59 +0000)
Removes NaNs from the source images

Components: Vulkan
VK-GL-CTS issue: 2772

Affects:
dEQP-VK.ycbcr.copy.*

Change-Id: I52d279633e081ecce0ef93681c4d199296de6107

external/vulkancts/modules/vulkan/ycbcr/vktYCbCrCopyTests.cpp
external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.hpp

index 98b0642..aba0dd8 100644 (file)
@@ -587,13 +587,15 @@ tcu::TestStatus imageCopyTest (Context& context, const TestConfig config)
                vector<vk::VkImageCopy> copies;
 
                de::Random                              rng                     (buildSeed(config));
+               const bool                              noNan           = true;
 
                genCopies(rng, copyCount, config.src.format, config.src.size, config.dst.format, config.dst.size, &copies);
 
                logTestCaseInfo(log, config, copies);
 
-               fillRandom(&rng, &srcData);
-               fillRandom(&rng, &dstData);
+               // To avoid putting NaNs in dst in the image copy
+               fillRandom(&rng, &srcData, config.dst.format, noNan);
+               fillRandom(&rng, &dstData, config.dst.format, noNan);
 
                {
                        const vk::DeviceInterface&              vkd                                             (context.getDeviceInterface());
index 0da5f69..17d0b79 100644 (file)
@@ -226,17 +226,59 @@ void checkImageSupport (Context& context, VkFormat format, VkImageCreateFlags cr
        }
 }
 
-void fillRandom (de::Random* randomGen, MultiPlaneImageData* imageData)
+// When noNan is true, fillRandom does not generate NaNs in float formats.
+// But as a side effect, it also takes out infinities as well as almost half of the largest-magnitude values.
+void fillRandom (de::Random* randomGen, MultiPlaneImageData* imageData, const vk::VkFormat format, const bool noNan)
 {
        // \todo [pyry] Optimize, take into account bits that must be 0
 
+       deUint8 mask, maskStride;
+       const deUint8 noMask = 0xffu;
+
+       switch (format)
+       {
+               case vk::VK_FORMAT_B10G11R11_UFLOAT_PACK32:
+                       mask            = 0xbb;
+                       maskStride      = 1;
+                       break;
+               case vk::VK_FORMAT_R16_SFLOAT:
+               case vk::VK_FORMAT_R16G16_SFLOAT:
+               case vk::VK_FORMAT_R16G16B16_SFLOAT:
+               case vk::VK_FORMAT_R16G16B16A16_SFLOAT:
+                       mask            = 0xbf;
+                       maskStride      = 2;
+                       break;
+               case vk::VK_FORMAT_R32_SFLOAT:
+               case vk::VK_FORMAT_R32G32_SFLOAT:
+               case vk::VK_FORMAT_R32G32B32_SFLOAT:
+               case vk::VK_FORMAT_R32G32B32A32_SFLOAT:
+                       mask            = 0xbf;
+                       maskStride      = 4;
+                       break;
+               case vk::VK_FORMAT_R64_SFLOAT:
+               case vk::VK_FORMAT_R64G64_SFLOAT:
+               case vk::VK_FORMAT_R64G64B64_SFLOAT:
+               case vk::VK_FORMAT_R64G64B64A64_SFLOAT:
+                       mask            = 0xbf;
+                       maskStride      = 8;
+                       break;
+               default:
+                       mask            = 0xff;
+                       maskStride      = 1;
+                       break;
+       }
+
        for (deUint32 planeNdx = 0; planeNdx < imageData->getDescription().numPlanes; ++planeNdx)
        {
                const size_t    planeSize       = imageData->getPlaneSize(planeNdx);
                deUint8* const  planePtr        = (deUint8*)imageData->getPlanePtr(planeNdx);
 
                for (size_t ndx = 0; ndx < planeSize; ++ndx)
-                       planePtr[ndx] = randomGen->getUint8();
+               {
+                       const deUint8 finalMask = (noNan && ((ndx % static_cast<size_t>(maskStride)) == 0u)) ? mask : noMask;
+
+                       planePtr[ndx] = randomGen->getUint8() & finalMask;
+               }
        }
 }
 
index bf0f754..e24f7ef 100644 (file)
@@ -84,7 +84,7 @@ private:
 
 void                                                                           checkImageSupport                       (Context& context, vk::VkFormat format, vk::VkImageCreateFlags createFlags, vk::VkImageTiling tiling = vk::VK_IMAGE_TILING_OPTIMAL);
 
-void                                                                           fillRandom                                      (de::Random* randomGen, MultiPlaneImageData* imageData);
+void                                                                           fillRandom                                      (de::Random* randomGen, MultiPlaneImageData* imageData, const vk::VkFormat format = vk::VK_FORMAT_UNDEFINED, bool noNan = false);
 void                                                                           fillGradient                            (MultiPlaneImageData* imageData, const tcu::Vec4& minVal, const tcu::Vec4& maxVal);
 void                                                                           fillZero                                        (MultiPlaneImageData* imageData);