Fix invalid use of intThresholdCompare in fragment_ops tests
authorPyry Haulos <phaulos@google.com>
Tue, 20 Oct 2015 17:03:38 +0000 (10:03 -0700)
committerPyry Haulos <phaulos@google.com>
Tue, 20 Oct 2015 17:06:35 +0000 (10:06 -0700)
Blend and random tests in fragment_ops tests were comparing RGB to RGBA
image using intThresholdCompare, which doesn't work as expected after
recent getPixelInt() fix for RGB8.

Bug: 25111313
Change-Id: Iac27bfcad7fb2ca11d9f4af44418cd1cbd72a2f5

modules/gles2/functional/es2fBlendTests.cpp
modules/gles2/functional/es2fRandomFragmentOpTests.cpp
modules/gles3/functional/es3fBlendTests.cpp
modules/gles3/functional/es3fRandomFragmentOpTests.cpp

index 62165b2..eb4986d 100644 (file)
@@ -29,6 +29,7 @@
 #include "tcuImageCompare.hpp"
 #include "tcuRenderTarget.hpp"
 #include "tcuTestLog.hpp"
+#include "tcuTextureUtil.hpp"
 #include "deRandom.hpp"
 #include "rrFragmentOperations.hpp"
 #include "sglrReferenceUtils.hpp"
@@ -210,6 +211,7 @@ BlendCase::IterateResult BlendCase::iterate (void)
        int                                                             viewportX               = rnd.getInt(0, m_context.getRenderTarget().getWidth() - m_viewportW);
        int                                                             viewportY               = rnd.getInt(0, m_context.getRenderTarget().getHeight() - m_viewportH);
        tcu::Surface                                    renderedImg             (m_viewportW, m_viewportH);
+       tcu::Surface                                    referenceImg    (m_viewportH, m_viewportH);
        TestLog&                                                log                             (m_testCtx.getLog());
        const BlendParams&                              paramSet                = m_paramSets[m_curParamSetNdx];
        rr::FragmentOperationState              referenceState;
@@ -258,6 +260,9 @@ BlendCase::IterateResult BlendCase::iterate (void)
        referenceState.blendMode = rr::BLENDMODE_STANDARD;
        m_referenceRenderer->render(gls::FragmentOpUtil::getMultisampleAccess(m_refColorBuffer->getAccess()), nullAccess /* no depth */, nullAccess /* no stencil */, m_secondQuadInt, referenceState);
 
+       // Expand reference color buffer to RGBA8
+       copy(referenceImg.getAccess(), m_refColorBuffer->getAccess());
+
        // Read GL image.
 
        glu::readPixels(m_context.getRenderContext(), viewportX, viewportY, renderedImg.getAccess());
@@ -267,7 +272,7 @@ BlendCase::IterateResult BlendCase::iterate (void)
        UVec4 compareThreshold = m_context.getRenderTarget().getPixelFormat().getColorThreshold().toIVec().asUint()
                                                         * UVec4(5) / UVec4(2) + UVec4(3); // \note Non-scientific ad hoc formula. Need big threshold when few color bits; blending brings extra inaccuracy.
 
-       bool comparePass = tcu::intThresholdCompare(m_testCtx.getLog(), "CompareResult", "Image Comparison Result", m_refColorBuffer->getAccess(), renderedImg.getAccess(), compareThreshold, tcu::COMPARE_LOG_RESULT);
+       bool comparePass = tcu::intThresholdCompare(m_testCtx.getLog(), "CompareResult", "Image Comparison Result", referenceImg.getAccess(), renderedImg.getAccess(), compareThreshold, tcu::COMPARE_LOG_RESULT);
 
        // Fail now if images don't match.
 
index 6ad221d..847cf37 100644 (file)
@@ -303,6 +303,7 @@ RandomFragmentOpCase::IterateResult RandomFragmentOpCase::iterate (void)
        const int                               viewportY               = rnd.getInt(0, m_context.getRenderTarget().getHeight()-height);
 
        tcu::Surface                    renderedImg             (width, height);
+       tcu::Surface                    referenceImg    (width, height);
 
        const Vec4                              clearColor              = CLEAR_COLOR;
        const float                             clearDepth              = CLEAR_DEPTH;
@@ -363,6 +364,9 @@ RandomFragmentOpCase::IterateResult RandomFragmentOpCase::iterate (void)
                                                          cmd->quad, refState);
        }
 
+       // Expand reference color buffer to RGBA8
+       copy(referenceImg.getAccess(), m_refColorBuffer->getAccess());
+
        // Read rendered image.
        glu::readPixels(m_context.getRenderContext(), viewportX, viewportY, renderedImg.getAccess());
 
@@ -381,7 +385,7 @@ RandomFragmentOpCase::IterateResult RandomFragmentOpCase::iterate (void)
                compareOk = tcu::bilinearCompare(m_testCtx.getLog(),
                                                                                 "CompareResult",
                                                                                 "Image Comparison Result",
-                                                                                m_refColorBuffer->getAccess(),
+                                                                                referenceImg.getAccess(),
                                                                                 renderedImg.getAccess(),
                                                                                 tcu::RGBA(threshold.x(), threshold.y(), threshold.z(), threshold.w()),
                                                                                 tcu::COMPARE_LOG_RESULT);
@@ -390,7 +394,7 @@ RandomFragmentOpCase::IterateResult RandomFragmentOpCase::iterate (void)
                compareOk = tcu::intThresholdCompare(m_testCtx.getLog(),
                                                                                         "CompareResult",
                                                                                         "Image Comparison Result",
-                                                                                        m_refColorBuffer->getAccess(),
+                                                                                        referenceImg.getAccess(),
                                                                                         renderedImg.getAccess(),
                                                                                         threshold,
                                                                                         tcu::COMPARE_LOG_RESULT);
index e815785..f074b22 100644 (file)
@@ -65,20 +65,16 @@ namespace Functional
 static const int MAX_VIEWPORT_WIDTH            = 64;
 static const int MAX_VIEWPORT_HEIGHT   = 64;
 
-static TextureLevel sRGBATextureLevelToLinear (const tcu::ConstPixelBufferAccess& sRGBAAccess)
+// \note src and dst can point to same memory as long as there is 1-to-1 correspondence between
+//              pixels.
+static void sRGBAToLinear (const tcu::PixelBufferAccess& dst, const tcu::ConstPixelBufferAccess& src)
 {
-       DE_ASSERT(sRGBAAccess.getFormat().order == TextureFormat::sRGBA);
-
-       int                                             width                   = sRGBAAccess.getWidth();
-       int                                             height                  = sRGBAAccess.getHeight();
-       TextureLevel                    linear                  (TextureFormat(TextureFormat::RGBA, sRGBAAccess.getFormat().type), width, height);
-       tcu::PixelBufferAccess  linearAccess    = linear.getAccess();
+       const int       width   = src.getWidth();
+       const int       height  = src.getHeight();
 
        for (int y = 0; y < height; y++)
        for (int x = 0; x < width; x++)
-               linearAccess.setPixel(tcu::sRGBToLinear(sRGBAAccess.getPixel(x, y)), x, y);
-
-       return linear;
+               dst.setPixel(tcu::sRGBToLinear(src.getPixel(x, y)), x, y);
 }
 
 struct BlendParams
@@ -263,6 +259,7 @@ BlendCase::IterateResult BlendCase::iterate (void)
        int                                                             viewportX               = rnd.getInt(0, m_renderWidth - m_viewportWidth);
        int                                                             viewportY               = rnd.getInt(0, m_renderHeight - m_viewportHeight);
        TextureLevel                                    renderedImg             (TextureFormat(m_useSrgbFbo ? TextureFormat::sRGBA : TextureFormat::RGBA, TextureFormat::UNORM_INT8), m_viewportWidth, m_viewportHeight);
+       TextureLevel                                    referenceImg    (renderedImg.getFormat(), m_viewportWidth, m_viewportHeight);
        TestLog&                                                log                             (m_testCtx.getLog());
        const BlendParams&                              paramSet                = m_paramSets[m_curParamSetNdx];
        rr::FragmentOperationState              referenceState;
@@ -311,6 +308,9 @@ BlendCase::IterateResult BlendCase::iterate (void)
        referenceState.blendMode = rr::BLENDMODE_STANDARD;
        m_referenceRenderer->render(gls::FragmentOpUtil::getMultisampleAccess(m_refColorBuffer->getAccess()), nullAccess /* no depth */, nullAccess /* no stencil */, m_secondQuadInt, referenceState);
 
+       // Copy to reference (expansion to RGBA happens here if necessary)
+       copy(referenceImg, m_refColorBuffer->getAccess());
+
        // Read GL image.
 
        glu::readPixels(m_context.getRenderContext(), viewportX, viewportY, renderedImg.getAccess());
@@ -318,12 +318,17 @@ BlendCase::IterateResult BlendCase::iterate (void)
        // Compare images.
        // \note In sRGB cases, convert to linear space for comparison.
 
+       if (m_useSrgbFbo)
+       {
+               sRGBAToLinear(renderedImg, renderedImg);
+               sRGBAToLinear(referenceImg, referenceImg);
+       }
+
        UVec4 compareThreshold = (m_useSrgbFbo ? tcu::PixelFormat(8, 8, 8, 8) : m_context.getRenderTarget().getPixelFormat()).getColorThreshold().toIVec().asUint()
                                                         * UVec4(5) / UVec4(2) + UVec4(m_useSrgbFbo ? 5 : 2); // \note Non-scientific ad hoc formula. Need big threshold when few color bits; blending brings extra inaccuracy.
 
        bool comparePass = tcu::intThresholdCompare(m_testCtx.getLog(), "CompareResult", "Image Comparison Result",
-                                                                                               (m_useSrgbFbo ? sRGBATextureLevelToLinear(*m_refColorBuffer) : *m_refColorBuffer).getAccess(),
-                                                                                               (m_useSrgbFbo ? sRGBATextureLevelToLinear(renderedImg) : renderedImg).getAccess(),
+                                                                                               referenceImg.getAccess(), renderedImg.getAccess(),
                                                                                                compareThreshold, tcu::COMPARE_LOG_RESULT);
 
        // Fail now if images don't match.
index 1c9f348..13b6a61 100644 (file)
@@ -303,6 +303,7 @@ RandomFragmentOpCase::IterateResult RandomFragmentOpCase::iterate (void)
        const int                               viewportY               = rnd.getInt(0, m_context.getRenderTarget().getHeight()-height);
 
        tcu::Surface                    renderedImg             (width, height);
+       tcu::Surface                    referenceImg    (width, height);
 
        const Vec4                              clearColor              = CLEAR_COLOR;
        const float                             clearDepth              = CLEAR_DEPTH;
@@ -363,6 +364,9 @@ RandomFragmentOpCase::IterateResult RandomFragmentOpCase::iterate (void)
                                                          cmd->quad, refState);
        }
 
+       // Expand reference color buffer to RGBA8
+       copy(referenceImg.getAccess(), m_refColorBuffer->getAccess());
+
        // Read rendered image.
        glu::readPixels(m_context.getRenderContext(), viewportX, viewportY, renderedImg.getAccess());
 
@@ -381,7 +385,7 @@ RandomFragmentOpCase::IterateResult RandomFragmentOpCase::iterate (void)
                compareOk = tcu::bilinearCompare(m_testCtx.getLog(),
                                                                                 "CompareResult",
                                                                                 "Image Comparison Result",
-                                                                                m_refColorBuffer->getAccess(),
+                                                                                referenceImg.getAccess(),
                                                                                 renderedImg.getAccess(),
                                                                                 tcu::RGBA(threshold.x(), threshold.y(), threshold.z(), threshold.w()),
                                                                                 tcu::COMPARE_LOG_RESULT);
@@ -390,7 +394,7 @@ RandomFragmentOpCase::IterateResult RandomFragmentOpCase::iterate (void)
                compareOk = tcu::intThresholdCompare(m_testCtx.getLog(),
                                                                                         "CompareResult",
                                                                                         "Image Comparison Result",
-                                                                                        m_refColorBuffer->getAccess(),
+                                                                                        referenceImg.getAccess(),
                                                                                         renderedImg.getAccess(),
                                                                                         threshold,
                                                                                         tcu::COMPARE_LOG_RESULT);