Call computeFixedPointError only for fixed point case
authorMohankumar Nekkarakalaya <mnekkara@qti.qualcomm.com>
Wed, 7 Jul 2021 23:00:03 +0000 (16:00 -0700)
committerMohankumar Nekkarakalaya <mnekkara@qti.qualcomm.com>
Wed, 7 Jul 2021 23:22:30 +0000 (16:22 -0700)
Calling computeFixedPointError for integer case (numAccurateBits=32)
is incorrect and causes crash.
Added assert to make sure numAccurateBits is in legal range.

Affected tests: dEQP-VK.sparse_resources.image_sparse_residency.*

Components: Vulkan

VK-GL-CTS issue: 2994

Change-Id: Ib357cbbbda0f7980ec2d7115053cabc6825a18d3

external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesImageMemoryAliasing.cpp
external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesImageSparseResidency.cpp
external/vulkancts/modules/vulkan/ycbcr/vktYCbCrStorageImageWriteTests.cpp
framework/common/tcuTexVerifierUtil.cpp

index 858eb58..02b5836 100755 (executable)
@@ -724,8 +724,7 @@ tcu::TestStatus ImageSparseMemoryAliasingInstance::iterate (void)
                        if (aspectIndex == NO_MATCH_FOUND)
                                TCU_THROW(NotSupportedError, "Not supported image aspect");
 
-                       VkSparseImageMemoryRequirements         aspectRequirements      = sparseMemoryRequirements[aspectIndex];
-                       float                                                           fixedPointError         = tcu::TexVerifierUtil::computeFixedPointError(formatDescription.channels[channelNdx].sizeBits);;
+                       VkSparseImageMemoryRequirements aspectRequirements      = sparseMemoryRequirements[aspectIndex];
 
                        for (deUint32 mipmapNdx = 0; mipmapNdx < aspectRequirements.imageMipTailFirstLod; ++mipmapNdx)
                        {
@@ -772,6 +771,7 @@ tcu::TestStatus ImageSparseMemoryAliasingInstance::iterate (void)
                                                case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
                                                case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
                                                {
+                                                       float fixedPointError = tcu::TexVerifierUtil::computeFixedPointError(formatDescription.channels[channelNdx].sizeBits);
                                                        acceptableError += fixedPointError;
                                                        const tcu::Vec4 outputValue = pixelBuffer.getPixel(offsetX * pixelDivider.x(), offsetY * pixelDivider.y(), offsetZ * pixelDivider.z());
 
index cafb299..9bfa282 100755 (executable)
@@ -774,7 +774,6 @@ tcu::TestStatus ImageSparseResidencyInstance::iterate (void)
                        tcu::ConstPixelBufferAccess             pixelBuffer                                     = vk::getChannelAccess(compatibleFormatDescription, compatibleShaderGridSize, planeRowPitches, (const void* const*)planePointers, channelNdx);
                        VkExtent3D                                              planeExtent                                     = getPlaneExtent(compatibleFormatDescription, compatibleImageSize, planeNdx, 0u);
                        tcu::IVec3                                              pixelDivider                            = pixelBuffer.getDivider();
-                       float                                                   fixedPointError                         = tcu::TexVerifierUtil::computeFixedPointError(formatDescription.channels[channelNdx].sizeBits);
 
                        if( aspectRequirements.imageMipTailFirstLod > 0u )
                        {
@@ -848,6 +847,7 @@ tcu::TestStatus ImageSparseResidencyInstance::iterate (void)
                                                                        case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
                                                                        case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
                                                                        {
+                                        float fixedPointError = tcu::TexVerifierUtil::computeFixedPointError(formatDescription.channels[channelNdx].sizeBits);
                                                                                acceptableError += fixedPointError;
                                                                                const tcu::Vec4 outputValue = pixelBuffer.getPixel(offsetX * pixelDivider.x(), offsetY * pixelDivider.y(), offsetZ * pixelDivider.z());
 
@@ -892,6 +892,7 @@ tcu::TestStatus ImageSparseResidencyInstance::iterate (void)
                                                                        case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
                                                                        case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
                                                                        {
+                                                                               float fixedPointError = tcu::TexVerifierUtil::computeFixedPointError(formatDescription.channels[channelNdx].sizeBits);
                                                                                acceptableError += fixedPointError;
                                                                                const tcu::Vec4 outputValue = pixelBuffer.getPixel(offsetX * pixelDivider.x(), offsetY * pixelDivider.y(), offsetZ * pixelDivider.z());
 
@@ -961,6 +962,7 @@ tcu::TestStatus ImageSparseResidencyInstance::iterate (void)
                                                case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
                                                case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
                                                {
+                                                       float fixedPointError = tcu::TexVerifierUtil::computeFixedPointError(formatDescription.channels[channelNdx].sizeBits);
                                                        acceptableError += fixedPointError;
                                                        const tcu::Vec4 outputValue = pixelBuffer.getPixel(offsetX * pixelDivider.x(), offsetY * pixelDivider.y(), offsetZ * pixelDivider.z());
 
index ec48454..aa160c5 100644 (file)
@@ -383,7 +383,6 @@ tcu::TestStatus testStorageImageWrite (Context& context, TestParameters params)
                tcu::ConstPixelBufferAccess                     pixelBuffer                                     = vk::getChannelAccess(compatibleFormatDescription, compatibleShaderGridSize, planeRowPitches, (const void* const*)planePointers, channelNdx);
                VkExtent3D                                                      planeExtent                                     = getPlaneExtent(compatibleFormatDescription, compatibleImageSize, planeNdx, 0u);
                tcu::IVec3                                                      pixelDivider                            = pixelBuffer.getDivider();
-               float                                                           fixedPointError                         = tcu::TexVerifierUtil::computeFixedPointError(formatDescription.channels[channelNdx].sizeBits);
 
                for (deUint32 offsetZ = 0u; offsetZ < planeExtent.depth; ++offsetZ)
                for (deUint32 offsetY = 0u; offsetY < planeExtent.height; ++offsetY)
@@ -428,6 +427,7 @@ tcu::TestStatus testStorageImageWrite (Context& context, TestParameters params)
                                case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
                                case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
                                {
+                                       float fixedPointError = tcu::TexVerifierUtil::computeFixedPointError(formatDescription.channels[channelNdx].sizeBits);
                                        acceptableError += fixedPointError;
                                        tcu::Vec4 outputValue = pixelBuffer.getPixel(offsetX * pixelDivider.x(), offsetY * pixelDivider.y(), 0);
 
index 425e037..004345d 100644 (file)
@@ -31,6 +31,9 @@ namespace TexVerifierUtil
 
 float computeFloatingPointError (const float value, const int numAccurateBits)
 {
+       DE_ASSERT(numAccurateBits >= 0);
+       DE_ASSERT(numAccurateBits <= 23);
+
        const int               numGarbageBits  = 23-numAccurateBits;
        const deUint32  mask                    = (1u<<numGarbageBits)-1u;
        const int               exp                             = tcu::Float32(value).exponent();