Merge changes I10d8c713,Ib474fd28

* changes:
  Update SPIR-V Tools to 82d91083c
  Squashed 'third_party/SPIRV-Tools/' changes from 7014be600c..82d91083cb
diff --git a/src/Pipeline/SpirvShaderGLSLstd450.cpp b/src/Pipeline/SpirvShaderGLSLstd450.cpp
index 75bcc06..fd09c9e 100644
--- a/src/Pipeline/SpirvShaderGLSLstd450.cpp
+++ b/src/Pipeline/SpirvShaderGLSLstd450.cpp
@@ -1023,18 +1023,28 @@
 	SIMD::Float y;
 	SIMD::Float rhw;
 
+	bool multisample = (state->getMultiSampleCount() > 1);
 	switch(type)
 	{
 	case Centroid:
-		x = interpolationData.xCentroid;
-		y = interpolationData.yCentroid;
-		rhw = interpolationData.rhwCentroid;
+		if(multisample)
+		{
+			x = interpolationData.xCentroid;
+			y = interpolationData.yCentroid;
+			rhw = interpolationData.rhwCentroid;
+		}
+		else
+		{
+			x = interpolationData.x;
+			y = interpolationData.y;
+			rhw = interpolationData.rhw;
+		}
 		break;
 	case AtSample:
 		x = SIMD::Float(0.0f);
 		y = SIMD::Float(0.0f);
 
-		if(state->getMultiSampleCount() > 1)
+		if(multisample)
 		{
 			static constexpr int NUM_SAMPLES = 4;
 			ASSERT(state->getMultiSampleCount() == NUM_SAMPLES);
diff --git a/src/System/Memory.cpp b/src/System/Memory.cpp
index 0333afb..3565914 100644
--- a/src/System/Memory.cpp
+++ b/src/System/Memory.cpp
@@ -98,8 +98,7 @@
 	return aligned;
 }
 
-// TODO(b/140991626): Rename to allocate().
-void *allocateUninitialized(size_t bytes, size_t alignment)
+void *allocate(size_t bytes, size_t alignment)
 {
 	return allocate(bytes, alignment, false);
 }
diff --git a/src/System/Memory.hpp b/src/System/Memory.hpp
index 9a12a4f..99e4374 100644
--- a/src/System/Memory.hpp
+++ b/src/System/Memory.hpp
@@ -22,9 +22,9 @@
 
 size_t memoryPageSize();
 
-void *allocateUninitialized(size_t bytes, size_t alignment = 16);  // Never initialized.
-void *allocateZero(size_t bytes, size_t alignment = 16);           // Always initialized to zero.
-void *allocateZeroOrPoison(size_t bytes, size_t alignment = 16);   // Initialized to zero, except in MemorySanitizer builds.
+void *allocate(size_t bytes, size_t alignment = 16);              // Never initialized.
+void *allocateZero(size_t bytes, size_t alignment = 16);          // Always initialized to zero.
+void *allocateZeroOrPoison(size_t bytes, size_t alignment = 16);  // Initialized to zero, except in MemorySanitizer builds.
 
 void freeMemory(void *memory);
 
diff --git a/src/Vulkan/BUILD.gn b/src/Vulkan/BUILD.gn
index 1bb14a8..a8afc99 100644
--- a/src/Vulkan/BUILD.gn
+++ b/src/Vulkan/BUILD.gn
@@ -57,6 +57,7 @@
   defines += [
      "SWIFTSHADER_ENABLE_ASTC",  # TODO(b/150130101)
      "SWIFTSHADER_LEGACY_PRECISION=true",  # TODO(chromium:1299047)
+     "SWIFTSHADER_ZERO_INITIALIZE_DEVICE_MEMORY",
   ]
 }
 
diff --git a/src/Vulkan/VkMemory.cpp b/src/Vulkan/VkMemory.cpp
index 2789bdf..c522e5f 100644
--- a/src/Vulkan/VkMemory.cpp
+++ b/src/Vulkan/VkMemory.cpp
@@ -21,12 +21,10 @@
 
 void *allocateDeviceMemory(size_t bytes, size_t alignment)
 {
-	// TODO(b/140991626): Use allocateZeroOrPoison() instead of allocateZero() to detect MemorySanitizer errors.
 #if defined(SWIFTSHADER_ZERO_INITIALIZE_DEVICE_MEMORY)
-	return sw::allocateZero(bytes, alignment);
-#else
-	// TODO(b/140991626): Use allocateUninitialized() instead of allocateZeroOrPoison() to improve startup peformance.
 	return sw::allocateZeroOrPoison(bytes, alignment);
+#else
+	return sw::allocate(bytes, alignment);
 #endif
 }
 
@@ -43,7 +41,7 @@
 	}
 	else
 	{
-		// TODO(b/140991626): Use allocateUninitialized() instead of allocateZeroOrPoison() to improve startup peformance.
+		// TODO(b/140991626): Use allocate() instead of allocateZeroOrPoison() to improve startup performance.
 		return sw::allocateZeroOrPoison(bytes, alignment);
 	}
 }
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index b0a713d..2f4a7f2 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -1856,8 +1856,6 @@
 	case VK_FORMAT_D16_UNORM:
 	case VK_FORMAT_D32_SFLOAT:          // Note: either VK_FORMAT_D32_SFLOAT or VK_FORMAT_X8_D24_UNORM_PACK32 must be supported
 	case VK_FORMAT_D32_SFLOAT_S8_UINT:  // Note: either VK_FORMAT_D24_UNORM_S8_UINT or VK_FORMAT_D32_SFLOAT_S8_UINT must be supported
-		pFormatProperties->linearTilingFeatures |=
-		    VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR;
 		pFormatProperties->optimalTilingFeatures |=
 		    VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR;
 		break;
@@ -1999,19 +1997,19 @@
 
 	if(pFormatProperties->optimalTilingFeatures)
 	{
+		// "Formats that are required to support VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT must also support
+		//  VK_FORMAT_FEATURE_TRANSFER_SRC_BIT and VK_FORMAT_FEATURE_TRANSFER_DST_BIT."
+
 		pFormatProperties->linearTilingFeatures |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT |
 		                                           VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
 
 		if(!format.isCompressed())
 		{
-			if(pFormatProperties->optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
-			{
-				pFormatProperties->linearTilingFeatures |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
-			}
-			if(pFormatProperties->optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
-			{
-				pFormatProperties->linearTilingFeatures |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
-			}
+			VkFormatFeatureFlagBits2KHR transferableFeatureBits = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
+			                                                      VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT |
+			                                                      VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR;
+
+			pFormatProperties->linearTilingFeatures |= (pFormatProperties->optimalTilingFeatures & transferableFeatureBits);
 		}
 	}
 }
diff --git a/src/Vulkan/VkSpecializationInfo.cpp b/src/Vulkan/VkSpecializationInfo.cpp
index ff8cf8b..ec0ce3f 100644
--- a/src/Vulkan/VkSpecializationInfo.cpp
+++ b/src/Vulkan/VkSpecializationInfo.cpp
@@ -26,12 +26,12 @@
 	{
 		info.mapEntryCount = specializationInfo->mapEntryCount;
 		size_t entriesSize = specializationInfo->mapEntryCount * sizeof(VkSpecializationMapEntry);
-		void *mapEntries = sw::allocateUninitialized(entriesSize);
+		void *mapEntries = sw::allocate(entriesSize);
 		memcpy(mapEntries, specializationInfo->pMapEntries, entriesSize);
 		info.pMapEntries = reinterpret_cast<VkSpecializationMapEntry *>(mapEntries);
 
 		info.dataSize = specializationInfo->dataSize;
-		void *data = sw::allocateUninitialized(specializationInfo->dataSize);
+		void *data = sw::allocate(specializationInfo->dataSize);
 		memcpy(data, specializationInfo->pData, specializationInfo->dataSize);
 		info.pData = data;
 	}