From: Matthew Netsch Date: Fri, 26 Feb 2021 19:51:41 +0000 (-0800) Subject: Fixes ycbcr copy tests using NaNs X-Git-Tag: upstream/1.3.5~679^2~3^2^2~1^2^2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e1c347d5490dc9266fc205b7b1fe4cc3193dfe10;p=platform%2Fupstream%2FVK-GL-CTS.git Fixes ycbcr copy tests using NaNs Removes NaNs from the source images Components: Vulkan VK-GL-CTS issue: 2772 Affects: dEQP-VK.ycbcr.copy.* Change-Id: I52d279633e081ecce0ef93681c4d199296de6107 --- diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrCopyTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrCopyTests.cpp index 98b0642..aba0dd8 100644 --- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrCopyTests.cpp +++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrCopyTests.cpp @@ -587,13 +587,15 @@ tcu::TestStatus imageCopyTest (Context& context, const TestConfig config) vector 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()); diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp index 0da5f69..17d0b79 100644 --- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp +++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp @@ -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(maskStride)) == 0u)) ? mask : noMask; + + planePtr[ndx] = randomGen->getUint8() & finalMask; + } } } diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.hpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.hpp index bf0f754..e24f7ef 100644 --- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.hpp +++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.hpp @@ -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);