Avoid division by zero in calculateThreshold
authorJari Komppa <jari.komppa@siru.fi>
Tue, 4 Jan 2022 14:53:26 +0000 (16:53 +0200)
committerMatthew Netsch <quic_mnetsch@quicinc.com>
Thu, 13 Jan 2022 22:25:28 +0000 (22:25 +0000)
The es31fCopyImageTests.cpp calculateThreshold function was written in a
too clever way, leading to division by zero in cases where texture
format did not include all channels.

Affects:
dEQP-GLES31.functional.copy_image.*_renderbuffer

Components: OpenGL
VK-GL-CTS issue: 3328

Change-Id: Iaf6b0d80f7427fee3567365603ba8dbd375f206d

modules/gles31/functional/es31fCopyImageTests.cpp

index c117fd2..a54a26c 100644 (file)
@@ -1653,8 +1653,13 @@ Vec4 calculateThreshold (const tcu::TextureFormat& sourceFormat, const tcu::Text
        {
                const tcu::IVec4        srcBits         = tcu::getTextureFormatBitDepth(sourceFormat);
                const tcu::IVec4        readBits        = tcu::getTextureFormatBitDepth(readPixelsFormat);
+               const tcu::IVec4        minBits         = tcu::min(srcBits, readBits);
 
-               return Vec4(1.0f) / ((tcu::IVec4(1) << (tcu::min(srcBits, readBits))) - tcu::IVec4(1)).cast<float>();
+               return Vec4(
+                       minBits[0] ? 1.0f / (float)((1 << minBits[0]) - 1) : 0,
+                       minBits[1] ? 1.0f / (float)((1 << minBits[1]) - 1) : 0,
+                       minBits[2] ? 1.0f / (float)((1 << minBits[2]) - 1) : 0,
+                       minBits[3] ? 1.0f / (float)((1 << minBits[3]) - 1) : 0);
        }
 }