Add vulkan header changes for device groups

Base changes for device groups:
 Add a command line option to query device group ID
 Add a query function to enumerate physical device groups
 Add VK_KHR_bind_memory2 extension

Components: Vulkan

VK-GL-CTS issue: 110

Change-Id: Id68404a45749408ce0d6749a7d45ab26e5ddd3d9
diff --git a/external/vulkancts/framework/vulkan/vkBasicTypes.inl b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
index cfedd26..13d6566 100644
--- a/external/vulkancts/framework/vulkan/vkBasicTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
@@ -9,6 +9,7 @@
 #define VK_MAX_MEMORY_TYPES					(static_cast<size_t>			(32))
 #define VK_MAX_MEMORY_HEAPS					(static_cast<size_t>			(16))
 #define VK_MAX_DESCRIPTION_SIZE				(static_cast<size_t>			(256))
+#define VK_MAX_DEVICE_GROUP_SIZE_KHX		(static_cast<size_t>			(32))
 #define VK_ATTACHMENT_UNUSED				(static_cast<deUint32>			((~0U)))
 #define VK_SUBPASS_EXTERNAL					(static_cast<deUint32>			((~0U)))
 #define VK_QUEUE_FAMILY_IGNORED				(static_cast<deUint32>			((~0U)))
@@ -162,6 +163,20 @@
 	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR					= 1000059006,
 	VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR						= 1000059007,
 	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR			= 1000059008,
+	VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX							= 1000060000,
+	VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHX								= 1000060001,
+	VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHX								= 1000060002,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX					= 1000060003,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX				= 1000060004,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX								= 1000060005,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX							= 1000060006,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX						= 1000060007,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX								= 1000060011,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX					= 1000060012,
+	VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHX					= 1000060013,
+	VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHX					= 1000060014,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX						= 1000070000,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX						= 1000070001,
 	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR			= 1000071000,
 	VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR						= 1000071001,
 	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR					= 1000071002,
@@ -1328,6 +1343,30 @@
 };
 typedef deUint32 VkSemaphoreImportFlagsKHR;
 
+enum VkPeerMemoryFeatureFlagBitsKHX
+{
+	VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX		= 0x00000001,
+	VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX		= 0x00000002,
+	VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX	= 0x00000004,
+	VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX	= 0x00000008,
+};
+typedef deUint32 VkPeerMemoryFeatureFlagsKHX;
+
+enum VkMemoryAllocateFlagBitsKHX
+{
+	VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX	= 0x00000001,
+};
+typedef deUint32 VkMemoryAllocateFlagsKHX;
+
+enum VkDeviceGroupPresentModeFlagBitsKHX
+{
+	VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX				= 0x00000001,
+	VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX				= 0x00000002,
+	VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX				= 0x00000004,
+	VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX	= 0x00000008,
+};
+typedef deUint32 VkDeviceGroupPresentModeFlagsKHX;
+
 typedef deUint32 VkInstanceCreateFlags;
 
 typedef deUint32 VkDeviceCreateFlags;
diff --git a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
index 8c5c0b3..96253ae 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
@@ -151,5 +151,11 @@
 virtual VkResult	getSemaphoreFdKHR						(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) const;
 virtual VkResult	getRefreshCycleDurationGOOGLE			(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) const;
 virtual VkResult	getPastPresentationTimingGOOGLE			(VkDevice device, VkSwapchainKHR swapchain, deUint32* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings) const;
+virtual void		getDeviceGroupPeerMemoryFeaturesKHX		(VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures) const;
+virtual void		cmdSetDeviceMaskKHX						(VkCommandBuffer commandBuffer, deUint32 deviceMask) const;
+virtual VkResult	getDeviceGroupPresentCapabilitiesKHX	(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities) const;
+virtual VkResult	getDeviceGroupSurfacePresentModesKHX	(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes) const;
+virtual VkResult	acquireNextImage2KHX					(VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex) const;
+virtual void		cmdDispatchBaseKHX						(VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) const;
 virtual VkResult	bindBufferMemory2KHR					(VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos) const;
 virtual VkResult	bindImageMemory2KHR						(VkDevice device, deUint32 bindInfoCount, const VkBindImageMemoryInfoKHR* pBindInfos) const;
diff --git a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
index 9b38c47..f9e8e42 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
@@ -52,3 +52,5 @@
 virtual void				debugReportMessageEXT								(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const;
 virtual void				getPhysicalDeviceExternalBufferPropertiesKHR		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, VkExternalBufferPropertiesKHR* pExternalBufferProperties) const;
 virtual void				getPhysicalDeviceExternalSemaphorePropertiesKHR		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHR* pExternalSemaphoreInfo, VkExternalSemaphorePropertiesKHR* pExternalSemaphoreProperties) const;
+virtual VkResult			getPhysicalDevicePresentRectanglesKHX				(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects) const;
+virtual VkResult			enumeratePhysicalDeviceGroupsKHX					(VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties) const;
diff --git a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
index 97ccf27..950c94f 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
@@ -752,6 +752,36 @@
 	return m_vk.getPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings);
 }
 
+void DeviceDriver::getDeviceGroupPeerMemoryFeaturesKHX (VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures) const
+{
+	m_vk.getDeviceGroupPeerMemoryFeaturesKHX(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+}
+
+void DeviceDriver::cmdSetDeviceMaskKHX (VkCommandBuffer commandBuffer, deUint32 deviceMask) const
+{
+	m_vk.cmdSetDeviceMaskKHX(commandBuffer, deviceMask);
+}
+
+VkResult DeviceDriver::getDeviceGroupPresentCapabilitiesKHX (VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities) const
+{
+	return m_vk.getDeviceGroupPresentCapabilitiesKHX(device, pDeviceGroupPresentCapabilities);
+}
+
+VkResult DeviceDriver::getDeviceGroupSurfacePresentModesKHX (VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes) const
+{
+	return m_vk.getDeviceGroupSurfacePresentModesKHX(device, surface, pModes);
+}
+
+VkResult DeviceDriver::acquireNextImage2KHX (VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex) const
+{
+	return m_vk.acquireNextImage2KHX(device, pAcquireInfo, pImageIndex);
+}
+
+void DeviceDriver::cmdDispatchBaseKHX (VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) const
+{
+	m_vk.cmdDispatchBaseKHX(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+}
+
 VkResult DeviceDriver::bindBufferMemory2KHR (VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos) const
 {
 	return m_vk.bindBufferMemory2KHR(device, bindInfoCount, pBindInfos);
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
index 0d199bf..284d016 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
@@ -151,5 +151,11 @@
 GetSemaphoreFdKHRFunc						getSemaphoreFdKHR;
 GetRefreshCycleDurationGOOGLEFunc			getRefreshCycleDurationGOOGLE;
 GetPastPresentationTimingGOOGLEFunc			getPastPresentationTimingGOOGLE;
+GetDeviceGroupPeerMemoryFeaturesKHXFunc		getDeviceGroupPeerMemoryFeaturesKHX;
+CmdSetDeviceMaskKHXFunc						cmdSetDeviceMaskKHX;
+GetDeviceGroupPresentCapabilitiesKHXFunc	getDeviceGroupPresentCapabilitiesKHX;
+GetDeviceGroupSurfacePresentModesKHXFunc	getDeviceGroupSurfacePresentModesKHX;
+AcquireNextImage2KHXFunc					acquireNextImage2KHX;
+CmdDispatchBaseKHXFunc						cmdDispatchBaseKHX;
 BindBufferMemory2KHRFunc					bindBufferMemory2KHR;
 BindImageMemory2KHRFunc						bindImageMemory2KHR;
diff --git a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
index 7d6a44b..5fd6ebf 100644
--- a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
@@ -206,5 +206,13 @@
 typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSemaphoreFdKHRFunc)									(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd);
 typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetRefreshCycleDurationGOOGLEFunc)						(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties);
 typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPastPresentationTimingGOOGLEFunc)					(VkDevice device, VkSwapchainKHR swapchain, deUint32* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetDeviceGroupPeerMemoryFeaturesKHXFunc)				(VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetDeviceMaskKHXFunc)								(VkCommandBuffer commandBuffer, deUint32 deviceMask);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDeviceGroupPresentCapabilitiesKHXFunc)				(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDeviceGroupSurfacePresentModesKHXFunc)				(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AcquireNextImage2KHXFunc)								(VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDispatchBaseKHXFunc)								(VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDevicePresentRectanglesKHXFunc)				(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumeratePhysicalDeviceGroupsKHXFunc)					(VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties);
 typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindBufferMemory2KHRFunc)								(VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos);
 typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindImageMemory2KHRFunc)								(VkDevice device, deUint32 bindInfoCount, const VkBindImageMemoryInfoKHR* pBindInfos);
diff --git a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
index 5f2be2e..1ea8a62 100644
--- a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
@@ -151,5 +151,11 @@
 m_vk.getSemaphoreFdKHR						= (GetSemaphoreFdKHRFunc)						GET_PROC_ADDR("vkGetSemaphoreFdKHR");
 m_vk.getRefreshCycleDurationGOOGLE			= (GetRefreshCycleDurationGOOGLEFunc)			GET_PROC_ADDR("vkGetRefreshCycleDurationGOOGLE");
 m_vk.getPastPresentationTimingGOOGLE		= (GetPastPresentationTimingGOOGLEFunc)			GET_PROC_ADDR("vkGetPastPresentationTimingGOOGLE");
+m_vk.getDeviceGroupPeerMemoryFeaturesKHX	= (GetDeviceGroupPeerMemoryFeaturesKHXFunc)		GET_PROC_ADDR("vkGetDeviceGroupPeerMemoryFeaturesKHX");
+m_vk.cmdSetDeviceMaskKHX					= (CmdSetDeviceMaskKHXFunc)						GET_PROC_ADDR("vkCmdSetDeviceMaskKHX");
+m_vk.getDeviceGroupPresentCapabilitiesKHX	= (GetDeviceGroupPresentCapabilitiesKHXFunc)	GET_PROC_ADDR("vkGetDeviceGroupPresentCapabilitiesKHX");
+m_vk.getDeviceGroupSurfacePresentModesKHX	= (GetDeviceGroupSurfacePresentModesKHXFunc)	GET_PROC_ADDR("vkGetDeviceGroupSurfacePresentModesKHX");
+m_vk.acquireNextImage2KHX					= (AcquireNextImage2KHXFunc)					GET_PROC_ADDR("vkAcquireNextImage2KHX");
+m_vk.cmdDispatchBaseKHX						= (CmdDispatchBaseKHXFunc)						GET_PROC_ADDR("vkCmdDispatchBaseKHX");
 m_vk.bindBufferMemory2KHR					= (BindBufferMemory2KHRFunc)					GET_PROC_ADDR("vkBindBufferMemory2KHR");
 m_vk.bindImageMemory2KHR					= (BindImageMemory2KHRFunc)						GET_PROC_ADDR("vkBindImageMemory2KHR");
diff --git a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
index 34ece9c..f1fb1a7 100644
--- a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
@@ -52,3 +52,5 @@
 m_vk.debugReportMessageEXT								= (DebugReportMessageEXTFunc)								GET_PROC_ADDR("vkDebugReportMessageEXT");
 m_vk.getPhysicalDeviceExternalBufferPropertiesKHR		= (GetPhysicalDeviceExternalBufferPropertiesKHRFunc)		GET_PROC_ADDR("vkGetPhysicalDeviceExternalBufferPropertiesKHR");
 m_vk.getPhysicalDeviceExternalSemaphorePropertiesKHR	= (GetPhysicalDeviceExternalSemaphorePropertiesKHRFunc)		GET_PROC_ADDR("vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
+m_vk.getPhysicalDevicePresentRectanglesKHX				= (GetPhysicalDevicePresentRectanglesKHXFunc)				GET_PROC_ADDR("vkGetPhysicalDevicePresentRectanglesKHX");
+m_vk.enumeratePhysicalDeviceGroupsKHX					= (EnumeratePhysicalDeviceGroupsKHXFunc)					GET_PROC_ADDR("vkEnumeratePhysicalDeviceGroupsKHX");
diff --git a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
index c7e210e..7475fd5 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
@@ -256,3 +256,13 @@
 {
 	m_vk.getPhysicalDeviceExternalSemaphorePropertiesKHR(physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
 }
+
+VkResult InstanceDriver::getPhysicalDevicePresentRectanglesKHX (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects) const
+{
+	return m_vk.getPhysicalDevicePresentRectanglesKHX(physicalDevice, surface, pRectCount, pRects);
+}
+
+VkResult InstanceDriver::enumeratePhysicalDeviceGroupsKHX (VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties) const
+{
+	return m_vk.enumeratePhysicalDeviceGroupsKHX(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
+}
diff --git a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
index e0c5ef0..3615192 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
@@ -52,3 +52,5 @@
 DebugReportMessageEXTFunc								debugReportMessageEXT;
 GetPhysicalDeviceExternalBufferPropertiesKHRFunc		getPhysicalDeviceExternalBufferPropertiesKHR;
 GetPhysicalDeviceExternalSemaphorePropertiesKHRFunc		getPhysicalDeviceExternalSemaphorePropertiesKHR;
+GetPhysicalDevicePresentRectanglesKHXFunc				getPhysicalDevicePresentRectanglesKHX;
+EnumeratePhysicalDeviceGroupsKHXFunc					enumeratePhysicalDeviceGroupsKHX;
diff --git a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
index cbf5dba..dc32f87 100644
--- a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
@@ -1388,6 +1388,72 @@
 	return VK_SUCCESS;
 }
 
+VKAPI_ATTR void VKAPI_CALL getDeviceGroupPeerMemoryFeaturesKHX (VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures)
+{
+	DE_UNREF(device);
+	DE_UNREF(heapIndex);
+	DE_UNREF(localDeviceIndex);
+	DE_UNREF(remoteDeviceIndex);
+	DE_UNREF(pPeerMemoryFeatures);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdSetDeviceMaskKHX (VkCommandBuffer commandBuffer, deUint32 deviceMask)
+{
+	DE_UNREF(commandBuffer);
+	DE_UNREF(deviceMask);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getDeviceGroupPresentCapabilitiesKHX (VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities)
+{
+	DE_UNREF(device);
+	DE_UNREF(pDeviceGroupPresentCapabilities);
+	return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getDeviceGroupSurfacePresentModesKHX (VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes)
+{
+	DE_UNREF(device);
+	DE_UNREF(surface);
+	DE_UNREF(pModes);
+	return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL acquireNextImage2KHX (VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex)
+{
+	DE_UNREF(device);
+	DE_UNREF(pAcquireInfo);
+	DE_UNREF(pImageIndex);
+	return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdDispatchBaseKHX (VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ)
+{
+	DE_UNREF(commandBuffer);
+	DE_UNREF(baseGroupX);
+	DE_UNREF(baseGroupY);
+	DE_UNREF(baseGroupZ);
+	DE_UNREF(groupCountX);
+	DE_UNREF(groupCountY);
+	DE_UNREF(groupCountZ);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDevicePresentRectanglesKHX (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects)
+{
+	DE_UNREF(physicalDevice);
+	DE_UNREF(surface);
+	DE_UNREF(pRectCount);
+	DE_UNREF(pRects);
+	return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL enumeratePhysicalDeviceGroupsKHX (VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties)
+{
+	DE_UNREF(instance);
+	DE_UNREF(pPhysicalDeviceGroupCount);
+	DE_UNREF(pPhysicalDeviceGroupProperties);
+	return VK_SUCCESS;
+}
+
 VKAPI_ATTR VkResult VKAPI_CALL bindBufferMemory2KHR (VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos)
 {
 	DE_UNREF(device);
@@ -1465,6 +1531,8 @@
 	VK_NULL_FUNC_ENTRY(vkDebugReportMessageEXT,								debugReportMessageEXT),
 	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR,		getPhysicalDeviceExternalBufferPropertiesKHR),
 	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR,	getPhysicalDeviceExternalSemaphorePropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDevicePresentRectanglesKHX,				getPhysicalDevicePresentRectanglesKHX),
+	VK_NULL_FUNC_ENTRY(vkEnumeratePhysicalDeviceGroupsKHX,					enumeratePhysicalDeviceGroupsKHX),
 };
 
 static const tcu::StaticFunctionLibrary::Entry s_deviceFunctions[] =
@@ -1619,6 +1687,12 @@
 	VK_NULL_FUNC_ENTRY(vkGetSemaphoreFdKHR,						getSemaphoreFdKHR),
 	VK_NULL_FUNC_ENTRY(vkGetRefreshCycleDurationGOOGLE,			getRefreshCycleDurationGOOGLE),
 	VK_NULL_FUNC_ENTRY(vkGetPastPresentationTimingGOOGLE,		getPastPresentationTimingGOOGLE),
+	VK_NULL_FUNC_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHX,	getDeviceGroupPeerMemoryFeaturesKHX),
+	VK_NULL_FUNC_ENTRY(vkCmdSetDeviceMaskKHX,					cmdSetDeviceMaskKHX),
+	VK_NULL_FUNC_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHX,	getDeviceGroupPresentCapabilitiesKHX),
+	VK_NULL_FUNC_ENTRY(vkGetDeviceGroupSurfacePresentModesKHX,	getDeviceGroupSurfacePresentModesKHX),
+	VK_NULL_FUNC_ENTRY(vkAcquireNextImage2KHX,					acquireNextImage2KHX),
+	VK_NULL_FUNC_ENTRY(vkCmdDispatchBaseKHX,					cmdDispatchBaseKHX),
 	VK_NULL_FUNC_ENTRY(vkBindBufferMemory2KHR,					bindBufferMemory2KHR),
 	VK_NULL_FUNC_ENTRY(vkBindImageMemory2KHR,					bindImageMemory2KHR),
 };
diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
index 5619432..429d189 100644
--- a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
@@ -48,6 +48,29 @@
 	return devices;
 }
 
+vector<VkPhysicalDeviceGroupPropertiesKHX> enumeratePhysicalDeviceGroupsKHX(const InstanceInterface& vk, VkInstance instance)
+{
+	deUint32									numDeviceGroups = 0;
+	vector<VkPhysicalDeviceGroupPropertiesKHX>	properties;
+
+	VK_CHECK(vk.enumeratePhysicalDeviceGroupsKHX(instance, &numDeviceGroups, DE_NULL));
+
+	if (numDeviceGroups > 0)
+	{
+		properties.resize(numDeviceGroups);
+		for (deUint32 i = 0; i < numDeviceGroups; i++)
+		{
+			properties[i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX;
+			properties[i].pNext = DE_NULL;
+		}
+		VK_CHECK(vk.enumeratePhysicalDeviceGroupsKHX(instance, &numDeviceGroups, &properties[0]));
+
+		if ((size_t)numDeviceGroups != properties.size())
+			TCU_FAIL("Returned device group count changed between queries");
+	}
+	return properties;
+}
+
 vector<VkQueueFamilyProperties> getPhysicalDeviceQueueFamilyProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
 {
 	deUint32						numQueues	= 0;
diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
index bf1709b..a49b0ff 100644
--- a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
@@ -35,6 +35,7 @@
 // API queries
 
 std::vector<VkPhysicalDevice>					enumeratePhysicalDevices						(const InstanceInterface& vk, VkInstance instance);
+std::vector<VkPhysicalDeviceGroupPropertiesKHX>	enumeratePhysicalDeviceGroupsKHX				(const InstanceInterface& vk, VkInstance instance);
 std::vector<VkQueueFamilyProperties>			getPhysicalDeviceQueueFamilyProperties			(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
 VkPhysicalDeviceFeatures						getPhysicalDeviceFeatures						(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
 VkPhysicalDeviceProperties						getPhysicalDeviceProperties						(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
diff --git a/external/vulkancts/framework/vulkan/vkStrUtil.inl b/external/vulkancts/framework/vulkan/vkStrUtil.inl
index 4d12a86..61dd935 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtil.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtil.inl
@@ -178,6 +178,9 @@
 tcu::Format::Bitfield<32>	getExternalSemaphoreHandleTypeFlagsKHRStr		(VkExternalSemaphoreHandleTypeFlagsKHR value);
 tcu::Format::Bitfield<32>	getExternalSemaphoreFeatureFlagsKHRStr			(VkExternalSemaphoreFeatureFlagsKHR value);
 tcu::Format::Bitfield<32>	getSemaphoreImportFlagsKHRStr					(VkSemaphoreImportFlagsKHR value);
+tcu::Format::Bitfield<32>	getPeerMemoryFeatureFlagsKHXStr					(VkPeerMemoryFeatureFlagsKHX value);
+tcu::Format::Bitfield<32>	getMemoryAllocateFlagsKHXStr					(VkMemoryAllocateFlagsKHX value);
+tcu::Format::Bitfield<32>	getDeviceGroupPresentModeFlagsKHXStr			(VkDeviceGroupPresentModeFlagsKHX value);
 tcu::Format::Bitfield<32>	getInstanceCreateFlagsStr						(VkInstanceCreateFlags value);
 tcu::Format::Bitfield<32>	getDeviceCreateFlagsStr							(VkDeviceCreateFlags value);
 tcu::Format::Bitfield<32>	getDeviceQueueCreateFlagsStr					(VkDeviceQueueCreateFlags value);
@@ -415,5 +418,20 @@
 std::ostream&	operator<<	(std::ostream& s, const VkPresentTimeGOOGLE& value);
 std::ostream&	operator<<	(std::ostream& s, const VkPresentTimesInfoGOOGLE& value);
 std::ostream&	operator<<	(std::ostream& s, const VkPhysicalDeviceVariablePointerFeaturesKHR& value);
+std::ostream&	operator<<	(std::ostream& s, const VkMemoryAllocateFlagsInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupRenderPassBeginInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupCommandBufferBeginInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupSubmitInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupBindSparseInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupPresentCapabilitiesKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkImageSwapchainCreateInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkBindBufferMemoryDeviceGroupInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkBindImageMemoryDeviceGroupInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkBindImageMemorySwapchainInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkAcquireNextImageInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupPresentInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupSwapchainCreateInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkPhysicalDeviceGroupPropertiesKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupDeviceCreateInfoKHX& value);
 std::ostream&	operator<<	(std::ostream& s, const VkBindBufferMemoryInfoKHR& value);
 std::ostream&	operator<<	(std::ostream& s, const VkBindImageMemoryInfoKHR& value);
diff --git a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
index 9df12a9..2667de5 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
@@ -173,6 +173,20 @@
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR:						return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR";
 		case VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR:						return "VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR";
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR:				return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR";
+		case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX:								return "VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX";
+		case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHX:									return "VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHX";
+		case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHX:									return "VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX:						return "VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX:					return "VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX:								return "VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX:							return "VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX:						return "VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX:								return "VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX:						return "VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX";
+		case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHX:					return "VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHX";
+		case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHX:						return "VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHX";
+		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX:						return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX:							return "VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX";
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR:				return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR";
 		case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR:						return "VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR";
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR:					return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR";
@@ -1566,6 +1580,39 @@
 	return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
 }
 
+tcu::Format::Bitfield<32> getPeerMemoryFeatureFlagsKHXStr (VkPeerMemoryFeatureFlagsKHX value)
+{
+	static const tcu::Format::BitDesc s_desc[] =
+	{
+		tcu::Format::BitDesc(VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX,		"VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX"),
+		tcu::Format::BitDesc(VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX,		"VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX"),
+		tcu::Format::BitDesc(VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX,	"VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX"),
+		tcu::Format::BitDesc(VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX,	"VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX"),
+	};
+	return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getMemoryAllocateFlagsKHXStr (VkMemoryAllocateFlagsKHX value)
+{
+	static const tcu::Format::BitDesc s_desc[] =
+	{
+		tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX,	"VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX"),
+	};
+	return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getDeviceGroupPresentModeFlagsKHXStr (VkDeviceGroupPresentModeFlagsKHX value)
+{
+	static const tcu::Format::BitDesc s_desc[] =
+	{
+		tcu::Format::BitDesc(VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX,				"VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX"),
+		tcu::Format::BitDesc(VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX,				"VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX"),
+		tcu::Format::BitDesc(VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX,					"VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX"),
+		tcu::Format::BitDesc(VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX,	"VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX"),
+	};
+	return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
 tcu::Format::Bitfield<32> getInstanceCreateFlagsStr (VkInstanceCreateFlags value)
 {
 	return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
@@ -4316,6 +4363,180 @@
 	return s;
 }
 
+std::ostream& operator<< (std::ostream& s, const VkMemoryAllocateFlagsInfoKHX& value)
+{
+	s << "VkMemoryAllocateFlagsInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tflags = " << getMemoryAllocateFlagsKHXStr(value.flags) << '\n';
+	s << "\tdeviceMask = " << value.deviceMask << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupRenderPassBeginInfoKHX& value)
+{
+	s << "VkDeviceGroupRenderPassBeginInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tdeviceMask = " << value.deviceMask << '\n';
+	s << "\tdeviceRenderAreaCount = " << value.deviceRenderAreaCount << '\n';
+	s << "\tpDeviceRenderAreas = " << value.pDeviceRenderAreas << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupCommandBufferBeginInfoKHX& value)
+{
+	s << "VkDeviceGroupCommandBufferBeginInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tdeviceMask = " << value.deviceMask << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupSubmitInfoKHX& value)
+{
+	s << "VkDeviceGroupSubmitInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\twaitSemaphoreCount = " << value.waitSemaphoreCount << '\n';
+	s << "\tpWaitSemaphoreDeviceIndices = " << value.pWaitSemaphoreDeviceIndices << '\n';
+	s << "\tcommandBufferCount = " << value.commandBufferCount << '\n';
+	s << "\tpCommandBufferDeviceMasks = " << value.pCommandBufferDeviceMasks << '\n';
+	s << "\tsignalSemaphoreCount = " << value.signalSemaphoreCount << '\n';
+	s << "\tpSignalSemaphoreDeviceIndices = " << value.pSignalSemaphoreDeviceIndices << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupBindSparseInfoKHX& value)
+{
+	s << "VkDeviceGroupBindSparseInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tresourceDeviceIndex = " << value.resourceDeviceIndex << '\n';
+	s << "\tmemoryDeviceIndex = " << value.memoryDeviceIndex << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupPresentCapabilitiesKHX& value)
+{
+	s << "VkDeviceGroupPresentCapabilitiesKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tpresentMask = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.presentMask), DE_ARRAY_END(value.presentMask)) << '\n';
+	s << "\tmodes = " << getDeviceGroupPresentModeFlagsKHXStr(value.modes) << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkImageSwapchainCreateInfoKHX& value)
+{
+	s << "VkImageSwapchainCreateInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tswapchain = " << value.swapchain << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkBindBufferMemoryDeviceGroupInfoKHX& value)
+{
+	s << "VkBindBufferMemoryDeviceGroupInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tdeviceIndexCount = " << value.deviceIndexCount << '\n';
+	s << "\tpDeviceIndices = " << value.pDeviceIndices << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkBindImageMemoryDeviceGroupInfoKHX& value)
+{
+	s << "VkBindImageMemoryDeviceGroupInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tdeviceIndexCount = " << value.deviceIndexCount << '\n';
+	s << "\tpDeviceIndices = " << value.pDeviceIndices << '\n';
+	s << "\tSFRRectCount = " << value.SFRRectCount << '\n';
+	s << "\tpSFRRects = " << value.pSFRRects << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkBindImageMemorySwapchainInfoKHX& value)
+{
+	s << "VkBindImageMemorySwapchainInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tswapchain = " << value.swapchain << '\n';
+	s << "\timageIndex = " << value.imageIndex << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkAcquireNextImageInfoKHX& value)
+{
+	s << "VkAcquireNextImageInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tswapchain = " << value.swapchain << '\n';
+	s << "\ttimeout = " << value.timeout << '\n';
+	s << "\tsemaphore = " << value.semaphore << '\n';
+	s << "\tfence = " << value.fence << '\n';
+	s << "\tdeviceMask = " << value.deviceMask << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupPresentInfoKHX& value)
+{
+	s << "VkDeviceGroupPresentInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tswapchainCount = " << value.swapchainCount << '\n';
+	s << "\tpDeviceMasks = " << value.pDeviceMasks << '\n';
+	s << "\tmode = " << value.mode << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupSwapchainCreateInfoKHX& value)
+{
+	s << "VkDeviceGroupSwapchainCreateInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tmodes = " << getDeviceGroupPresentModeFlagsKHXStr(value.modes) << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceGroupPropertiesKHX& value)
+{
+	s << "VkPhysicalDeviceGroupPropertiesKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tphysicalDeviceCount = " << value.physicalDeviceCount << '\n';
+	s << "\tphysicalDevices = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.physicalDevices), DE_ARRAY_END(value.physicalDevices)) << '\n';
+	s << "\tsubsetAllocation = " << value.subsetAllocation << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupDeviceCreateInfoKHX& value)
+{
+	s << "VkDeviceGroupDeviceCreateInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tphysicalDeviceCount = " << value.physicalDeviceCount << '\n';
+	s << "\tpPhysicalDevices = " << value.pPhysicalDevices << '\n';
+	s << '}';
+	return s;
+}
+
 std::ostream& operator<< (std::ostream& s, const VkBindBufferMemoryInfoKHR& value)
 {
 	s << "VkBindBufferMemoryInfoKHR = {\n";
diff --git a/external/vulkancts/framework/vulkan/vkStructTypes.inl b/external/vulkancts/framework/vulkan/vkStructTypes.inl
index f186ed7..a0f359b 100644
--- a/external/vulkancts/framework/vulkan/vkStructTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkStructTypes.inl
@@ -1971,6 +1971,135 @@
 	VkBool32		variablePointers;
 };
 
+struct VkMemoryAllocateFlagsInfoKHX
+{
+	VkStructureType				sType;
+	const void*					pNext;
+	VkMemoryAllocateFlagsKHX	flags;
+	deUint32					deviceMask;
+};
+
+struct VkDeviceGroupRenderPassBeginInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		deviceMask;
+	deUint32		deviceRenderAreaCount;
+	const VkRect2D*	pDeviceRenderAreas;
+};
+
+struct VkDeviceGroupCommandBufferBeginInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		deviceMask;
+};
+
+struct VkDeviceGroupSubmitInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		waitSemaphoreCount;
+	const deUint32*	pWaitSemaphoreDeviceIndices;
+	deUint32		commandBufferCount;
+	const deUint32*	pCommandBufferDeviceMasks;
+	deUint32		signalSemaphoreCount;
+	const deUint32*	pSignalSemaphoreDeviceIndices;
+};
+
+struct VkDeviceGroupBindSparseInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		resourceDeviceIndex;
+	deUint32		memoryDeviceIndex;
+};
+
+struct VkDeviceGroupPresentCapabilitiesKHX
+{
+	VkStructureType						sType;
+	const void*							pNext;
+	deUint32							presentMask[VK_MAX_DEVICE_GROUP_SIZE_KHX];
+	VkDeviceGroupPresentModeFlagsKHX	modes;
+};
+
+struct VkImageSwapchainCreateInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	VkSwapchainKHR	swapchain;
+};
+
+struct VkBindBufferMemoryDeviceGroupInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		deviceIndexCount;
+	const deUint32*	pDeviceIndices;
+};
+
+struct VkBindImageMemoryDeviceGroupInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		deviceIndexCount;
+	const deUint32*	pDeviceIndices;
+	deUint32		SFRRectCount;
+	const VkRect2D*	pSFRRects;
+};
+
+struct VkBindImageMemorySwapchainInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	VkSwapchainKHR	swapchain;
+	deUint32		imageIndex;
+};
+
+struct VkAcquireNextImageInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	VkSwapchainKHR	swapchain;
+	deUint64		timeout;
+	VkSemaphore		semaphore;
+	VkFence			fence;
+	deUint32		deviceMask;
+};
+
+struct VkDeviceGroupPresentInfoKHX
+{
+	VkStructureType						sType;
+	const void*							pNext;
+	deUint32							swapchainCount;
+	const deUint32*						pDeviceMasks;
+	VkDeviceGroupPresentModeFlagBitsKHX	mode;
+};
+
+struct VkDeviceGroupSwapchainCreateInfoKHX
+{
+	VkStructureType						sType;
+	const void*							pNext;
+	VkDeviceGroupPresentModeFlagsKHX	modes;
+};
+
+struct VkPhysicalDeviceGroupPropertiesKHX
+{
+	VkStructureType		sType;
+	void*				pNext;
+	deUint32			physicalDeviceCount;
+	VkPhysicalDevice	physicalDevices[VK_MAX_DEVICE_GROUP_SIZE_KHX];
+	VkBool32			subsetAllocation;
+};
+
+struct VkDeviceGroupDeviceCreateInfoKHX
+{
+	VkStructureType			sType;
+	const void*				pNext;
+	deUint32				physicalDeviceCount;
+	const VkPhysicalDevice*	pPhysicalDevices;
+};
+
 struct VkBindBufferMemoryInfoKHR
 {
 	VkStructureType	sType;
diff --git a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
index 7630125..6244839 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
@@ -151,5 +151,11 @@
 virtual VkResult	getSemaphoreFdKHR						(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
 virtual VkResult	getRefreshCycleDurationGOOGLE			(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) const = 0;
 virtual VkResult	getPastPresentationTimingGOOGLE			(VkDevice device, VkSwapchainKHR swapchain, deUint32* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings) const = 0;
+virtual void		getDeviceGroupPeerMemoryFeaturesKHX		(VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures) const = 0;
+virtual void		cmdSetDeviceMaskKHX						(VkCommandBuffer commandBuffer, deUint32 deviceMask) const = 0;
+virtual VkResult	getDeviceGroupPresentCapabilitiesKHX	(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities) const = 0;
+virtual VkResult	getDeviceGroupSurfacePresentModesKHX	(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes) const = 0;
+virtual VkResult	acquireNextImage2KHX					(VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex) const = 0;
+virtual void		cmdDispatchBaseKHX						(VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) const = 0;
 virtual VkResult	bindBufferMemory2KHR					(VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos) const = 0;
 virtual VkResult	bindImageMemory2KHR						(VkDevice device, deUint32 bindInfoCount, const VkBindImageMemoryInfoKHR* pBindInfos) const = 0;
diff --git a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
index 2923961..b4e47b9 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
@@ -52,3 +52,5 @@
 virtual void				debugReportMessageEXT								(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const = 0;
 virtual void				getPhysicalDeviceExternalBufferPropertiesKHR		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, VkExternalBufferPropertiesKHR* pExternalBufferProperties) const = 0;
 virtual void				getPhysicalDeviceExternalSemaphorePropertiesKHR		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHR* pExternalSemaphoreInfo, VkExternalSemaphorePropertiesKHR* pExternalSemaphoreProperties) const = 0;
+virtual VkResult			getPhysicalDevicePresentRectanglesKHX				(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects) const = 0;
+virtual VkResult			enumeratePhysicalDeviceGroupsKHX					(VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties) const = 0;
diff --git a/external/vulkancts/scripts/gen_framework.py b/external/vulkancts/scripts/gen_framework.py
index a37cba5..394bf3b 100644
--- a/external/vulkancts/scripts/gen_framework.py
+++ b/external/vulkancts/scripts/gen_framework.py
@@ -47,6 +47,7 @@
 	("VK_MAX_MEMORY_TYPES",					"size_t"),
 	("VK_MAX_MEMORY_HEAPS",					"size_t"),
 	("VK_MAX_DESCRIPTION_SIZE",				"size_t"),
+	("VK_MAX_DEVICE_GROUP_SIZE_KHX",		"size_t"),
 	("VK_ATTACHMENT_UNUSED",				"deUint32"),
 	("VK_SUBPASS_EXTERNAL",					"deUint32"),
 	("VK_QUEUE_FAMILY_IGNORED",				"deUint32"),
diff --git a/external/vulkancts/scripts/src/vulkan.h.in b/external/vulkancts/scripts/src/vulkan.h.in
index e9e3053..e83674e 100644
--- a/external/vulkancts/scripts/src/vulkan.h.in
+++ b/external/vulkancts/scripts/src/vulkan.h.in
@@ -227,6 +227,20 @@
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR = 1000059006,
     VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR = 1000059007,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR = 1000059008,
+    VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX = 1000060000,
+    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHX = 1000060001,
+    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHX = 1000060002,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX = 1000060003,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX = 1000060004,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX = 1000060005,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX = 1000060006,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX = 1000060007,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX = 1000060011,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX = 1000060012,
+    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHX = 1000060013,
+    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHX = 1000060014,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX = 1000070000,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX = 1000070001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR = 1000071000,
     VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR = 1000071001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR = 1000071002,
@@ -281,7 +295,7 @@
     VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = 1000146002,
     VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR = 1000146003,
     VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = 1000146004,
-	VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = 1000157000,
+    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = 1000157000,
     VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR = 1000157001,
     VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO,
     VK_STRUCTURE_TYPE_END_RANGE = VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO,
@@ -5039,6 +5053,214 @@
     VkBool32           variablePointers;
 } VkPhysicalDeviceVariablePointerFeaturesKHR;
 
+#define VK_KHX_device_group 1
+#define VK_MAX_DEVICE_GROUP_SIZE_KHX      32
+#define VK_KHX_DEVICE_GROUP_SPEC_VERSION  2
+#define VK_KHX_DEVICE_GROUP_EXTENSION_NAME "VK_KHX_device_group"
+
+typedef enum VkPeerMemoryFeatureFlagBitsKHX {
+    VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX = 0x00000001,
+    VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX = 0x00000002,
+    VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX = 0x00000004,
+    VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX = 0x00000008,
+    VK_PEER_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM_KHX = 0x7FFFFFFF
+} VkPeerMemoryFeatureFlagBitsKHX;
+typedef VkFlags VkPeerMemoryFeatureFlagsKHX;
+
+typedef enum VkMemoryAllocateFlagBitsKHX {
+    VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX = 0x00000001,
+    VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM_KHX = 0x7FFFFFFF
+} VkMemoryAllocateFlagBitsKHX;
+typedef VkFlags VkMemoryAllocateFlagsKHX;
+
+typedef enum VkDeviceGroupPresentModeFlagBitsKHX {
+    VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX = 0x00000001,
+    VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX = 0x00000002,
+    VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX = 0x00000004,
+    VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX = 0x00000008,
+    VK_DEVICE_GROUP_PRESENT_MODE_FLAG_BITS_MAX_ENUM_KHX = 0x7FFFFFFF
+} VkDeviceGroupPresentModeFlagBitsKHX;
+typedef VkFlags VkDeviceGroupPresentModeFlagsKHX;
+
+typedef struct VkMemoryAllocateFlagsInfoKHX {
+    VkStructureType             sType;
+    const void*                 pNext;
+    VkMemoryAllocateFlagsKHX    flags;
+    uint32_t                    deviceMask;
+} VkMemoryAllocateFlagsInfoKHX;
+
+typedef struct VkDeviceGroupRenderPassBeginInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           deviceMask;
+    uint32_t           deviceRenderAreaCount;
+    const VkRect2D*    pDeviceRenderAreas;
+} VkDeviceGroupRenderPassBeginInfoKHX;
+
+typedef struct VkDeviceGroupCommandBufferBeginInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           deviceMask;
+} VkDeviceGroupCommandBufferBeginInfoKHX;
+
+typedef struct VkDeviceGroupSubmitInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           waitSemaphoreCount;
+    const uint32_t*    pWaitSemaphoreDeviceIndices;
+    uint32_t           commandBufferCount;
+    const uint32_t*    pCommandBufferDeviceMasks;
+    uint32_t           signalSemaphoreCount;
+    const uint32_t*    pSignalSemaphoreDeviceIndices;
+} VkDeviceGroupSubmitInfoKHX;
+
+typedef struct VkDeviceGroupBindSparseInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           resourceDeviceIndex;
+    uint32_t           memoryDeviceIndex;
+} VkDeviceGroupBindSparseInfoKHX;
+
+typedef struct VkDeviceGroupPresentCapabilitiesKHX {
+    VkStructureType                     sType;
+    const void*                         pNext;
+    uint32_t                            presentMask[VK_MAX_DEVICE_GROUP_SIZE_KHX];
+    VkDeviceGroupPresentModeFlagsKHX    modes;
+} VkDeviceGroupPresentCapabilitiesKHX;
+
+typedef struct VkImageSwapchainCreateInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    VkSwapchainKHR     swapchain;
+} VkImageSwapchainCreateInfoKHX;
+
+typedef struct VkBindBufferMemoryDeviceGroupInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           deviceIndexCount;
+    const uint32_t*    pDeviceIndices;
+} VkBindBufferMemoryDeviceGroupInfoKHX;
+
+typedef struct VkBindImageMemoryDeviceGroupInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           deviceIndexCount;
+    const uint32_t*    pDeviceIndices;
+    uint32_t           SFRRectCount;
+    const VkRect2D*    pSFRRects;
+} VkBindImageMemoryDeviceGroupInfoKHX;
+
+typedef struct VkBindImageMemorySwapchainInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    VkSwapchainKHR     swapchain;
+    uint32_t           imageIndex;
+} VkBindImageMemorySwapchainInfoKHX;
+
+typedef struct VkAcquireNextImageInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    VkSwapchainKHR     swapchain;
+    uint64_t           timeout;
+    VkSemaphore        semaphore;
+    VkFence            fence;
+    uint32_t           deviceMask;
+} VkAcquireNextImageInfoKHX;
+
+typedef struct VkDeviceGroupPresentInfoKHX {
+    VkStructureType                        sType;
+    const void*                            pNext;
+    uint32_t                               swapchainCount;
+    const uint32_t*                        pDeviceMasks;
+    VkDeviceGroupPresentModeFlagBitsKHX    mode;
+} VkDeviceGroupPresentInfoKHX;
+
+typedef struct VkDeviceGroupSwapchainCreateInfoKHX {
+    VkStructureType                     sType;
+    const void*                         pNext;
+    VkDeviceGroupPresentModeFlagsKHX    modes;
+} VkDeviceGroupSwapchainCreateInfoKHX;
+
+
+typedef void (VKAPI_PTR *PFN_vkGetDeviceGroupPeerMemoryFeaturesKHX)(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures);
+typedef void (VKAPI_PTR *PFN_vkCmdSetDeviceMaskKHX)(VkCommandBuffer commandBuffer, uint32_t deviceMask);
+typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupPresentCapabilitiesKHX)(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities);
+typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupSurfacePresentModesKHX)(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes);
+typedef VkResult (VKAPI_PTR *PFN_vkAcquireNextImage2KHX)(VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, uint32_t* pImageIndex);
+typedef void (VKAPI_PTR *PFN_vkCmdDispatchBaseKHX)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
+typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDevicePresentRectanglesKHX)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pRectCount, VkRect2D* pRects);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkGetDeviceGroupPeerMemoryFeaturesKHX(
+    VkDevice                                    device,
+    uint32_t                                    heapIndex,
+    uint32_t                                    localDeviceIndex,
+    uint32_t                                    remoteDeviceIndex,
+    VkPeerMemoryFeatureFlagsKHX*                pPeerMemoryFeatures);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMaskKHX(
+    VkCommandBuffer                             commandBuffer,
+    uint32_t                                    deviceMask);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupPresentCapabilitiesKHX(
+    VkDevice                                    device,
+    VkDeviceGroupPresentCapabilitiesKHX*        pDeviceGroupPresentCapabilities);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModesKHX(
+    VkDevice                                    device,
+    VkSurfaceKHR                                surface,
+    VkDeviceGroupPresentModeFlagsKHX*           pModes);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImage2KHX(
+    VkDevice                                    device,
+    const VkAcquireNextImageInfoKHX*            pAcquireInfo,
+    uint32_t*                                   pImageIndex);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBaseKHX(
+    VkCommandBuffer                             commandBuffer,
+    uint32_t                                    baseGroupX,
+    uint32_t                                    baseGroupY,
+    uint32_t                                    baseGroupZ,
+    uint32_t                                    groupCountX,
+    uint32_t                                    groupCountY,
+    uint32_t                                    groupCountZ);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHX(
+    VkPhysicalDevice                            physicalDevice,
+    VkSurfaceKHR                                surface,
+    uint32_t*                                   pRectCount,
+    VkRect2D*                                   pRects);
+#endif
+
+#define VK_KHX_device_group_creation 1
+#define VK_KHX_DEVICE_GROUP_CREATION_SPEC_VERSION 1
+#define VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME "VK_KHX_device_group_creation"
+
+typedef struct VkPhysicalDeviceGroupPropertiesKHX {
+    VkStructureType     sType;
+    void*               pNext;
+    uint32_t            physicalDeviceCount;
+    VkPhysicalDevice    physicalDevices[VK_MAX_DEVICE_GROUP_SIZE_KHX];
+    VkBool32            subsetAllocation;
+} VkPhysicalDeviceGroupPropertiesKHX;
+
+typedef struct VkDeviceGroupDeviceCreateInfoKHX {
+    VkStructureType            sType;
+    const void*                pNext;
+    uint32_t                   physicalDeviceCount;
+    const VkPhysicalDevice*    pPhysicalDevices;
+} VkDeviceGroupDeviceCreateInfoKHX;
+
+
+typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceGroupsKHX)(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroupsKHX(
+    VkInstance                                  instance,
+    uint32_t*                                   pPhysicalDeviceGroupCount,
+    VkPhysicalDeviceGroupPropertiesKHX*         pPhysicalDeviceGroupProperties);
+#endif
+
 #define VK_KHR_bind_memory2 1
 #define VK_KHR_BIND_MEMORY_2_SPEC_VERSION 1
 #define VK_KHR_BIND_MEMORY_2_EXTENSION_NAME "VK_KHR_bind_memory2"
diff --git a/framework/common/tcuCommandLine.cpp b/framework/common/tcuCommandLine.cpp
index 99c6faa..e6d4b32 100644
--- a/framework/common/tcuCommandLine.cpp
+++ b/framework/common/tcuCommandLine.cpp
@@ -86,6 +86,7 @@
 DE_DECLARE_COMMAND_LINE_OPT(LogShaderSources,			bool);
 DE_DECLARE_COMMAND_LINE_OPT(TestOOM,					bool);
 DE_DECLARE_COMMAND_LINE_OPT(VKDeviceID,					int);
+DE_DECLARE_COMMAND_LINE_OPT(VKDeviceGroupID,			int);
 DE_DECLARE_COMMAND_LINE_OPT(LogFlush,					bool);
 DE_DECLARE_COMMAND_LINE_OPT(Validation,					bool);
 
@@ -171,6 +172,7 @@
 		<< Option<EGLWindowType>		(DE_NULL,	"deqp-egl-window-type",			"EGL native window type")
 		<< Option<EGLPixmapType>		(DE_NULL,	"deqp-egl-pixmap-type",			"EGL native pixmap type")
 		<< Option<VKDeviceID>			(DE_NULL,	"deqp-vk-device-id",			"Vulkan device ID (IDs start from 1)",									"1")
+		<< Option<VKDeviceGroupID>		(DE_NULL,	"deqp-vk-device-group-id",		"Vulkan device Group ID (IDs start from 1)",							"1")
 		<< Option<LogImages>			(DE_NULL,	"deqp-log-images",				"Enable or disable logging of result images",		s_enableNames,		"enable")
 		<< Option<LogShaderSources>		(DE_NULL,	"deqp-log-shader-sources",		"Enable or disable logging of shader sources",		s_enableNames,		"enable")
 		<< Option<TestOOM>				(DE_NULL,	"deqp-test-oom",				"Run tests that exhaust memory on purpose",			s_enableNames,		TEST_OOM_DEFAULT)
@@ -786,6 +788,7 @@
 int						CommandLine::getCLPlatformId			(void) const	{ return m_cmdLine.getOption<opt::CLPlatformID>();					}
 const std::vector<int>&	CommandLine::getCLDeviceIds				(void) const	{ return m_cmdLine.getOption<opt::CLDeviceIDs>();					}
 int						CommandLine::getVKDeviceId				(void) const	{ return m_cmdLine.getOption<opt::VKDeviceID>();					}
+int						CommandLine::getVKDeviceGroupId			(void) const	{ return m_cmdLine.getOption<opt::VKDeviceGroupID>();				}
 bool					CommandLine::isValidationEnabled		(void) const	{ return m_cmdLine.getOption<opt::Validation>();					}
 bool					CommandLine::isOutOfMemoryTestEnabled	(void) const	{ return m_cmdLine.getOption<opt::TestOOM>();						}
 
diff --git a/framework/common/tcuCommandLine.hpp b/framework/common/tcuCommandLine.hpp
index 65388a2..c25951d 100644
--- a/framework/common/tcuCommandLine.hpp
+++ b/framework/common/tcuCommandLine.hpp
@@ -202,6 +202,9 @@
 	//! Get Vulkan device ID (--deqp-vk-device-id)
 	int								getVKDeviceId				(void) const;
 
+	//! Get Vulkan device group ID (--deqp-vk-device-group-id)
+	int								getVKDeviceGroupId			(void) const;
+
 	//! Enable development-time test case validation checks
 	bool							isValidationEnabled			(void) const;