CP: Remove two read-backs from copy image tests
authorKalle Raita <kraita@google.com>
Thu, 1 Sep 2016 20:21:50 +0000 (13:21 -0700)
committerKalle Raita <kraita@google.com>
Fri, 20 Jan 2017 21:48:42 +0000 (13:48 -0800)
Cherry pick commit b2fb8ad5ceefe26964101bd403e7786ae83274a9
from master.

Bug: 33965234

Remove two read-backs from copy image tests

Test: Ran copy_image on N6 & N9 with L MR1 image to check for
false-negatives. PixelC and Pixel XL for passing with current OS image.

Change-Id: I9f7028eb550012f8d9abe2f7afee2d1402f5abf3

modules/gles31/functional/es31fCopyImageTests.cpp

index 4cee025..c0a9269 100644 (file)
@@ -117,6 +117,12 @@ enum ViewClass
        VIEWCLASS_ASTC_12x12_RGBA
 };
 
+enum Verify
+{
+       VERIFY_NONE = 0,
+       VERIFY_COMPARE_REFERENCE
+};
+
 const char* viewClassToName (ViewClass viewClass)
 {
        switch (viewClass)
@@ -890,14 +896,15 @@ void copyImage (const glw::Functions&                                     gl,
                                  srcImageData, srcImageInfo, srcLevel, srcPos, copySize);
 }
 
-void verifyTexture2DView (tcu::TestContext&                    testContext,
+void renderTexture2DView (tcu::TestContext&                    testContext,
                                                  glu::RenderContext&           renderContext,
                                                  TextureRenderer&                      renderer,
                                                  tcu::ResultCollector&         results,
                                                  de::Random&                           rng,
                                                  deUint32                                      name,
                                                  const ImageInfo&                      info,
-                                                 const tcu::Texture2DView&     refTexture)
+                                                 const tcu::Texture2DView&     refTexture,
+                                                 Verify                                        verify)
 {
        tcu::TestLog&                                   log                             = testContext.getLog();
        const glw::Functions&                   gl                              = renderContext.getFunctions();
@@ -928,8 +935,6 @@ void verifyTexture2DView (tcu::TestContext&                 testContext,
                const RandomViewport    viewport                (renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32());
 
                vector<float>                   texCoord;
-               tcu::Surface                    renderedFrame   (viewport.width, viewport.height);
-               tcu::Surface                    referenceFrame  (viewport.width, viewport.height);
 
                renderParams.baseLevel  = level;
                renderParams.maxLevel   = level;
@@ -944,17 +949,25 @@ void verifyTexture2DView (tcu::TestContext&                       testContext,
 
                // Draw.
                renderer.renderQuad(0, &texCoord[0], renderParams);
-               glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
-               GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels.");
+               GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render.");
 
-               // Compute reference.
-               sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
+               if (verify == VERIFY_COMPARE_REFERENCE)
+               {
+                       tcu::Surface renderedFrame      (viewport.width, viewport.height);
+                       tcu::Surface referenceFrame     (viewport.width, viewport.height);
 
-               // Compare and log.
-               if (!pixelThresholdCompare(log, ("Level" + de::toString(level)).c_str(), ("Render level " + de::toString(level)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
-                       results.fail("Image comparison of level " + de::toString(level) + " failed.");
-               else
-                       log << TestLog::Message << "Image comparison of level " << level << " passed." << TestLog::EndMessage;
+                       glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
+                       GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to read pixels.");
+
+                       // Compute reference.
+                       sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
+
+                       // Compare and log.
+                       if (!pixelThresholdCompare(log, ("Level" + de::toString(level)).c_str(), ("Render level " + de::toString(level)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
+                               results.fail("Image comparison of level " + de::toString(level) + " failed.");
+                       else
+                               log << TestLog::Message << "Image comparison of level " << level << " passed." << TestLog::EndMessage;
+               }
        }
 
        gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
@@ -1015,14 +1028,15 @@ void decompressTexture (vector<ArrayBuffer<deUint8> >&                  levelDatas,
        }
 }
 
-void verifyTexture2D (tcu::TestContext&                                                testContext,
+void renderTexture2D (tcu::TestContext&                                                testContext,
                                          glu::RenderContext&                                   renderContext,
                                          TextureRenderer&                                              textureRenderer,
                                          tcu::ResultCollector&                                 results,
                                          de::Random&                                                   rng,
                                          deUint32                                                              name,
                                          const vector<ArrayBuffer<deUint8> >&  data,
-                                         const ImageInfo&                                              info)
+                                         const ImageInfo&                                              info,
+                                         Verify                                                                verify)
 {
        if (glu::isCompressedFormat(info.getFormat()))
        {
@@ -1034,7 +1048,7 @@ void verifyTexture2D (tcu::TestContext&                                           testContext,
                {
                        const tcu::Texture2DView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
 
-                       verifyTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
+                       renderTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
                }
        }
        else
@@ -1042,18 +1056,19 @@ void verifyTexture2D (tcu::TestContext&                                         testContext,
                const vector<tcu::ConstPixelBufferAccess>       levelAccesses   = getLevelAccesses(data, info);
                const tcu::Texture2DView                                        refTexture              ((int)levelAccesses.size(), &(levelAccesses[0]));
 
-               verifyTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
+               renderTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
        }
 }
 
-void verifyTexture3DView (tcu::TestContext&                    testContext,
+void renderTexture3DView (tcu::TestContext&                    testContext,
                                                  glu::RenderContext&           renderContext,
                                                  TextureRenderer&                      renderer,
                                                  tcu::ResultCollector&         results,
                                                  de::Random&                           rng,
                                                  deUint32                                      name,
                                                  const ImageInfo&                      info,
-                                                 const tcu::Texture3DView&     refTexture)
+                                                 const tcu::Texture3DView&     refTexture,
+                                                 Verify                                        verify)
 {
        tcu::TestLog&                                   log                             = testContext.getLog();
        const glw::Functions&                   gl                              = renderContext.getFunctions();
@@ -1093,8 +1108,6 @@ void verifyTexture3DView (tcu::TestContext&                       testContext,
                {
                        const RandomViewport    viewport                (renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32());
                        const float                             r                               = (float(slice) + 0.5f) / (float)levelSize.z();
-                       tcu::Surface                    renderedFrame   (viewport.width, viewport.height);
-                       tcu::Surface                    referenceFrame  (viewport.width, viewport.height);
                        vector<float>                   texCoord;
 
                        computeQuadTexCoord3D(texCoord, tcu::Vec3(0.0f, 0.0f, r), tcu::Vec3(1.0f, 1.0f, r), tcu::IVec3(0, 1, 2));
@@ -1104,17 +1117,24 @@ void verifyTexture3DView (tcu::TestContext&                     testContext,
 
                        // Draw.
                        renderer.renderQuad(0, &texCoord[0], renderParams);
-                       glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
-                       GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels.");
+                       GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render.");
 
-                       // Compute reference.
-                       sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
+                       if (verify == VERIFY_COMPARE_REFERENCE)
+                       {
+                               tcu::Surface renderedFrame      (viewport.width, viewport.height);
+                               tcu::Surface referenceFrame     (viewport.width, viewport.height);
+                               glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
+                               GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to read pixels.");
 
-                       // Compare and log.
-                       if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Slice" + de::toString(slice)).c_str(), ("Render level " + de::toString(level) + ", Slice" + de::toString(slice)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
-                               results.fail("Image comparison of level " + de::toString(level) + " and slice " + de::toString(slice) + " failed.");
-                       else
-                               log << TestLog::Message << "Image comparison of level " << level << " and slice " << slice << " passed." << TestLog::EndMessage;;
+                               // Compute reference.
+                               sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
+
+                               // Compare and log.
+                               if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Slice" + de::toString(slice)).c_str(), ("Render level " + de::toString(level) + ", Slice" + de::toString(slice)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
+                                       results.fail("Image comparison of level " + de::toString(level) + " and slice " + de::toString(slice) + " failed.");
+                               else
+                                       log << TestLog::Message << "Image comparison of level " << level << " and slice " << slice << " passed." << TestLog::EndMessage;;
+                       }
                }
        }
 
@@ -1125,14 +1145,15 @@ void verifyTexture3DView (tcu::TestContext&                     testContext,
        GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
 }
 
-void verifyTexture3D (tcu::TestContext&                                                testContext,
+void renderTexture3D (tcu::TestContext&                                                testContext,
                                          glu::RenderContext&                                   renderContext,
                                          TextureRenderer&                                              textureRenderer,
                                          tcu::ResultCollector&                                 results,
                                          de::Random&                                                   rng,
                                          deUint32                                                              name,
                                          const vector<ArrayBuffer<deUint8> >&  data,
-                                         const ImageInfo&                                              info)
+                                         const ImageInfo&                                              info,
+                                     Verify                                                            verify)
 {
        if (glu::isCompressedFormat(info.getFormat()))
        {
@@ -1144,7 +1165,7 @@ void verifyTexture3D (tcu::TestContext&                                           testContext,
                {
                        const tcu::Texture3DView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
 
-                       verifyTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
+                       renderTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
                }
        }
        else
@@ -1152,18 +1173,19 @@ void verifyTexture3D (tcu::TestContext&                                         testContext,
                const vector<tcu::ConstPixelBufferAccess>       levelAccesses   = getLevelAccesses(data, info);
                const tcu::Texture3DView                                        refTexture              ((int)levelAccesses.size(), &(levelAccesses[0]));
 
-               verifyTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
+               renderTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
        }
 }
 
-void verifyTextureCubemapView (tcu::TestContext&                       testContext,
+void renderTextureCubemapView (tcu::TestContext&                       testContext,
                                                           glu::RenderContext&                  renderContext,
                                                           TextureRenderer&                             renderer,
                                                           tcu::ResultCollector&                results,
                                                           de::Random&                                  rng,
                                                           deUint32                                             name,
                                                           const ImageInfo&                             info,
-                                                          const tcu::TextureCubeView&  refTexture)
+                                                          const tcu::TextureCubeView&  refTexture,
+                                                          Verify                                               verify)
 {
        tcu::TestLog&                                   log                             = testContext.getLog();
        const glw::Functions&                   gl                              = renderContext.getFunctions();
@@ -1206,8 +1228,6 @@ void verifyTextureCubemapView (tcu::TestContext&                  testContext,
                {
                        const RandomViewport    viewport                (renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32());
                        const string                    cubemapFaceName = glu::getCubeMapFaceStr(mapFaceNdxToFace(face)).toString();
-                       tcu::Surface                    renderedFrame   (viewport.width, viewport.height);
-                       tcu::Surface                    referenceFrame  (viewport.width, viewport.height);
                        vector<float>                   texCoord;
 
                        computeQuadTexCoordCube(texCoord, glu::getCubeFaceFromGL(mapFaceNdxToFace(face)));
@@ -1217,17 +1237,25 @@ void verifyTextureCubemapView (tcu::TestContext&                        testContext,
 
                        // Draw.
                        renderer.renderQuad(0, &texCoord[0], renderParams);
-                       glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
-                       GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels.");
+                       GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render.");
 
-                       // Compute reference.
-                       sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
+                       if (verify == VERIFY_COMPARE_REFERENCE)
+                       {
+                               tcu::Surface renderedFrame      (viewport.width, viewport.height);
+                               tcu::Surface referenceFrame     (viewport.width, viewport.height);
 
-                       // Compare and log.
-                       if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Face" + cubemapFaceName).c_str(), ("Render level " + de::toString(level) + ", Face " + cubemapFaceName).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
-                               results.fail("Image comparison of level " + de::toString(level) + " and face " + cubemapFaceName + " failed.");
-                       else
-                               log << TestLog::Message << "Image comparison of level " << level << " and face " << cubemapFaceName << " passed." << TestLog::EndMessage;
+                               glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
+                               GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to read pixels.");
+
+                               // Compute reference.
+                               sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
+
+                               // Compare and log.
+                               if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Face" + cubemapFaceName).c_str(), ("Render level " + de::toString(level) + ", Face " + cubemapFaceName).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
+                                       results.fail("Image comparison of level " + de::toString(level) + " and face " + cubemapFaceName + " failed.");
+                               else
+                                       log << TestLog::Message << "Image comparison of level " << level << " and face " << cubemapFaceName << " passed." << TestLog::EndMessage;
+                       }
                }
        }
 
@@ -1238,14 +1266,15 @@ void verifyTextureCubemapView (tcu::TestContext&                        testContext,
        GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
 }
 
-void verifyTextureCubemap (tcu::TestContext&                                   testContext,
+void renderTextureCubemap (tcu::TestContext&                                   testContext,
                                                   glu::RenderContext&                                  renderContext,
                                                   TextureRenderer&                                             textureRenderer,
                                                   tcu::ResultCollector&                                results,
                                                   de::Random&                                                  rng,
                                                   deUint32                                                             name,
                                                   const vector<ArrayBuffer<deUint8> >& data,
-                                                  const ImageInfo&                                             info)
+                                                  const ImageInfo&                                             info,
+                                                  Verify                                                               verify)
 {
        if (glu::isCompressedFormat(info.getFormat()))
        {
@@ -1303,7 +1332,7 @@ void verifyTextureCubemap (tcu::TestContext&                                      testContext,
                {
                        const tcu::TextureCubeView refTexture(getLevelCount(info), levels);
 
-                       verifyTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
+                       renderTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
                }
        }
        else
@@ -1326,19 +1355,20 @@ void verifyTextureCubemap (tcu::TestContext&                                    testContext,
                {
                        const tcu::TextureCubeView refTexture(getLevelCount(info), levels);
 
-                       verifyTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
+                       renderTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
                }
        }
 }
 
-void verifyTexture2DArrayView (tcu::TestContext&                               testContext,
+void renderTexture2DArrayView (tcu::TestContext&                               testContext,
                                                           glu::RenderContext&                          renderContext,
                                                           TextureRenderer&                                     renderer,
                                                           tcu::ResultCollector&                        results,
                                                           de::Random&                                          rng,
                                                           deUint32                                                     name,
                                                           const ImageInfo&                                     info,
-                                                          const tcu::Texture2DArrayView&       refTexture)
+                                                          const tcu::Texture2DArrayView&       refTexture,
+                                                          Verify                                                       verify)
 {
        tcu::TestLog&                                   log                             = testContext.getLog();
        const glw::Functions&                   gl                              = renderContext.getFunctions();
@@ -1376,8 +1406,6 @@ void verifyTexture2DArrayView (tcu::TestContext&                          testContext,
                for (int layer = 0; layer < levelSize.z(); layer++)
                {
                        const RandomViewport    viewport                (renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32());
-                       tcu::Surface                    renderedFrame   (viewport.width, viewport.height);
-                       tcu::Surface                    referenceFrame  (viewport.width, viewport.height);
                        vector<float>                   texCoord;
 
                        computeQuadTexCoord2DArray(texCoord, layer, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f));
@@ -1387,17 +1415,25 @@ void verifyTexture2DArrayView (tcu::TestContext&                                testContext,
 
                        // Draw.
                        renderer.renderQuad(0, &texCoord[0], renderParams);
-                       glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
-                       GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels.");
+                       GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render.");
 
-                       // Compute reference.
-                       sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
+                       if (verify == VERIFY_COMPARE_REFERENCE)
+                       {
+                               tcu::Surface renderedFrame      (viewport.width, viewport.height);
+                               tcu::Surface referenceFrame     (viewport.width, viewport.height);
 
-                       // Compare and log.
-                       if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Layer" + de::toString(layer)).c_str(), ("Render level " + de::toString(level) + ", Layer" + de::toString(layer)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
-                               results.fail("Image comparison of level " + de::toString(level) + " and layer " + de::toString(layer) + " failed.");
-                       else
-                               log << TestLog::Message << "Image comparison of level " << level << " and layer " << layer << " passed." << TestLog::EndMessage;
+                               glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
+                               GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to read pixels.");
+
+                               // Compute reference.
+                               sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
+
+                               // Compare and log.
+                               if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Layer" + de::toString(layer)).c_str(), ("Render level " + de::toString(level) + ", Layer" + de::toString(layer)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
+                                       results.fail("Image comparison of level " + de::toString(level) + " and layer " + de::toString(layer) + " failed.");
+                               else
+                                       log << TestLog::Message << "Image comparison of level " << level << " and layer " << layer << " passed." << TestLog::EndMessage;
+                       }
                }
        }
 
@@ -1408,14 +1444,15 @@ void verifyTexture2DArrayView (tcu::TestContext&                                testContext,
        GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
 }
 
-void verifyTexture2DArray (tcu::TestContext&                                   testContext,
+void renderTexture2DArray (tcu::TestContext&                                   testContext,
                                                   glu::RenderContext&                                  renderContext,
                                                   TextureRenderer&                                             textureRenderer,
                                                   tcu::ResultCollector&                                results,
                                                   de::Random&                                                  rng,
                                                   deUint32                                                             name,
                                                   const vector<ArrayBuffer<deUint8> >& data,
-                                                  const ImageInfo&                                             info)
+                                                  const ImageInfo&                                             info,
+                                                  Verify                                                               verify)
 {
        if (glu::isCompressedFormat(info.getFormat()))
        {
@@ -1427,7 +1464,7 @@ void verifyTexture2DArray (tcu::TestContext&                                      testContext,
                {
                        const tcu::Texture2DArrayView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
 
-                       verifyTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
+                       renderTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
                }
        }
        else
@@ -1435,7 +1472,7 @@ void verifyTexture2DArray (tcu::TestContext&                                      testContext,
                const vector<tcu::ConstPixelBufferAccess>       levelAccesses   = getLevelAccesses(data, info);
                const tcu::Texture2DArrayView                           refTexture              ((int)levelAccesses.size(), &(levelAccesses[0]));
 
-               verifyTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
+               renderTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture, verify);
        }
 }
 
@@ -1479,12 +1516,13 @@ Vec4 calculateThreshold (const tcu::TextureFormat& sourceFormat, const tcu::Text
        }
 }
 
-void verifyRenderbuffer (tcu::TestContext&                                             testContext,
+void renderRenderbuffer (tcu::TestContext&                                             testContext,
                                                 glu::RenderContext&                                    renderContext,
                                                 tcu::ResultCollector&                                  results,
                                                 deUint32                                                               name,
                                                 const vector<ArrayBuffer<deUint8> >&   data,
-                                                const ImageInfo&                                               info)
+                                                const ImageInfo&                                               info,
+                                                Verify                                                                 verify)
 {
        const glw::Functions&                           gl                                      = renderContext.getFunctions();
        TestLog&                                                        log                                     = testContext.getLog();
@@ -1508,71 +1546,76 @@ void verifyRenderbuffer (tcu::TestContext&                                              testContext,
                gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, name);
                GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind and attach renderbuffer to framebuffer.");
 
-               glu::readPixels(renderContext, 0, 0, renderbuffer.getAccess());
+               if (verify)
+                       glu::readPixels(renderContext, 0, 0, renderbuffer.getAccess());
 
                gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
                gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
                GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind renderbuffer and framebuffer.");
        }
 
-       if (isFloatFormat(info.getFormat()))
+       if (verify == VERIFY_COMPARE_REFERENCE)
        {
-               const tcu::UVec4 threshold (2, 2, 2, 2);
+               if (isFloatFormat(info.getFormat()))
+               {
+                       const tcu::UVec4 threshold (2, 2, 2, 2);
 
-               if (!(tcu::floatUlpThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
-                       results.fail("Image comparison failed.");
-               else
-                       log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
-       }
-       else if (isIntFormat(info.getFormat()) || isUintFormat(info.getFormat()))
-       {
-               const tcu::UVec4 threshold (1, 1, 1, 1);
+                       if (!(tcu::floatUlpThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
+                               results.fail("Image comparison failed.");
+                       else
+                               log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
+               }
+               else if (isIntFormat(info.getFormat()) || isUintFormat(info.getFormat()))
+               {
+                       const tcu::UVec4 threshold (1, 1, 1, 1);
 
-               if (!(tcu::intThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
-                       results.fail("Image comparison failed.");
+                       if (!(tcu::intThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
+                               results.fail("Image comparison failed.");
+                       else
+                               log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
+               }
                else
-                       log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
-       }
-       else
-       {
-               const Vec4 threshold = calculateThreshold(format, readPixelsFormat);
+               {
+                       const Vec4 threshold = calculateThreshold(format, readPixelsFormat);
 
-               if (!(tcu::floatThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
-                       results.fail("Image comparison failed.");
-               else
-                       log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
+                       if (!(tcu::floatThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
+                               results.fail("Image comparison failed.");
+                       else
+                               log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
+               }
        }
 }
 
-void verify (tcu::TestContext&                                         testContext,
+void render (tcu::TestContext&                                         testContext,
                         glu::RenderContext&                                    renderContext,
                         TextureRenderer&                                               textureRenderer,
                         tcu::ResultCollector&                                  results,
                         de::Random&                                                    rng,
                         deUint32                                                               name,
                         const vector<ArrayBuffer<deUint8> >&   data,
-                        const ImageInfo&                                               info)
+                        const ImageInfo&                                               info,
+                        Verify                                                                 verify)
 {
        switch (info.getTarget())
        {
                case GL_TEXTURE_2D:
-                       verifyTexture2D(testContext, renderContext, textureRenderer, results, rng, name, data, info);
+                       renderTexture2D(testContext, renderContext, textureRenderer, results, rng, name, data, info, verify);
                        break;
 
                case GL_TEXTURE_3D:
-                       verifyTexture3D(testContext, renderContext, textureRenderer, results, rng, name, data, info);
+                       renderTexture3D(testContext, renderContext, textureRenderer, results, rng, name, data, info, verify);
                        break;
 
                case GL_TEXTURE_CUBE_MAP:
-                       verifyTextureCubemap(testContext, renderContext, textureRenderer, results, rng, name, data, info);
+                       renderTextureCubemap(testContext, renderContext, textureRenderer, results, rng, name, data, info, verify);
                        break;
 
                case GL_TEXTURE_2D_ARRAY:
-                       verifyTexture2DArray(testContext, renderContext, textureRenderer, results, rng, name, data, info);
+                       renderTexture2DArray(testContext, renderContext, textureRenderer, results, rng, name, data, info, verify);
                        break;
 
                case GL_RENDERBUFFER:
-                       verifyRenderbuffer(testContext, renderContext, results, name, data, info);
+                       renderRenderbuffer(testContext, renderContext, results, name, data, info, verify);
                        break;
 
                default:
@@ -1630,6 +1673,8 @@ private:
        void                                    destroyImagesIter               (void);
        void                                    verifySourceIter                (void);
        void                                    verifyDestinationIter   (void);
+       void                                    renderSourceIter                (void);
+       void                                    renderDestinationIter   (void);
        void                                    copyImageIter                   (void);
 
        struct State
@@ -1806,7 +1851,7 @@ void CopyImageTest::verifySourceIter (void)
 
        log << TestLog::Message << "Verifying source image." << TestLog::EndMessage;
 
-       verify(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *srcImage, srcImageLevels, m_srcImageInfo);
+       render(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *srcImage, srcImageLevels, m_srcImageInfo, VERIFY_COMPARE_REFERENCE);
 }
 
 void CopyImageTest::verifyDestinationIter (void)
@@ -1821,7 +1866,37 @@ void CopyImageTest::verifyDestinationIter (void)
 
        log << TestLog::Message << "Verifying destination image." << TestLog::EndMessage;
 
-       verify(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *dstImage, dstImageLevels, m_dstImageInfo);
+       render(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *dstImage, dstImageLevels, m_dstImageInfo, VERIFY_COMPARE_REFERENCE);
+}
+
+void CopyImageTest::renderSourceIter (void)
+{
+       TestLog&                                                log                                     = m_testCtx.getLog();
+       const tcu::ScopedLogSection             sourceSection           (log, "Source image verify.", "Source image verify.");
+
+       de::Random&                                             rng                                     = m_state->rng;
+       tcu::ResultCollector&                   results                         = m_state->results;
+       glu::ObjectWrapper&                             srcImage                        = *m_state->srcImage;
+       vector<ArrayBuffer<deUint8> >&  srcImageLevels          = m_state->srcImageLevels;
+
+       log << TestLog::Message << "Verifying source image." << TestLog::EndMessage;
+
+       render(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *srcImage, srcImageLevels, m_srcImageInfo, VERIFY_NONE);
+}
+
+void CopyImageTest::renderDestinationIter (void)
+{
+       TestLog&                                                log                                     = m_testCtx.getLog();
+       const tcu::ScopedLogSection             destinationSection      (log, "Destination image verify.", "Destination image verify.");
+
+       de::Random&                                             rng                                     = m_state->rng;
+       tcu::ResultCollector&                   results                         = m_state->results;
+       glu::ObjectWrapper&                             dstImage                        = *m_state->dstImage;
+       vector<ArrayBuffer<deUint8> >&  dstImageLevels          = m_state->dstImageLevels;
+
+       log << TestLog::Message << "Verifying destination image." << TestLog::EndMessage;
+
+       render(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *dstImage, dstImageLevels, m_dstImageInfo, VERIFY_NONE);
 }
 
 struct Copy
@@ -1988,8 +2063,8 @@ TestCase::IterateResult CopyImageTest::iterate (void)
 
                // Render both images and then copy and verify again.
                &CopyImageTest::createImagesIter,
-               &CopyImageTest::verifySourceIter,
-               &CopyImageTest::verifyDestinationIter,
+               &CopyImageTest::renderSourceIter,
+               &CopyImageTest::renderDestinationIter,
                &CopyImageTest::copyImageIter,
                &CopyImageTest::verifySourceIter,
                &CopyImageTest::verifyDestinationIter,