Merge vk-gl-cts/vulkan-cts-1.0.1 into vk-gl-cts/vulkan-cts-1.0.2

Change-Id: I73deeb16880948addabb1d8755ee00084aa346cf
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp
index c45001e..310910a 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp
@@ -1295,6 +1295,79 @@
 	return MovePtr<tcu::Texture3DView>(new tcu::Texture3DView((int)levels.size(), &levels[0]));
 }
 
+bool validateResultImage (const TestTexture&					texture,
+						  const VkImageViewType					imageViewType,
+						  const VkImageSubresourceRange&		subresource,
+						  const tcu::Sampler&					sampler,
+						  const vk::VkComponentMapping&			componentMapping,
+						  const tcu::ConstPixelBufferAccess&	coordAccess,
+						  const tcu::Vec2&						lodBounds,
+						  const tcu::LookupPrecision&			lookupPrecision,
+						  const tcu::Vec4&						lookupScale,
+						  const tcu::Vec4&						lookupBias,
+						  const tcu::ConstPixelBufferAccess&	resultAccess,
+						  const tcu::PixelBufferAccess&			errorAccess)
+{
+	std::vector<tcu::ConstPixelBufferAccess>	levels;
+
+	switch (imageViewType)
+	{
+		case VK_IMAGE_VIEW_TYPE_1D:
+		{
+			UniquePtr<tcu::Texture1DView>			texView(getTexture1DView(texture, subresource, levels));
+
+			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
+		}
+
+		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
+		{
+			UniquePtr<tcu::Texture1DArrayView>		texView(getTexture1DArrayView(texture, subresource, levels));
+
+			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
+		}
+
+		case VK_IMAGE_VIEW_TYPE_2D:
+		{
+			UniquePtr<tcu::Texture2DView>			texView(getTexture2DView(texture, subresource, levels));
+
+			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
+		}
+
+		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+		{
+			UniquePtr<tcu::Texture2DArrayView>		texView(getTexture2DArrayView(texture, subresource, levels));
+
+			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
+		}
+
+		case VK_IMAGE_VIEW_TYPE_CUBE:
+		{
+			UniquePtr<tcu::TextureCubeView>			texView(getTextureCubeView(texture, subresource, levels));
+
+			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
+		}
+
+		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
+		{
+			UniquePtr<tcu::TextureCubeArrayView>	texView(getTextureCubeArrayView(texture, subresource, levels));
+
+			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
+			break;
+		}
+
+		case VK_IMAGE_VIEW_TYPE_3D:
+		{
+			UniquePtr<tcu::Texture3DView>			texView(getTexture3DView(texture, subresource, levels));
+
+			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
+		}
+
+		default:
+			DE_ASSERT(false);
+			return false;
+	}
+}
+
 } // anonymous
 
 tcu::TestStatus ImageSamplingInstance::verifyImage (void)
@@ -1308,6 +1381,7 @@
 	ReferenceRenderer					refRenderer				(m_renderSize.x(), m_renderSize.y(), 1, colorFormat, depthStencilFormat, &rrProgram);
 
 	bool								compareOkAll			= true;
+	bool								anyWarnings				= false;
 
 	tcu::Vec4							lookupScale				(1.0f);
 	tcu::Vec4							lookupBias				(0.0f);
@@ -1332,6 +1406,9 @@
 		tcu::TextureLevel					errorMask		(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), (int)m_renderSize.x(), (int)m_renderSize.y());
 		const tcu::PixelBufferAccess		errorAccess		= errorMask.getAccess();
 
+		const bool							allowSnorm8Bug	= m_texture->getTextureFormat().type == tcu::TextureFormat::SNORM_INT8 &&
+															  (m_samplerParams.minFilter == VK_FILTER_LINEAR || m_samplerParams.magFilter == VK_FILTER_LINEAR);
+
 		tcu::LookupPrecision				lookupPrecision;
 
 		// Set precision requirements - very low for these tests as
@@ -1347,85 +1424,59 @@
 		for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx)
 		{
 			// Read back result image
-			UniquePtr<tcu::TextureLevel>		result(readColorAttachment(m_context.getDeviceInterface(),
-				m_context.getDevice(),
-				m_context.getUniversalQueue(),
-				m_context.getUniversalQueueFamilyIndex(),
-				m_context.getDefaultAllocator(),
-				**m_colorImages[imgNdx],
-				m_colorFormat,
-				m_renderSize));
-			const tcu::ConstPixelBufferAccess	resultAccess = result->getAccess();
+			UniquePtr<tcu::TextureLevel>		result			(readColorAttachment(m_context.getDeviceInterface(),
+																					 m_context.getDevice(),
+																					 m_context.getUniversalQueue(),
+																					 m_context.getUniversalQueueFamilyIndex(),
+																					 m_context.getDefaultAllocator(),
+																					 **m_colorImages[imgNdx],
+																					 m_colorFormat,
+																					 m_renderSize));
+			const tcu::ConstPixelBufferAccess	resultAccess	= result->getAccess();
+			bool								compareOk		= validateResultImage(*m_texture,
+																					  m_imageViewType,
+																					  subresource,
+																					  sampler,
+																					  m_componentMapping,
+																					  coordAccess,
+																					  lodBounds,
+																					  lookupPrecision,
+																					  lookupScale,
+																					  lookupBias,
+																					  resultAccess,
+																					  errorAccess);
 
-			bool								compareOk	 = true;
-
-			switch (m_imageViewType)
+			if (!compareOk && allowSnorm8Bug)
 			{
-				case VK_IMAGE_VIEW_TYPE_1D:
-				{
-					std::vector<tcu::ConstPixelBufferAccess>	levels;
-					UniquePtr<tcu::Texture1DView>				texView(getTexture1DView(*m_texture, subresource, levels));
+				// HW waiver (VK-GL-CTS issue: 229)
+				//
+				// Due to an error in bit replication of the fixed point SNORM values, linear filtered
+				// negative SNORM values will differ slightly from ideal precision in the last bit, moving
+				// the values towards 0.
+				//
+				// This occurs on all members of the PowerVR Rogue family of GPUs
+				tcu::LookupPrecision	relaxedPrecision;
 
-					compareOk = validateResultImage(*texView, sampler, m_componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
-					break;
-				}
+				relaxedPrecision.colorThreshold += tcu::Vec4(4.f / 255.f);
 
-				case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
-				{
-					std::vector<tcu::ConstPixelBufferAccess>	levels;
-					UniquePtr<tcu::Texture1DArrayView>			texView(getTexture1DArrayView(*m_texture, subresource, levels));
+				m_context.getTestContext().getLog()
+					<< tcu::TestLog::Message
+					<< "Warning: Strict validation failed, re-trying with lower precision for SNORM8 format"
+					<< tcu::TestLog::EndMessage;
+				anyWarnings = true;
 
-					compareOk = validateResultImage(*texView, sampler, m_componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
-					break;
-				}
-
-				case VK_IMAGE_VIEW_TYPE_2D:
-				{
-					std::vector<tcu::ConstPixelBufferAccess>	levels;
-					UniquePtr<tcu::Texture2DView>				texView(getTexture2DView(*m_texture, subresource, levels));
-
-					compareOk = validateResultImage(*texView, sampler, m_componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
-					break;
-				}
-
-				case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
-				{
-					std::vector<tcu::ConstPixelBufferAccess>	levels;
-					UniquePtr<tcu::Texture2DArrayView>			texView(getTexture2DArrayView(*m_texture, subresource, levels));
-
-					compareOk = validateResultImage(*texView, sampler, m_componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
-					break;
-				}
-
-				case VK_IMAGE_VIEW_TYPE_CUBE:
-				{
-					std::vector<tcu::ConstPixelBufferAccess>	levels;
-					UniquePtr<tcu::TextureCubeView>				texView(getTextureCubeView(*m_texture, subresource, levels));
-
-					compareOk = validateResultImage(*texView, sampler, m_componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
-					break;
-				}
-
-				case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
-				{
-					std::vector<tcu::ConstPixelBufferAccess>	levels;
-					UniquePtr<tcu::TextureCubeArrayView>		texView(getTextureCubeArrayView(*m_texture, subresource, levels));
-
-					compareOk = validateResultImage(*texView, sampler, m_componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
-					break;
-				}
-
-				case VK_IMAGE_VIEW_TYPE_3D:
-				{
-					std::vector<tcu::ConstPixelBufferAccess>	levels;
-					UniquePtr<tcu::Texture3DView>				texView(getTexture3DView(*m_texture, subresource, levels));
-
-					compareOk = validateResultImage(*texView, sampler, m_componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
-					break;
-				}
-
-				default:
-					DE_ASSERT(false);
+				compareOk = validateResultImage(*m_texture,
+												m_imageViewType,
+												subresource,
+												sampler,
+												m_componentMapping,
+												coordAccess,
+												lodBounds,
+												relaxedPrecision,
+												lookupScale,
+												lookupBias,
+												resultAccess,
+												errorAccess);
 			}
 
 			if (!compareOk)
@@ -1438,7 +1489,12 @@
 	}
 
 	if (compareOkAll)
-		return tcu::TestStatus::pass("Result image matches reference");
+	{
+		if (anyWarnings)
+			return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Inaccurate filtering results");
+		else
+			return tcu::TestStatus::pass("Result image matches reference");
+	}
 	else
 		return tcu::TestStatus::fail("Image mismatch");
 }