Lower precision required for texture-lookups
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Tue, 1 Sep 2020 16:04:25 +0000 (18:04 +0200)
committerErik Faye-Lund <erik.faye-lund@collabora.com>
Wed, 2 Sep 2020 11:12:05 +0000 (13:12 +0200)
The KHR-GL33.nearest_edge.offset_right test uses an offset of 0.499 to
avoid sampling to close to the edge for rounding issues. This means that
texture sampling requires 9 or more bits of fractional precision. But
some hardware only provides 8 bits of precision, which is what D3D12
requires.

So let's instead calculate this value a bit more carefully, as follows:

0.5 - 2^-8

Components: OpenGL

Affects tests:
KHR-GL33.nearest_edge.offset_right

Fixes: https://github.com/KhronosGroup/VK-GL-CTS/issues/225
external/openglcts/modules/common/glcNearestEdgeTests.cpp

index dfd92bb350f36d11a87e16a3d1cb2b3501923500..0f269f9f45ff8a2a421c9798d122ce3d05fe7ef9 100644 (file)
@@ -42,6 +42,7 @@
 #include <map>
 #include <algorithm>
 #include <memory>
+#include <cmath>
 
 namespace glcts
 {
@@ -285,8 +286,9 @@ void NearestEdgeTestCase::renderQuad ()
 
        // Apply offset of almost half a texel to the texture coordinates.
        DE_ASSERT(m_offsetSign == 1.0f || m_offsetSign == -1.0f);
-       const float offsetWidth         = 0.499f / static_cast<float>(m_width);
-       const float offsetHeight        = 0.499f / static_cast<float>(m_height);
+       const float offset                      = 0.5f - pow(2.0f, -8.0f);
+       const float offsetWidth         = offset / static_cast<float>(m_width);
+       const float offsetHeight        = offset / static_cast<float>(m_height);
 
        minU += m_offsetSign * offsetWidth;
        maxU += m_offsetSign * offsetWidth;