Merge vk-gl-cts/vulkan-cts-1.3.1 into vk-gl-cts/vulkan-cts-1.3.2

Change-Id: Iab357d9f9a46d2bbe710bd116003c8da423c9709
diff --git a/external/vulkancts/data/vulkan/amber/builtin/precision/square_matrix/determinant_compute_fp64_mat_3x3.amber b/external/vulkancts/data/vulkan/amber/builtin/precision/square_matrix/determinant_compute_fp64_mat_3x3.amber
index 1ed071a..be69f94 100644
--- a/external/vulkancts/data/vulkan/amber/builtin/precision/square_matrix/determinant_compute_fp64_mat_3x3.amber
+++ b/external/vulkancts/data/vulkan/amber/builtin/precision/square_matrix/determinant_compute_fp64_mat_3x3.amber
@@ -112,7 +112,7 @@
 EXPECT bufOut IDX 32 TOLERANCE 0.000000000001818989403546 EQ           -4572.819874970912419629875268
 
 # Decimals between 32768 and 65536: 7.275957614e-12
-EXPECT bufOut IDX 40 TOLERANCE 0.0000000000072759576      EQ           39409.657530142280652696
+EXPECT bufOut IDX 40 TOLERANCE 0.0000000000072759576141834259      EQ           39409.657530142280652696
 
 # Decimals between 1.407374884e+14 and 2.814749767e+14: 0.03125
 EXPECT bufOut IDX 48 TOLERANCE 0.125                      EQ 193279112353655.781250
@@ -121,7 +121,7 @@
 EXPECT bufOut IDX 56 TOLERANCE 0.00000000023283064365387  EQ         1056597.50481621926485282276659
 
 # Decimals between 0.000244140625 and 0.00048828125: 0.00048828125
-EXPECT bufOut IDX 64 TOLERANCE 0.00048828125              EQ  -2382539145823.611328125
+EXPECT bufOut IDX 64 TOLERANCE 0.00048828125000000001              EQ  -2382539145823.611328125
 
 # Decimals between 131072 and 262144: 2.910383046e-11
 EXPECT bufOut IDX 72 TOLERANCE 0.00000000002910383046     EQ         -194083.93092791094919429
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeatures2.inl b/external/vulkancts/framework/vulkan/vkDeviceFeatures2.inl
index dd49368..33eaa34 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeatures2.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeatures2.inl
@@ -134,7 +134,7 @@
 const bool isSubgroupSizeControlFeatures				= checkExtension(properties, "VK_EXT_subgroup_size_control")				|| context.contextSupports(vk::ApiVersion(1, 3, 0));
 const bool isSynchronization2Features					= checkExtension(properties, "VK_KHR_synchronization2")						|| context.contextSupports(vk::ApiVersion(1, 3, 0));
 const bool isFragmentShaderInterlockFeaturesEXT			= checkExtension(properties, "VK_EXT_fragment_shader_interlock");
-const bool isTexelBufferAlignmentFeaturesEXT			= checkExtension(properties, "VK_EXT_texel_buffer_alignment")				|| context.contextSupports(vk::ApiVersion(1, 3, 0));
+const bool isTexelBufferAlignmentFeaturesEXT			= checkExtension(properties, "VK_EXT_texel_buffer_alignment");
 const bool isTextureCompressionASTCHDRFeatures			= checkExtension(properties, "VK_EXT_texture_compression_astc_hdr")			|| context.contextSupports(vk::ApiVersion(1, 3, 0));
 const bool isTimelineSemaphoreFeatures					= checkExtension(properties, "VK_KHR_timeline_semaphore")					|| context.contextSupports(vk::ApiVersion(1, 2, 0));
 const bool isTransformFeedbackFeaturesEXT				= checkExtension(properties, "VK_EXT_transform_feedback");
diff --git a/external/vulkancts/framework/vulkan/vkDeviceUtil.cpp b/external/vulkancts/framework/vulkan/vkDeviceUtil.cpp
index 3b397ba..0c86dd8 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkDeviceUtil.cpp
@@ -48,10 +48,13 @@
 	bool			validationEnabled	= (!enabledLayers.empty());
 	vector<string>	actualExtensions	= enabledExtensions;
 
+    // Enumerate once, pass it in to the various functions that require the list of available extensions
+	vector<vk::VkExtensionProperties> availableExtensions = enumerateInstanceExtensionProperties(vkPlatform, DE_NULL);
+
 	if (validationEnabled)
 	{
 		// Make sure the debug report extension is enabled when validation is enabled.
-		if (!isDebugReportSupported(vkPlatform))
+		if (!isExtensionSupported(availableExtensions, RequiredExtension("VK_EXT_debug_report")))
 			TCU_THROW(NotSupportedError, "VK_EXT_debug_report is not supported");
 
 		if (!de::contains(begin(actualExtensions), end(actualExtensions), "VK_EXT_debug_report"))
@@ -60,6 +63,13 @@
 		DE_ASSERT(recorder);
 	}
 
+	// Make sure portability enumeration is enabled whenever it is available
+	bool portability_enumeration_available = isExtensionSupported(availableExtensions, RequiredExtension("VK_KHR_portability_enumeration"));
+	if (portability_enumeration_available)
+	{
+		actualExtensions.push_back("VK_KHR_portability_enumeration");
+	}
+
 	vector<const char*>		layerNamePtrs		(enabledLayers.size());
 	vector<const char*>		extensionNamePtrs	(actualExtensions.size());
 
diff --git a/external/vulkancts/framework/vulkan/vkInstanceExtensions.inl b/external/vulkancts/framework/vulkan/vkInstanceExtensions.inl
index 2bf3c7e..33f253b 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceExtensions.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceExtensions.inl
@@ -14,6 +14,7 @@
 	"VK_KHR_get_physical_device_properties2",
 	"VK_KHR_get_surface_capabilities2",
 	"VK_KHR_mir_surface",
+	"VK_KHR_portability_enumeration",
 	"VK_KHR_surface",
 	"VK_KHR_surface_protected_capabilities",
 	"VK_KHR_wayland_surface",
diff --git a/external/vulkancts/framework/vulkan/vkSupportedExtensions.inl b/external/vulkancts/framework/vulkan/vkSupportedExtensions.inl
index 373fc97..febbb39 100644
--- a/external/vulkancts/framework/vulkan/vkSupportedExtensions.inl
+++ b/external/vulkancts/framework/vulkan/vkSupportedExtensions.inl
@@ -50,7 +50,6 @@
 		dst.push_back("VK_EXT_tooling_info");
 		dst.push_back("VK_EXT_extended_dynamic_state");
 		dst.push_back("VK_EXT_shader_demote_to_helper_invocation");
-		dst.push_back("VK_EXT_texel_buffer_alignment");
 		dst.push_back("VK_EXT_private_data");
 		dst.push_back("VK_EXT_pipeline_creation_cache_control");
 		dst.push_back("VK_EXT_image_robustness");
diff --git a/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
index 7ea72e6..b7843c6 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
@@ -1214,6 +1214,7 @@
 		const vk::Unique<vk::VkSemaphore>	semaphore	(createAndImportSemaphore(vkd, *device, config.externalType, handle, flags));
 
 		submitEmptyWait(vkd, queue, *semaphore);
+		VK_CHECK(vkd.queueWaitIdle(queue));
 
 		return tcu::TestStatus::pass("Pass");
 	}
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
index 8d4356f..4ab1faa 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
@@ -6189,7 +6189,7 @@
 															| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
 
 														 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-														 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
+														 (VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT),
 
 														 byRegion ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u));
 					}
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTrinaryMinMaxTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTrinaryMinMaxTests.cpp
index 49440ae..6daffa8 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTrinaryMinMaxTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTrinaryMinMaxTests.cpp
@@ -719,7 +719,7 @@
 
 	vk::BufferWithMemory	inputBuffer		{vkd, device, allocator, inputBufferInfo,	vk::MemoryRequirement::HostVisible};
 	vk::BufferWithMemory	outputBuffer	{vkd, device, allocator, outputBufferInfo,	vk::MemoryRequirement::HostVisible};
-	std::unique_ptr<char[]>	referenceBuffer	{new char[kOutputBufferSize]};
+	std::unique_ptr<char[]>	referenceBuffer	{new char[static_cast<size_t>(kOutputBufferSize)]};
 
 	// Fill buffers with initial contents.
 	auto& inputAlloc	= inputBuffer.getAllocation();
diff --git a/external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutTests.cpp b/external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutTests.cpp
index eb95f04..fcd4862 100644
--- a/external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutTests.cpp
+++ b/external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutTests.cpp
@@ -93,12 +93,13 @@
 private:
 	void					generateBlock				(de::Random& rnd, deUint32 layoutFlags);
 	void					generateBufferVar			(de::Random& rnd, BufferBlock& block, bool isLastMember);
-	glu::VarType			generateType				(de::Random& rnd, int typeDepth, bool arrayOk, bool unusedArrayOk);
+	glu::VarType			generateType				(de::Random& rnd, int structDepth, int arrayDepth, bool arrayOk, bool unusedArrayOk);
 
 	deUint32				m_features;
 	int						m_maxBlocks;
 	int						m_maxInstances;
 	int						m_maxArrayLength;
+	int						m_maxArrayDepth;
 	int						m_maxStructDepth;
 	int						m_maxBlockMembers;
 	int						m_maxStructMembers;
@@ -115,6 +116,7 @@
 	, m_maxBlocks			((features & FEATURE_DESCRIPTOR_INDEXING)	? 1 : 4)
 	, m_maxInstances		((features & FEATURE_INSTANCE_ARRAYS)		? 3 : 0)
 	, m_maxArrayLength		((features & FEATURE_ARRAYS)				? 8 : 1)
+	, m_maxArrayDepth		((features& FEATURE_ARRAYS_OF_ARRAYS)		? 2 : 0)
 	, m_maxStructDepth		((features & FEATURE_STRUCTS)				? 2 : 0)
 	, m_maxBlockMembers		(5)
 	, m_maxStructMembers	(4)
@@ -232,7 +234,7 @@
 	const float			accessWeight		= 0.85f;
 	const bool			unusedOk			= (m_features & FEATURE_UNUSED_VARS) != 0;
 	const std::string	name				= genName('a', 'z', m_bufferVarNdx);
-	const glu::VarType	type				= generateType(rnd, 0, true, isLastMember && (m_features & FEATURE_UNSIZED_ARRAYS));
+	const glu::VarType	type				= generateType(rnd, 0, 0, true, isLastMember && (m_features & FEATURE_UNSIZED_ARRAYS));
 	const bool			access				= !unusedOk || (rnd.getFloat() < accessWeight);
 	const bool			read				= access ? (rnd.getFloat() < readWeight) : false;
 	const bool			write				= access ? (!read || (rnd.getFloat() < writeWeight)) : false;
@@ -243,7 +245,7 @@
 	m_bufferVarNdx += 1;
 }
 
-glu::VarType RandomSSBOLayoutCase::generateType (de::Random& rnd, int typeDepth, bool arrayOk, bool unsizedArrayOk)
+glu::VarType RandomSSBOLayoutCase::generateType (de::Random& rnd, int structDepth, int arrayDepth, bool arrayOk, bool unsizedArrayOk)
 {
 	const float structWeight		= 0.1f;
 	const float arrayWeight			= 0.1f;
@@ -253,18 +255,19 @@
 
 	if (unsizedArrayOk && (rnd.getFloat() < unsizedArrayWeight))
 	{
-		const bool			childArrayOk	= (m_features & FEATURE_ARRAYS_OF_ARRAYS) != 0;
-		const glu::VarType	elementType		= generateType(rnd, typeDepth, childArrayOk, false);
+		const bool			childArrayOk	= ((m_features & FEATURE_ARRAYS_OF_ARRAYS) != 0) &&
+											  (arrayDepth < m_maxArrayDepth);
+		const glu::VarType	elementType		= generateType(rnd, structDepth, arrayDepth + 1, childArrayOk, false);
 		return glu::VarType(elementType, glu::VarType::UNSIZED_ARRAY);
 	}
-	else if (typeDepth < m_maxStructDepth && rnd.getFloat() < structWeight)
+	else if (structDepth < m_maxStructDepth && rnd.getFloat() < structWeight)
 	{
 		vector<glu::VarType>	memberTypes;
 		int						numMembers = rnd.getInt(1, m_maxStructMembers);
 
 		// Generate members first so nested struct declarations are in correct order.
 		for (int ndx = 0; ndx < numMembers; ndx++)
-			memberTypes.push_back(generateType(rnd, typeDepth+1, true, false));
+			memberTypes.push_back(generateType(rnd, structDepth + 1, arrayDepth, (arrayDepth < m_maxArrayDepth), false));
 
 		glu::StructType& structType = m_interface.allocStruct((string("s") + genName('A', 'Z', m_structNdx)).c_str());
 		m_structNdx += 1;
@@ -280,8 +283,9 @@
 	else if (m_maxArrayLength > 0 && arrayOk && rnd.getFloat() < arrayWeight)
 	{
 		const int			arrayLength		= rnd.getInt(1, m_maxArrayLength);
-		const bool			childArrayOk	= (m_features & FEATURE_ARRAYS_OF_ARRAYS) != 0;
-		const glu::VarType	elementType		= generateType(rnd, typeDepth, childArrayOk, false);
+		const bool			childArrayOk	= ((m_features & FEATURE_ARRAYS_OF_ARRAYS) != 0) &&
+											  (arrayDepth < m_maxArrayDepth);
+		const glu::VarType	elementType		= generateType(rnd, structDepth, arrayDepth + 1, childArrayOk, false);
 
 		return glu::VarType(elementType, arrayLength);
 	}
diff --git a/external/vulkancts/mustpass/main/src/excluded-tests.txt b/external/vulkancts/mustpass/main/src/excluded-tests.txt
index 4e0402a..22e5374 100644
--- a/external/vulkancts/mustpass/main/src/excluded-tests.txt
+++ b/external/vulkancts/mustpass/main/src/excluded-tests.txt
@@ -2,10 +2,7 @@
 dEQP-VK.glsl.texture_functions.texturegrad.sparse_samplercubeshadow_fragment
 dEQP-VK.glsl.texture_functions.texturegrad.sparse_samplercubeshadow_vertex
 
-# VK-GL-CTS 1829
-# Test shader length is excessive, excluding until such time as the test case can be re-visited.
-dEQP-VK.ssbo.layout.random.scalar.75
-
 # VK-GL-CTS 3005
 dEQP-VK.ray_tracing_pipeline.build.cpuht*1048576_1_1
 dEQP-VK.ray_tracing_pipeline.build.cpuht*65536_4_4
+
diff --git a/external/vulkancts/mustpass/main/vk-default/ssbo.txt b/external/vulkancts/mustpass/main/vk-default/ssbo.txt
index 557f87e..ad51e0a 100644
--- a/external/vulkancts/mustpass/main/vk-default/ssbo.txt
+++ b/external/vulkancts/mustpass/main/vk-default/ssbo.txt
@@ -3927,6 +3927,7 @@
 dEQP-VK.ssbo.layout.random.scalar.72
 dEQP-VK.ssbo.layout.random.scalar.73
 dEQP-VK.ssbo.layout.random.scalar.74
+dEQP-VK.ssbo.layout.random.scalar.75
 dEQP-VK.ssbo.layout.random.scalar.76
 dEQP-VK.ssbo.layout.random.scalar.77
 dEQP-VK.ssbo.layout.random.scalar.78
diff --git a/external/vulkancts/scripts/src/extensions/VK_EXT_texel_buffer_alignment.json b/external/vulkancts/scripts/src/extensions/VK_EXT_texel_buffer_alignment.json
index 3d59d74..b607f64 100644
--- a/external/vulkancts/scripts/src/extensions/VK_EXT_texel_buffer_alignment.json
+++ b/external/vulkancts/scripts/src/extensions/VK_EXT_texel_buffer_alignment.json
@@ -2,7 +2,8 @@
 	"register_extension":
 	{
 		"type": "device",
-		"core": "1.3.0"
+		"core": "",
+		"note": "Partial promotion, only the properties structure was promoted to vk1.3, the feature structure was not promoted"
 	},
 	"mandatory_features":
 	{
diff --git a/external/vulkancts/scripts/src/extensions/VK_KHR_portability_enumeration.json b/external/vulkancts/scripts/src/extensions/VK_KHR_portability_enumeration.json
new file mode 100644
index 0000000..cf6a384
--- /dev/null
+++ b/external/vulkancts/scripts/src/extensions/VK_KHR_portability_enumeration.json
@@ -0,0 +1,7 @@
+{
+	"register_extension":
+	{
+		"type": "instance",
+		"core": ""
+	}
+}
\ No newline at end of file
diff --git a/framework/platform/android/tcuAndroidPlatform.cpp b/framework/platform/android/tcuAndroidPlatform.cpp
index 41fdfb2..a86e6d0 100644
--- a/framework/platform/android/tcuAndroidPlatform.cpp
+++ b/framework/platform/android/tcuAndroidPlatform.cpp
@@ -337,7 +337,20 @@
 	// Worst-case estimates
 	const size_t	MiB				= (size_t)(1<<20);
 	const size_t	baseMemUsage	= 400*MiB;
+
+#if (DE_PTR_SIZE == 4)
+	// Some tests, such as:
+	//
+	// dEQP-VK.api.object_management.max_concurrent.*
+	// dEQP-VK.memory.allocation.random.*
+	//
+	// when run in succession, can lead to system memory fragmentation. It depends on the allocator, and on some 32-bit
+	// systems can lead to out of memory errors. As a workaround, we use a smaller amount of memory on 32-bit systems,
+	// as this typically avoids out of memory errors caused by fragmentation.
+	const double	safeUsageRatio	= 0.1;
+#else
 	const double	safeUsageRatio	= 0.25;
+#endif
 
 	limits.totalSystemMemory					= de::max((size_t)(double(deInt64(m_totalSystemMemory)-deInt64(baseMemUsage)) * safeUsageRatio), 16*MiB);