Fix mediump zero division in matrix inverse tests
authorIgor Ostrowski <igor.ostrowski@intel.com>
Wed, 15 Nov 2017 17:33:51 +0000 (18:33 +0100)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 14 Dec 2017 09:32:02 +0000 (04:32 -0500)
To avoid zero division all input matrix determinants should be same signed.

Affects:
dEQP-VK.glsl.matrix.inverse.*

Components: Vulkan
VK-GL-CTS issue: 881

Change-Id: Ib702f81c4eb7f25ba9081db6ead67da02f484ca9

external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderMatrixTests.cpp

index 4d40ddf..e5511c9 100644 (file)
@@ -1434,10 +1434,10 @@ ShaderMatrixInstance::ShaderMatrixInstance (Context&                            context,
        for (int attribNdx = 0; attribNdx < 4; attribNdx++)
        {
                m_userAttribTransforms[attribNdx] = Mat4(0.0f);
-               m_userAttribTransforms[attribNdx](                  0, 3) = 0.2f;                                                               // !< prevent matrix*vec from going into zero (assuming vec.w != 0)
-               m_userAttribTransforms[attribNdx](                  1, 3) = 0.1f;                                                               // !<
-               m_userAttribTransforms[attribNdx](                  2, 3) = 0.4f + 0.15f * float(attribNdx);    // !<
-               m_userAttribTransforms[attribNdx](                  3, 3) = 0.7f;                                                               // !<
+               m_userAttribTransforms[attribNdx](                  0, 3) = (op == OP_INVERSE ? -0.5f : 0.2f);  // prevent matrix*vec from going into zero (assuming vec.w != 0).
+               m_userAttribTransforms[attribNdx](                  1, 3) = (op == OP_INVERSE ? -1.3f : 0.1f);  // Modified input for OP_INVERSE case, as determinant of final input
+               m_userAttribTransforms[attribNdx](                  2, 3) = 0.4f + 0.15f * float(attribNdx);    // matrix is spanning both sides of 0, so 0 (and division by 0) may happen on mediump.
+               m_userAttribTransforms[attribNdx](                  3, 3) = (op == OP_INVERSE ? -3.0f : 0.7f);  // Modified OP_INVERSE final input matrix is same signed in whole input range.
                m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f;
                m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f;
                m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f;