Merge "x11: Fix deadlock" into nougat-cts-dev
diff --git a/modules/gles31/functional/es31fCopyImageTests.cpp b/modules/gles31/functional/es31fCopyImageTests.cpp
index 8407d3a..c0a9269 100644
--- a/modules/gles31/functional/es31fCopyImageTests.cpp
+++ b/modules/gles31/functional/es31fCopyImageTests.cpp
@@ -117,6 +117,12 @@
 	VIEWCLASS_ASTC_12x12_RGBA
 };
 
+enum Verify
+{
+	VERIFY_NONE = 0,
+	VERIFY_COMPARE_REFERENCE
+};
+
 const char* viewClassToName (ViewClass viewClass)
 {
 	switch (viewClass)
@@ -890,14 +896,15 @@
 				  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 @@
 		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 @@
 
 		// 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 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 @@
 		{
 			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 @@
 		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 @@
 		{
 			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 @@
 
 			// 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 @@
 	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 @@
 		{
 			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 @@
 		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 @@
 		{
 			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 @@
 
 			// 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 @@
 	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 @@
 		{
 			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 @@
 		{
 			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 @@
 		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 @@
 
 			// 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 @@
 	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 @@
 		{
 			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 @@
 		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 @@
 	}
 }
 
-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 @@
 		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 @@
 	void					destroyImagesIter		(void);
 	void					verifySourceIter		(void);
 	void					verifyDestinationIter	(void);
+	void					renderSourceIter		(void);
+	void					renderDestinationIter	(void);
 	void					copyImageIter			(void);
 
 	struct State
@@ -1806,7 +1851,7 @@
 
 	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 @@
 
 	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 @@
 
 		// 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,
@@ -2129,11 +2204,11 @@
 
 			const string	targetTestName	= string(targetToName(srcTarget)) + "_to_" + targetToName(dstTarget);
 
-			const IVec3		targetSize2D	(128, 128, 1);
-			const IVec3		targetSize3D	(128, 128, 16);
-
-			const IVec3		srcSize			= getTestedSize(srcTarget, srcFormat, (srcIs3D ? targetSize3D : targetSize2D));
-			const IVec3		dstSize			= getTestedSize(dstTarget, dstFormat, (dstIs3D ? targetSize3D : targetSize2D));
+			// Compressed formats require more space to fit all block size combinations.
+			const bool		isCompressedCase	= glu::isCompressedFormat(srcFormat) || glu::isCompressedFormat(dstFormat);
+			const IVec3		targetSize			= isCompressedCase ? IVec3(128, 128, 16) : IVec3(64, 64, 8);
+			const IVec3		srcSize				= getTestedSize(srcTarget, srcFormat, targetSize);
+			const IVec3		dstSize				= getTestedSize(dstTarget, dstFormat, targetSize);
 
 			group->addChild(new CopyImageTest(root->getContext(),
 											ImageInfo(srcFormat, srcTarget, srcSize),