diff --git a/Android.mk b/Android.mk
index 70666cc..202b83a 100644
--- a/Android.mk
+++ b/Android.mk
@@ -904,6 +904,7 @@
 	external/vulkancts/modules/vulkan/vktTestPackage.cpp \
 	external/vulkancts/modules/vulkan/vktTestPackageEntry.cpp \
 	external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp \
+	external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp \
 	external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp \
 	external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp \
 	external/vulkancts/modules/vulkan/wsi/vktWsiTests.cpp
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index 32f3d19..e832eb7 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
@@ -134414,6 +134414,12 @@
 dEQP-VK.wsi.android.display_timing.immediate.display_timing
 dEQP-VK.wsi.android.display_timing.mailbox.reference
 dEQP-VK.wsi.android.display_timing.mailbox.display_timing
+dEQP-VK.wsi.android.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.android.shared_presentable_image.scale_none.continuous
+dEQP-VK.wsi.android.shared_presentable_image.scale_up.demand
+dEQP-VK.wsi.android.shared_presentable_image.scale_up.continuous
+dEQP-VK.wsi.android.shared_presentable_image.scale_down.demand
+dEQP-VK.wsi.android.shared_presentable_image.scale_down.continuous
 dEQP-VK.synchronization.smoke.fences
 dEQP-VK.synchronization.smoke.semaphores
 dEQP-VK.synchronization.smoke.events
diff --git a/external/vulkancts/framework/vulkan/vkBasicTypes.inl b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
index 16661e2..aad3052 100644
--- a/external/vulkancts/framework/vulkan/vkBasicTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
@@ -173,6 +173,7 @@
 	VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT									= 1000061000,
 	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR		= 1000080000,
 	VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR									= 1000084000,
+	VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR				= 1000111000,
 	VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR			= 1000085000,
 	VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX							= 1000086000,
 	VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX				= 1000086001,
@@ -458,6 +459,7 @@
 	VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL				= 7,
 	VK_IMAGE_LAYOUT_PREINITIALIZED						= 8,
 	VK_IMAGE_LAYOUT_PRESENT_SRC_KHR						= 1000001002,
+	VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR					= 1000111000,
 };
 
 enum VkImageViewType
@@ -753,12 +755,12 @@
 
 enum VkPresentModeKHR
 {
-	VK_PRESENT_MODE_IMMEDIATE_KHR		= 0,
-	VK_PRESENT_MODE_MAILBOX_KHR			= 1,
-	VK_PRESENT_MODE_FIFO_KHR			= 2,
-	VK_PRESENT_MODE_FIFO_RELAXED_KHR	= 3,
-
-	VK_PRESENT_MODE_KHR_LAST
+	VK_PRESENT_MODE_IMMEDIATE_KHR					= 0,
+	VK_PRESENT_MODE_MAILBOX_KHR						= 1,
+	VK_PRESENT_MODE_FIFO_KHR						= 2,
+	VK_PRESENT_MODE_FIFO_RELAXED_KHR				= 3,
+	VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR		= 1000111000,
+	VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR	= 1000111001,
 };
 
 enum VkDebugReportObjectTypeEXT
diff --git a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
index 1976c3b..737ce24 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
@@ -128,6 +128,7 @@
 virtual VkResult	queuePresentKHR									(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) const;
 virtual VkResult	createSharedSwapchainsKHR						(VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains) const;
 virtual void		trimCommandPoolKHR								(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags) const;
+virtual VkResult	getSwapchainStatusKHR							(VkDevice device, VkSwapchainKHR swapchain) const;
 virtual VkResult	debugMarkerSetObjectTagEXT						(VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo) const;
 virtual VkResult	debugMarkerSetObjectNameEXT						(VkDevice device, VkDebugMarkerObjectNameInfoEXT* pNameInfo) const;
 virtual void		cmdDebugMarkerBeginEXT							(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const;
diff --git a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
index adc39d8..bc88896 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
@@ -637,6 +637,11 @@
 	m_vk.trimCommandPoolKHR(device, commandPool, flags);
 }
 
+VkResult DeviceDriver::getSwapchainStatusKHR (VkDevice device, VkSwapchainKHR swapchain) const
+{
+	return m_vk.getSwapchainStatusKHR(device, swapchain);
+}
+
 VkResult DeviceDriver::debugMarkerSetObjectTagEXT (VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo) const
 {
 	return m_vk.debugMarkerSetObjectTagEXT(device, pTagInfo);
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
index 7077438..b929b0f 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
@@ -128,6 +128,7 @@
 QueuePresentKHRFunc									queuePresentKHR;
 CreateSharedSwapchainsKHRFunc						createSharedSwapchainsKHR;
 TrimCommandPoolKHRFunc								trimCommandPoolKHR;
+GetSwapchainStatusKHRFunc							getSwapchainStatusKHR;
 DebugMarkerSetObjectTagEXTFunc						debugMarkerSetObjectTagEXT;
 DebugMarkerSetObjectNameEXTFunc						debugMarkerSetObjectNameEXT;
 CmdDebugMarkerBeginEXTFunc							cmdDebugMarkerBeginEXT;
diff --git a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
index 32193be..ffc439a 100644
--- a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
@@ -177,6 +177,7 @@
 typedef VKAPI_ATTR void					(VKAPI_CALL* TrimCommandPoolKHRFunc)								(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags);
 typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceCapabilities2KHRFunc)			(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities);
 typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceFormats2KHRFunc)				(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, deUint32* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSwapchainStatusKHRFunc)								(VkDevice device, VkSwapchainKHR swapchain);
 typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDebugReportCallbackEXTFunc)						(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback);
 typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDebugReportCallbackEXTFunc)						(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator);
 typedef VKAPI_ATTR void					(VKAPI_CALL* DebugReportMessageEXTFunc)								(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage);
diff --git a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
index c6755a4..25309f1 100644
--- a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
@@ -128,6 +128,7 @@
 m_vk.queuePresentKHR									= (QueuePresentKHRFunc)									GET_PROC_ADDR("vkQueuePresentKHR");
 m_vk.createSharedSwapchainsKHR							= (CreateSharedSwapchainsKHRFunc)						GET_PROC_ADDR("vkCreateSharedSwapchainsKHR");
 m_vk.trimCommandPoolKHR									= (TrimCommandPoolKHRFunc)								GET_PROC_ADDR("vkTrimCommandPoolKHR");
+m_vk.getSwapchainStatusKHR								= (GetSwapchainStatusKHRFunc)							GET_PROC_ADDR("vkGetSwapchainStatusKHR");
 m_vk.debugMarkerSetObjectTagEXT							= (DebugMarkerSetObjectTagEXTFunc)						GET_PROC_ADDR("vkDebugMarkerSetObjectTagEXT");
 m_vk.debugMarkerSetObjectNameEXT						= (DebugMarkerSetObjectNameEXTFunc)						GET_PROC_ADDR("vkDebugMarkerSetObjectNameEXT");
 m_vk.cmdDebugMarkerBeginEXT								= (CmdDebugMarkerBeginEXTFunc)							GET_PROC_ADDR("vkCmdDebugMarkerBeginEXT");
diff --git a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
index dcd1d6a..063bac2 100644
--- a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
@@ -1212,6 +1212,13 @@
 	return VK_SUCCESS;
 }
 
+VKAPI_ATTR VkResult VKAPI_CALL getSwapchainStatusKHR (VkDevice device, VkSwapchainKHR swapchain)
+{
+	DE_UNREF(device);
+	DE_UNREF(swapchain);
+	return VK_SUCCESS;
+}
+
 VKAPI_ATTR void VKAPI_CALL debugReportMessageEXT (VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage)
 {
 	DE_UNREF(instance);
@@ -1572,6 +1579,7 @@
 	VK_NULL_FUNC_ENTRY(vkQueuePresentKHR,									queuePresentKHR),
 	VK_NULL_FUNC_ENTRY(vkCreateSharedSwapchainsKHR,							createSharedSwapchainsKHR),
 	VK_NULL_FUNC_ENTRY(vkTrimCommandPoolKHR,								trimCommandPoolKHR),
+	VK_NULL_FUNC_ENTRY(vkGetSwapchainStatusKHR,								getSwapchainStatusKHR),
 	VK_NULL_FUNC_ENTRY(vkDebugMarkerSetObjectTagEXT,						debugMarkerSetObjectTagEXT),
 	VK_NULL_FUNC_ENTRY(vkDebugMarkerSetObjectNameEXT,						debugMarkerSetObjectNameEXT),
 	VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerBeginEXT,							cmdDebugMarkerBeginEXT),
diff --git a/external/vulkancts/framework/vulkan/vkStrUtil.inl b/external/vulkancts/framework/vulkan/vkStrUtil.inl
index 320cb12..ff6545a 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtil.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtil.inl
@@ -354,6 +354,7 @@
 std::ostream&	operator<<	(std::ostream& s, const VkPhysicalDeviceSurfaceInfo2KHR& value);
 std::ostream&	operator<<	(std::ostream& s, const VkSurfaceCapabilities2KHR& value);
 std::ostream&	operator<<	(std::ostream& s, const VkSurfaceFormat2KHR& value);
+std::ostream&	operator<<	(std::ostream& s, const VkSharedPresentSurfaceCapabilitiesKHR& value);
 std::ostream&	operator<<	(std::ostream& s, const VkDebugReportCallbackCreateInfoEXT& value);
 std::ostream&	operator<<	(std::ostream& s, const VkPipelineRasterizationStateRasterizationOrderAMD& value);
 std::ostream&	operator<<	(std::ostream& s, const VkDebugMarkerObjectNameInfoEXT& value);
diff --git a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
index 6829b4d..36e8648 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
@@ -186,6 +186,7 @@
 		case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:									return "VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT";
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:			return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR";
 		case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:										return "VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR";
+		case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:					return "VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR";
 		case VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR:				return "VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR";
 		case VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX:							return "VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX";
 		case VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX:				return "VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX";
@@ -493,6 +494,7 @@
 		case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:				return "VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL";
 		case VK_IMAGE_LAYOUT_PREINITIALIZED:					return "VK_IMAGE_LAYOUT_PREINITIALIZED";
 		case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:					return "VK_IMAGE_LAYOUT_PRESENT_SRC_KHR";
+		case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:				return "VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR";
 		default:												return DE_NULL;
 	}
 }
@@ -844,11 +846,13 @@
 {
 	switch (value)
 	{
-		case VK_PRESENT_MODE_IMMEDIATE_KHR:		return "VK_PRESENT_MODE_IMMEDIATE_KHR";
-		case VK_PRESENT_MODE_MAILBOX_KHR:		return "VK_PRESENT_MODE_MAILBOX_KHR";
-		case VK_PRESENT_MODE_FIFO_KHR:			return "VK_PRESENT_MODE_FIFO_KHR";
-		case VK_PRESENT_MODE_FIFO_RELAXED_KHR:	return "VK_PRESENT_MODE_FIFO_RELAXED_KHR";
-		default:								return DE_NULL;
+		case VK_PRESENT_MODE_IMMEDIATE_KHR:					return "VK_PRESENT_MODE_IMMEDIATE_KHR";
+		case VK_PRESENT_MODE_MAILBOX_KHR:					return "VK_PRESENT_MODE_MAILBOX_KHR";
+		case VK_PRESENT_MODE_FIFO_KHR:						return "VK_PRESENT_MODE_FIFO_KHR";
+		case VK_PRESENT_MODE_FIFO_RELAXED_KHR:				return "VK_PRESENT_MODE_FIFO_RELAXED_KHR";
+		case VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR:		return "VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR";
+		case VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR:	return "VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR";
+		default:											return DE_NULL;
 	}
 }
 
@@ -3541,6 +3545,16 @@
 	return s;
 }
 
+std::ostream& operator<< (std::ostream& s, const VkSharedPresentSurfaceCapabilitiesKHR& value)
+{
+	s << "VkSharedPresentSurfaceCapabilitiesKHR = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tsharedPresentSupportedUsageFlags = " << getImageUsageFlagsStr(value.sharedPresentSupportedUsageFlags) << '\n';
+	s << '}';
+	return s;
+}
+
 std::ostream& operator<< (std::ostream& s, const VkDebugReportCallbackCreateInfoEXT& value)
 {
 	s << "VkDebugReportCallbackCreateInfoEXT = {\n";
diff --git a/external/vulkancts/framework/vulkan/vkStructTypes.inl b/external/vulkancts/framework/vulkan/vkStructTypes.inl
index 195c97f..9f8ede6 100644
--- a/external/vulkancts/framework/vulkan/vkStructTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkStructTypes.inl
@@ -1476,6 +1476,13 @@
 	VkSurfaceFormatKHR	surfaceFormat;
 };
 
+struct VkSharedPresentSurfaceCapabilitiesKHR
+{
+	VkStructureType		sType;
+	void*				pNext;
+	VkImageUsageFlags	sharedPresentSupportedUsageFlags;
+};
+
 struct VkDebugReportCallbackCreateInfoEXT
 {
 	VkStructureType					sType;
diff --git a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
index 53a1040..51e8653 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
@@ -128,6 +128,7 @@
 virtual VkResult	queuePresentKHR									(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) const = 0;
 virtual VkResult	createSharedSwapchainsKHR						(VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains) const = 0;
 virtual void		trimCommandPoolKHR								(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags) const = 0;
+virtual VkResult	getSwapchainStatusKHR							(VkDevice device, VkSwapchainKHR swapchain) const = 0;
 virtual VkResult	debugMarkerSetObjectTagEXT						(VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo) const = 0;
 virtual VkResult	debugMarkerSetObjectNameEXT						(VkDevice device, VkDebugMarkerObjectNameInfoEXT* pNameInfo) const = 0;
 virtual void		cmdDebugMarkerBeginEXT							(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const = 0;
diff --git a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
index f366127..9fdc29f 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
@@ -675,6 +675,7 @@
 		"VK_KHR_push_descriptor",
 		"VK_KHR_descriptor_update_template",
 		"VK_KHR_incremental_present",
+		"VK_KHR_shared_presentable_image",
 	};
 
 	checkKhrExtensions(results, extensions, DE_LENGTH_OF_ARRAY(s_allowedDeviceKhrExtensions), s_allowedDeviceKhrExtensions);
diff --git a/external/vulkancts/modules/vulkan/wsi/CMakeLists.txt b/external/vulkancts/modules/vulkan/wsi/CMakeLists.txt
index a565b31..a010a31 100644
--- a/external/vulkancts/modules/vulkan/wsi/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/wsi/CMakeLists.txt
@@ -13,6 +13,8 @@
 	vktWsiIncrementalPresentTests.hpp
 	vktWsiDisplayTimingTests.cpp
 	vktWsiDisplayTimingTests.hpp
+	vktWsiSharedPresentableImageTests.cpp
+	vktWsiSharedPresentableImageTests.hpp
 	)
 
 set(DEQP_VK_WSI_LIBS
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp
new file mode 100644
index 0000000..d3b4239
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.cpp
@@ -0,0 +1,1367 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Tests for shared presentable image extension
+ *//*--------------------------------------------------------------------*/
+
+#include "vktWsiSharedPresentableImageTests.hpp"
+
+#include "vktTestCaseUtil.hpp"
+#include "vktTestGroupUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vkWsiPlatform.hpp"
+#include "vkWsiUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkDeviceUtil.hpp"
+#include "vkPlatform.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkPrograms.hpp"
+
+#include "vkWsiUtil.hpp"
+
+#include "tcuPlatform.hpp"
+#include "tcuResultCollector.hpp"
+
+#include <vector>
+#include <string>
+
+using std::vector;
+using std::string;
+
+using tcu::Maybe;
+using tcu::UVec2;
+using tcu::TestLog;
+
+namespace vkt
+{
+namespace wsi
+{
+namespace
+{
+enum Scaling
+{
+	SCALING_NONE,
+	SCALING_UP,
+	SCALING_DOWN
+};
+
+typedef vector<vk::VkExtensionProperties> Extensions;
+
+void checkAllSupported (const Extensions& supportedExtensions, const vector<string>& requiredExtensions)
+{
+	for (vector<string>::const_iterator requiredExtName = requiredExtensions.begin();
+		 requiredExtName != requiredExtensions.end();
+		 ++requiredExtName)
+	{
+		if (!isExtensionSupported(supportedExtensions, vk::RequiredExtension(*requiredExtName)))
+			TCU_THROW(NotSupportedError, (*requiredExtName + " is not supported").c_str());
+	}
+}
+
+vk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface&		vkp,
+												const Extensions&					supportedExtensions,
+												vk::wsi::Type						wsiType)
+{
+	vector<string>	extensions;
+
+	extensions.push_back("VK_KHR_surface");
+	extensions.push_back("VK_KHR_get_surface_capabilities2");
+	// Required for device extension to expose new physical device bits (in this
+	// case, presentation mode enums)
+	extensions.push_back("VK_KHR_get_physical_device_properties2");
+	extensions.push_back(getExtensionName(wsiType));
+
+	checkAllSupported(supportedExtensions, extensions);
+
+	return vk::createDefaultInstance(vkp, vector<string>(), extensions);
+}
+
+vk::VkPhysicalDeviceFeatures getDeviceNullFeatures (void)
+{
+	vk::VkPhysicalDeviceFeatures features;
+	deMemset(&features, 0, sizeof(features));
+	return features;
+}
+
+deUint32 getNumQueueFamilyIndices (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice)
+{
+	deUint32	numFamilies		= 0;
+
+	vki.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numFamilies, DE_NULL);
+
+	return numFamilies;
+}
+
+vector<deUint32> getSupportedQueueFamilyIndices (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, vk::VkSurfaceKHR surface)
+{
+	const deUint32		numTotalFamilyIndices	= getNumQueueFamilyIndices(vki, physicalDevice);
+	vector<deUint32>	supportedFamilyIndices;
+
+	for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < numTotalFamilyIndices; ++queueFamilyNdx)
+	{
+		if (vk::wsi::getPhysicalDeviceSurfaceSupport(vki, physicalDevice, queueFamilyNdx, surface) != VK_FALSE)
+			supportedFamilyIndices.push_back(queueFamilyNdx);
+	}
+
+	return supportedFamilyIndices;
+}
+
+deUint32 chooseQueueFamilyIndex (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, vk::VkSurfaceKHR surface)
+{
+	const vector<deUint32>	supportedFamilyIndices	= getSupportedQueueFamilyIndices(vki, physicalDevice, surface);
+
+	if (supportedFamilyIndices.empty())
+		TCU_THROW(NotSupportedError, "Device doesn't support presentation");
+
+	return supportedFamilyIndices[0];
+}
+
+vk::Move<vk::VkDevice> createDeviceWithWsi (const vk::InstanceInterface&		vki,
+											vk::VkPhysicalDevice				physicalDevice,
+											const Extensions&					supportedExtensions,
+											const deUint32						queueFamilyIndex,
+											bool								requiresSharedPresentableImage,
+											const vk::VkAllocationCallbacks*	pAllocator = DE_NULL)
+{
+	const float							queuePriorities[]	= { 1.0f };
+	const vk::VkDeviceQueueCreateInfo	queueInfos[]		=
+	{
+		{
+			vk::VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
+			DE_NULL,
+			(vk::VkDeviceQueueCreateFlags)0,
+			queueFamilyIndex,
+			DE_LENGTH_OF_ARRAY(queuePriorities),
+			&queuePriorities[0]
+		}
+	};
+	const vk::VkPhysicalDeviceFeatures	features		= getDeviceNullFeatures();
+	const char* const					extensions[]	=
+	{
+		"VK_KHR_swapchain",
+		"VK_KHR_shared_presentable_image"
+	};
+
+	const vk::VkDeviceCreateInfo		deviceParams	=
+	{
+		vk::VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
+		DE_NULL,
+		(vk::VkDeviceCreateFlags)0,
+		DE_LENGTH_OF_ARRAY(queueInfos),
+		&queueInfos[0],
+		0u,
+		DE_NULL,
+		requiresSharedPresentableImage ? 2u : 1u,
+		DE_ARRAY_BEGIN(extensions),
+		&features
+	};
+
+	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(extensions); ++ndx)
+	{
+		if (!isExtensionSupported(supportedExtensions, vk::RequiredExtension(extensions[ndx])))
+			TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str());
+	}
+
+	return createDevice(vki, physicalDevice, &deviceParams, pAllocator);
+}
+
+de::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform&	platform,
+											 const Extensions&		supportedExtensions,
+											 vk::wsi::Type			wsiType)
+{
+	try
+	{
+		return de::MovePtr<vk::wsi::Display>(platform.createWsiDisplay(wsiType));
+	}
+	catch (const tcu::NotSupportedError& e)
+	{
+		if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType))))
+		{
+			// If VK_KHR_{platform}_surface was supported, vk::Platform implementation
+			// must support creating native display & window for that WSI type.
+			throw tcu::TestError(e.getMessage());
+		}
+		else
+			throw;
+	}
+}
+
+de::MovePtr<vk::wsi::Window> createWindow (const vk::wsi::Display& display, const Maybe<UVec2>& initialSize)
+{
+	try
+	{
+		return de::MovePtr<vk::wsi::Window>(display.createWindow(initialSize));
+	}
+	catch (const tcu::NotSupportedError& e)
+	{
+		// See createDisplay - assuming that wsi::Display was supported platform port
+		// should also support creating a window.
+		throw tcu::TestError(e.getMessage());
+	}
+}
+
+bool wsiTypeSupportsScaling (vk::wsi::Type wsiType)
+{
+	return vk::wsi::getPlatformProperties(wsiType).swapchainExtent == vk::wsi::PlatformProperties::SWAPCHAIN_EXTENT_SCALED_TO_WINDOW_SIZE;
+}
+
+vk::VkQueue getDeviceQueue (const vk::DeviceInterface& vkd, vk::VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex)
+{
+	vk::VkQueue queue = (vk::VkQueue)0;
+	vkd.getDeviceQueue(device, queueFamilyIndex, queueIndex, &queue);
+	return queue;
+}
+
+vk::Move<vk::VkSemaphore> createSemaphore (const vk::DeviceInterface&	vkd,
+										   vk::VkDevice					device)
+{
+	const vk::VkSemaphoreCreateInfo createInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
+		DE_NULL,
+		0u
+	};
+	return vk::createSemaphore(vkd, device, &createInfo);
+}
+
+void initSemaphores (const vk::DeviceInterface&		vkd,
+					 vk::VkDevice					device,
+					 std::vector<vk::VkSemaphore>&	semaphores)
+{
+	for (size_t ndx = 0; ndx < semaphores.size(); ndx++)
+		semaphores[ndx] = createSemaphore(vkd, device).disown();
+}
+
+void deinitSemaphores (const vk::DeviceInterface&	vkd,
+					 vk::VkDevice					device,
+					 std::vector<vk::VkSemaphore>&	semaphores)
+{
+	for (size_t ndx = 0; ndx < semaphores.size(); ndx++)
+	{
+		if (semaphores[ndx] != (vk::VkSemaphore)0)
+			vkd.destroySemaphore(device, semaphores[ndx], DE_NULL);
+
+		semaphores[ndx] = (vk::VkSemaphore)0;
+	}
+
+	semaphores.clear();
+}
+
+vk::Move<vk::VkFence> createFence (const vk::DeviceInterface&	vkd,
+								   vk::VkDevice					device)
+{
+	const vk::VkFenceCreateInfo createInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
+		DE_NULL,
+		0u
+	};
+	return vk::createFence(vkd, device, &createInfo);
+}
+
+void initFences (const vk::DeviceInterface&	vkd,
+				 vk::VkDevice				device,
+				 std::vector<vk::VkFence>&	fences)
+{
+	for (size_t ndx = 0; ndx < fences.size(); ndx++)
+		fences[ndx] = createFence(vkd, device).disown();
+}
+
+void deinitFences (const vk::DeviceInterface&	vkd,
+				   vk::VkDevice					device,
+				   std::vector<vk::VkFence>&	fences)
+{
+	for (size_t ndx = 0; ndx < fences.size(); ndx++)
+	{
+		if (fences[ndx] != (vk::VkFence)0)
+			vkd.destroyFence(device, fences[ndx], DE_NULL);
+
+		fences[ndx] = (vk::VkFence)0;
+	}
+
+	fences.clear();
+}
+
+void cmdRenderFrame (const vk::DeviceInterface&	vkd,
+					 vk::VkCommandBuffer		commandBuffer,
+					 vk::VkPipelineLayout		pipelineLayout,
+					 vk::VkPipeline				pipeline,
+					 size_t						frameNdx,
+					 deUint32					quadCount)
+{
+	const deUint32 frameNdxValue  =	(deUint32)frameNdx;
+
+	vkd.cmdPushConstants(commandBuffer, pipelineLayout, vk::VK_SHADER_STAGE_FRAGMENT_BIT, 0u, 4u, &frameNdxValue);
+	vkd.cmdBindPipeline(commandBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+	vkd.cmdDraw(commandBuffer, quadCount * 6u, 1u, 0u, 0u);
+}
+
+vk::Move<vk::VkCommandBuffer> createCommandBuffer (const vk::DeviceInterface&	vkd,
+												   vk::VkDevice					device,
+												   vk::VkCommandPool			commandPool,
+												   vk::VkPipelineLayout			pipelineLayout,
+												   vk::VkRenderPass				renderPass,
+												   vk::VkFramebuffer			framebuffer,
+												   vk::VkPipeline				pipeline,
+												   size_t						frameNdx,
+												   deUint32						quadCount,
+												   deUint32						imageWidth,
+												   deUint32						imageHeight)
+{
+	const vk::VkCommandBufferAllocateInfo allocateInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
+		DE_NULL,
+
+		commandPool,
+		vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY,
+		1
+	};
+	const vk::VkCommandBufferBeginInfo	beginInfo		=
+	{
+		vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+		DE_NULL,
+		0u,
+		DE_NULL
+	};
+
+	vk::Move<vk::VkCommandBuffer>	commandBuffer	(vk::allocateCommandBuffer(vkd, device, &allocateInfo));
+	VK_CHECK(vkd.beginCommandBuffer(*commandBuffer, &beginInfo));
+
+	{
+		const vk::VkClearValue			clearValue			= vk::makeClearValueColorF32(0.25f, 0.50f, 0.75f, 1.00f);
+		const vk::VkRenderPassBeginInfo	renderPassBeginInfo	=
+		{
+			vk::VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
+			DE_NULL,
+
+			renderPass,
+			framebuffer,
+
+			{
+				{ (deInt32)0, (deInt32)0 },
+				{ imageWidth, imageHeight }
+			},
+			1u,
+			&clearValue
+		};
+		vkd.cmdBeginRenderPass(*commandBuffer, &renderPassBeginInfo, vk::VK_SUBPASS_CONTENTS_INLINE);
+	}
+
+	cmdRenderFrame(vkd, *commandBuffer, pipelineLayout, pipeline, frameNdx, quadCount);
+
+	vkd.cmdEndRenderPass(*commandBuffer);
+
+	VK_CHECK(vkd.endCommandBuffer(*commandBuffer));
+	return commandBuffer;
+}
+
+void deinitCommandBuffers (const vk::DeviceInterface&			vkd,
+						   vk::VkDevice							device,
+						   vk::VkCommandPool					commandPool,
+						   std::vector<vk::VkCommandBuffer>&	commandBuffers)
+{
+	for (size_t ndx = 0; ndx < commandBuffers.size(); ndx++)
+	{
+		if (commandBuffers[ndx] != (vk::VkCommandBuffer)0)
+			vkd.freeCommandBuffers(device, commandPool, 1u,  &commandBuffers[ndx]);
+
+		commandBuffers[ndx] = (vk::VkCommandBuffer)0;
+	}
+
+	commandBuffers.clear();
+}
+
+vk::Move<vk::VkCommandPool> createCommandPool (const vk::DeviceInterface&	vkd,
+											   vk::VkDevice					device,
+											   deUint32						queueFamilyIndex)
+{
+	const vk::VkCommandPoolCreateInfo createInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
+		DE_NULL,
+		0u,
+		queueFamilyIndex
+	};
+
+	return vk::createCommandPool(vkd, device, &createInfo);
+}
+
+vk::Move<vk::VkFramebuffer>	createFramebuffer (const vk::DeviceInterface&	vkd,
+											   vk::VkDevice					device,
+											   vk::VkRenderPass				renderPass,
+											   vk::VkImageView				imageView,
+											   deUint32						width,
+											   deUint32						height)
+{
+	const vk::VkFramebufferCreateInfo createInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
+		DE_NULL,
+
+		0u,
+		renderPass,
+		1u,
+		&imageView,
+		width,
+		height,
+		1u
+	};
+
+	return vk::createFramebuffer(vkd, device, &createInfo);
+}
+
+vk::Move<vk::VkImageView> createImageView (const vk::DeviceInterface&	vkd,
+										   vk::VkDevice					device,
+										   vk::VkImage					image,
+										   vk::VkFormat					format)
+{
+	const vk::VkImageViewCreateInfo	createInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
+		DE_NULL,
+
+		0u,
+		image,
+		vk::VK_IMAGE_VIEW_TYPE_2D,
+		format,
+		vk::makeComponentMappingRGBA(),
+		{
+			vk::VK_IMAGE_ASPECT_COLOR_BIT,
+			0u,
+			1u,
+			0u,
+			1u
+		}
+	};
+
+	return vk::createImageView(vkd, device, &createInfo, DE_NULL);
+}
+
+vk::Move<vk::VkRenderPass> createRenderPass (const vk::DeviceInterface&	vkd,
+											 vk::VkDevice				device,
+											 vk::VkFormat				format)
+{
+	const vk::VkAttachmentDescription	attachments[]			=
+	{
+		{
+			0u,
+			format,
+			vk::VK_SAMPLE_COUNT_1_BIT,
+
+			vk::VK_ATTACHMENT_LOAD_OP_LOAD,
+			vk::VK_ATTACHMENT_STORE_OP_STORE,
+
+			vk::VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+			vk::VK_ATTACHMENT_STORE_OP_DONT_CARE,
+
+			// This differs from the usual layout handling in that the
+			// swapchain image remains in IMAGE_LAYOUT_SHARED_PRESENT_KHR all
+			// the time. We should not ever transition it away (or discard the
+			// contents with a transition from UNDEFINED) as the PE is accessing
+			// the image concurrently with our rendering.
+			vk::VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
+			vk::VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
+		}
+	};
+	const vk::VkAttachmentReference		colorAttachmentRefs[]	=
+	{
+		{
+			0u,
+			vk::VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
+		}
+	};
+	const vk::VkSubpassDescription		subpasses[]				=
+	{
+		{
+			0u,
+			vk::VK_PIPELINE_BIND_POINT_GRAPHICS,
+			0u,
+			DE_NULL,
+
+			DE_LENGTH_OF_ARRAY(colorAttachmentRefs),
+			colorAttachmentRefs,
+			DE_NULL,
+
+			DE_NULL,
+			0u,
+			DE_NULL
+		}
+	};
+
+	const vk::VkRenderPassCreateInfo	createInfo				=
+	{
+		vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
+		DE_NULL,
+		0u,
+
+		DE_LENGTH_OF_ARRAY(attachments),
+		attachments,
+
+		DE_LENGTH_OF_ARRAY(subpasses),
+		subpasses,
+
+		0u,
+		DE_NULL
+	};
+
+	return vk::createRenderPass(vkd, device, &createInfo);
+}
+
+vk::Move<vk::VkPipeline> createPipeline (const vk::DeviceInterface&	vkd,
+										 vk::VkDevice				device,
+										 vk::VkRenderPass			renderPass,
+										 vk::VkPipelineLayout		layout,
+										 vk::VkShaderModule			vertexShaderModule,
+										 vk::VkShaderModule			fragmentShaderModule,
+										 deUint32					width,
+										 deUint32					height)
+{
+	const vk::VkSpecializationInfo				shaderSpecialization	=
+	{
+		0u,
+		DE_NULL,
+		0,
+		DE_NULL
+	};
+	const vk::VkPipelineShaderStageCreateInfo		stages[]			=
+	{
+		{
+			vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+			DE_NULL,
+			0u,
+			vk::VK_SHADER_STAGE_VERTEX_BIT,
+			vertexShaderModule,
+			"main",
+			&shaderSpecialization
+		},
+		{
+			vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+			DE_NULL,
+			0u,
+			vk::VK_SHADER_STAGE_FRAGMENT_BIT,
+			fragmentShaderModule,
+			"main",
+			&shaderSpecialization
+		}
+	};
+	const vk::VkPipelineVertexInputStateCreateInfo	vertexInputState	=
+	{
+		vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
+		DE_NULL,
+		0u,
+		0u,
+		DE_NULL,
+		0u,
+		DE_NULL
+	};
+	const vk::VkPipelineInputAssemblyStateCreateInfo	inputAssemblyState	=
+	{
+		vk::VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
+		DE_NULL,
+		0u,
+		vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
+		VK_FALSE
+	};
+	const vk::VkViewport viewports[] =
+	{
+		{
+			0.0f, 0.0f,
+			(float)width, (float)height,
+			0.0f, 1.0f
+		}
+	};
+	const vk::VkRect2D scissors[] =
+	{
+		{
+			{ 0u, 0u },
+			{ width, height }
+		}
+	};
+	const vk::VkPipelineViewportStateCreateInfo			viewportState		=
+	{
+		vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
+		DE_NULL,
+		0u,
+
+		DE_LENGTH_OF_ARRAY(viewports),
+		viewports,
+		DE_LENGTH_OF_ARRAY(scissors),
+		scissors
+	};
+	const vk::VkPipelineRasterizationStateCreateInfo	rasterizationState	=
+	{
+		vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
+		DE_NULL,
+		0u,
+		VK_TRUE,
+		VK_FALSE,
+		vk::VK_POLYGON_MODE_FILL,
+		vk::VK_CULL_MODE_NONE,
+		vk::VK_FRONT_FACE_CLOCKWISE,
+		VK_FALSE,
+		0.0f,
+		0.0f,
+		0.0f,
+		1.0f
+	};
+	const vk::VkSampleMask								sampleMask			= ~0u;
+	const vk::VkPipelineMultisampleStateCreateInfo		multisampleState	=
+	{
+		vk::VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
+		DE_NULL,
+		0u,
+		vk::VK_SAMPLE_COUNT_1_BIT,
+		VK_FALSE,
+		0.0f,
+		&sampleMask,
+		VK_FALSE,
+		VK_FALSE
+	};
+	const vk::VkPipelineDepthStencilStateCreateInfo	depthStencilState		=
+	{
+		vk::VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
+		DE_NULL,
+		0u,
+		DE_FALSE,
+		DE_FALSE,
+		vk::VK_COMPARE_OP_ALWAYS,
+		DE_FALSE,
+		DE_FALSE,
+		{
+			vk::VK_STENCIL_OP_KEEP,
+			vk::VK_STENCIL_OP_KEEP,
+			vk::VK_STENCIL_OP_KEEP,
+			vk::VK_COMPARE_OP_ALWAYS,
+			0u,
+			0u,
+			0u,
+		},
+		{
+			vk::VK_STENCIL_OP_KEEP,
+			vk::VK_STENCIL_OP_KEEP,
+			vk::VK_STENCIL_OP_KEEP,
+			vk::VK_COMPARE_OP_ALWAYS,
+			0u,
+			0u,
+			0u,
+		},
+		0.0f,
+		1.0f
+	};
+	const vk::VkPipelineColorBlendAttachmentState	attachmentBlendState			=
+	{
+		VK_FALSE,
+		vk::VK_BLEND_FACTOR_ONE,
+		vk::VK_BLEND_FACTOR_ZERO,
+		vk::VK_BLEND_OP_ADD,
+		vk::VK_BLEND_FACTOR_ONE,
+		vk::VK_BLEND_FACTOR_ZERO,
+		vk::VK_BLEND_OP_ADD,
+		(vk::VK_COLOR_COMPONENT_R_BIT|
+		 vk::VK_COLOR_COMPONENT_G_BIT|
+		 vk::VK_COLOR_COMPONENT_B_BIT|
+		 vk::VK_COLOR_COMPONENT_A_BIT),
+	};
+	const vk::VkPipelineColorBlendStateCreateInfo	blendState				=
+	{
+		vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
+		DE_NULL,
+		0u,
+		DE_FALSE,
+		vk::VK_LOGIC_OP_COPY,
+		1u,
+		&attachmentBlendState,
+		{ 0.0f, 0.0f, 0.0f, 0.0f }
+	};
+	const vk::VkDynamicState							dynamicStates[]		=
+	{
+		vk::VK_DYNAMIC_STATE_SCISSOR
+	};
+	const vk::VkPipelineDynamicStateCreateInfo			dynamicState		=
+	{
+		vk::VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
+		DE_NULL,
+		0u,
+
+		DE_LENGTH_OF_ARRAY(dynamicStates),
+		dynamicStates
+	};
+	const vk::VkGraphicsPipelineCreateInfo				createInfo			=
+	{
+		vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
+		DE_NULL,
+		0u,
+
+		DE_LENGTH_OF_ARRAY(stages),
+		stages,
+		&vertexInputState,
+		&inputAssemblyState,
+		DE_NULL,
+		&viewportState,
+		&rasterizationState,
+		&multisampleState,
+		&depthStencilState,
+		&blendState,
+		&dynamicState,
+		layout,
+		renderPass,
+		0u,
+		DE_NULL,
+		0u
+	};
+
+	return vk::createGraphicsPipeline(vkd, device, DE_NULL,  &createInfo);
+}
+
+vk::Move<vk::VkPipelineLayout> createPipelineLayout (const vk::DeviceInterface&	vkd,
+													 vk::VkDevice				device)
+{
+	const vk::VkPushConstantRange			pushConstants[] =
+	{
+		{
+			vk::VK_SHADER_STAGE_FRAGMENT_BIT,
+			0u,
+			4u
+		}
+	};
+	const vk::VkPipelineLayoutCreateInfo	createInfo	=
+	{
+		vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
+		DE_NULL,
+		0u,
+
+		0u,
+		DE_NULL,
+
+		DE_LENGTH_OF_ARRAY(pushConstants),
+		pushConstants,
+	};
+
+	return vk::createPipelineLayout(vkd, device, &createInfo);
+}
+
+struct TestConfig
+{
+	vk::wsi::Type			wsiType;
+	Scaling					scaling;
+	bool					useSharedPresentableImage;
+	vk::VkPresentModeKHR	presentMode;
+};
+
+class SharedPresentableImageTestInstance : public TestInstance
+{
+public:
+													SharedPresentableImageTestInstance	(Context& context, const TestConfig& testConfig);
+													~SharedPresentableImageTestInstance	(void);
+
+	tcu::TestStatus									iterate								(void);
+
+private:
+	const TestConfig								m_testConfig;
+	const deUint32									m_quadCount;
+	const vk::PlatformInterface&					m_vkp;
+	const Extensions								m_instanceExtensions;
+	const vk::Unique<vk::VkInstance>				m_instance;
+	const vk::InstanceDriver						m_vki;
+	const vk::VkPhysicalDevice						m_physicalDevice;
+	const de::UniquePtr<vk::wsi::Display>			m_nativeDisplay;
+	const de::UniquePtr<vk::wsi::Window>			m_nativeWindow;
+	const vk::Unique<vk::VkSurfaceKHR>				m_surface;
+
+	const deUint32									m_queueFamilyIndex;
+	const Extensions								m_deviceExtensions;
+	const vk::Unique<vk::VkDevice>					m_device;
+	const vk::DeviceDriver							m_vkd;
+	const vk::VkQueue								m_queue;
+
+	const vk::Unique<vk::VkCommandPool>				m_commandPool;
+	const vk::Unique<vk::VkShaderModule>			m_vertexShaderModule;
+	const vk::Unique<vk::VkShaderModule>			m_fragmentShaderModule;
+	const vk::Unique<vk::VkPipelineLayout>			m_pipelineLayout;
+
+	vk::VkImageUsageFlags							m_supportedUsageFlags;
+	const vk::VkSurfaceCapabilitiesKHR				m_surfaceProperties;
+	const vector<vk::VkSurfaceFormatKHR>			m_surfaceFormats;
+	const vector<vk::VkPresentModeKHR>				m_presentModes;
+
+	tcu::ResultCollector							m_resultCollector;
+
+	vk::Move<vk::VkSwapchainKHR>					m_swapchain;
+	vk::VkImage										m_swapchainImage;			  // NOTE: not owning. lifetime managed by swapchain
+	vk::Move<vk::VkImageView>						m_swapchainImageView;
+	vk::Move<vk::VkFramebuffer>						m_framebuffer;
+
+	vk::Move<vk::VkRenderPass>						m_renderPass;
+	vk::Move<vk::VkPipeline>						m_pipeline;
+
+	std::vector<vk::VkCommandBuffer>				m_commandBuffers;
+	std::vector<vk::VkSemaphore>					m_renderSemaphores;
+	std::vector<vk::VkFence>						m_fences;
+
+	std::vector<vk::VkSwapchainCreateInfoKHR>		m_swapchainConfigs;
+	size_t											m_swapchainConfigNdx;
+
+	const size_t									m_frameCount;
+	size_t											m_frameNdx;
+
+	const size_t									m_maxOutOfDateCount;
+	size_t											m_outOfDateCount;
+
+	void											initSwapchainResources		(void);
+	void											deinitSwapchainResources	(void);
+	void											render						(void);
+};
+
+std::vector<vk::VkSwapchainCreateInfoKHR> generateSwapchainConfigs (vk::VkSurfaceKHR						surface,
+																	deUint32								queueFamilyIndex,
+																	Scaling									scaling,
+																	const vk::VkSurfaceCapabilitiesKHR&		properties,
+																	const vector<vk::VkSurfaceFormatKHR>&	formats,
+																	const vector<vk::VkPresentModeKHR>&		presentModes,
+																	vk::VkPresentModeKHR					presentMode,
+																	vk::VkImageUsageFlags					supportedImageUsage)
+{
+	const deUint32							imageLayers			= 1u;
+	const vk::VkImageUsageFlags				imageUsage			= properties.supportedUsageFlags & supportedImageUsage;
+	const vk::VkBool32						clipped				= VK_FALSE;
+	vector<vk::VkSwapchainCreateInfoKHR>	createInfos;
+
+	const deUint32				imageWidth		= scaling == SCALING_NONE
+												? (properties.currentExtent.width != 0xFFFFFFFFu
+													? properties.currentExtent.width
+													: de::min(1024u, properties.minImageExtent.width + ((properties.maxImageExtent.width - properties.minImageExtent.width) / 2)))
+												: (scaling == SCALING_UP
+													? de::max(31u, properties.minImageExtent.width)
+													: properties.maxImageExtent.width);
+	const deUint32				imageHeight		= scaling == SCALING_NONE
+												? (properties.currentExtent.height != 0xFFFFFFFFu
+													? properties.currentExtent.height
+													: de::min(1024u, properties.minImageExtent.height + ((properties.maxImageExtent.height - properties.minImageExtent.height) / 2)))
+												: (scaling == SCALING_UP
+													? de::max(31u, properties.minImageExtent.height)
+													: properties.maxImageExtent.height);
+	const vk::VkExtent2D		imageSize		= { imageWidth, imageHeight };
+
+	{
+		size_t presentModeNdx;
+
+		for (presentModeNdx = 0; presentModeNdx < presentModes.size(); presentModeNdx++)
+		{
+			if (presentModes[presentModeNdx] == presentMode)
+				break;
+		}
+
+		if (presentModeNdx == presentModes.size())
+			TCU_THROW(NotSupportedError, "Present mode not supported");
+	}
+
+	for (size_t formatNdx = 0; formatNdx < formats.size(); formatNdx++)
+	{
+		for (vk::VkSurfaceTransformFlagsKHR transform = 1u; transform <= properties.supportedTransforms; transform = transform << 1u)
+		{
+			if ((properties.supportedTransforms & transform) == 0)
+				continue;
+
+			for (vk::VkCompositeAlphaFlagsKHR alpha = 1u; alpha <= properties.supportedCompositeAlpha; alpha = alpha << 1u)
+			{
+				if ((alpha & properties.supportedCompositeAlpha) == 0)
+					continue;
+
+				const vk::VkSurfaceTransformFlagBitsKHR	preTransform	= (vk::VkSurfaceTransformFlagBitsKHR)transform;
+				const vk::VkCompositeAlphaFlagBitsKHR	compositeAlpha	= (vk::VkCompositeAlphaFlagBitsKHR)alpha;
+				const vk::VkFormat						imageFormat		= formats[formatNdx].format;
+				const vk::VkColorSpaceKHR				imageColorSpace	= formats[formatNdx].colorSpace;
+				const vk::VkSwapchainCreateInfoKHR		createInfo		=
+				{
+					vk::VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
+					DE_NULL,
+					0u,
+					surface,
+					1,														// Always 1 image for a shared presentable image swapchain.
+					imageFormat,
+					imageColorSpace,
+					imageSize,
+					imageLayers,
+					imageUsage,
+					vk::VK_SHARING_MODE_EXCLUSIVE,
+					1u,
+					&queueFamilyIndex,
+					preTransform,
+					compositeAlpha,
+					presentMode,
+					clipped,
+					(vk::VkSwapchainKHR)0
+				};
+
+				createInfos.push_back(createInfo);
+			}
+		}
+	}
+
+	return createInfos;
+}
+
+vk::VkSurfaceCapabilitiesKHR getPhysicalDeviceSurfaceCapabilities (const vk::InstanceInterface&	vki,
+																   vk::VkPhysicalDevice			physicalDevice,
+																   vk::VkSurfaceKHR				surface,
+																   vk::VkImageUsageFlags*		usage)
+{
+	const vk::VkPhysicalDeviceSurfaceInfo2KHR	info	=
+	{
+		vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR,
+		DE_NULL,
+
+		surface
+	};
+	vk::VkSharedPresentSurfaceCapabilitiesKHR	sharedCapabilities;
+	vk::VkSurfaceCapabilities2KHR				capabilities;
+
+	sharedCapabilities.sType	= vk::VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR;
+	sharedCapabilities.pNext	= DE_NULL;
+
+	capabilities.sType			= vk::VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR,
+	capabilities.pNext			= &sharedCapabilities;
+
+	VK_CHECK(vki.getPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice, &info, &capabilities));
+
+	TCU_CHECK(sharedCapabilities.sharedPresentSupportedUsageFlags & vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
+	*usage = sharedCapabilities.sharedPresentSupportedUsageFlags;
+
+	return capabilities.surfaceCapabilities;
+}
+
+SharedPresentableImageTestInstance::SharedPresentableImageTestInstance (Context& context, const TestConfig& testConfig)
+	: TestInstance				(context)
+	, m_testConfig				(testConfig)
+	, m_quadCount				(16u)
+	, m_vkp						(context.getPlatformInterface())
+	, m_instanceExtensions		(vk::enumerateInstanceExtensionProperties(m_vkp, DE_NULL))
+	, m_instance				(createInstanceWithWsi(m_vkp, m_instanceExtensions, testConfig.wsiType))
+	, m_vki						(m_vkp, *m_instance)
+	, m_physicalDevice			(vk::chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine()))
+	, m_nativeDisplay			(createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), m_instanceExtensions, testConfig.wsiType))
+	, m_nativeWindow			(createWindow(*m_nativeDisplay, tcu::nothing<UVec2>()))
+	, m_surface					(vk::wsi::createSurface(m_vki, *m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow))
+
+	, m_queueFamilyIndex		(chooseQueueFamilyIndex(m_vki, m_physicalDevice, *m_surface))
+	, m_deviceExtensions		(vk::enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
+	, m_device					(createDeviceWithWsi(m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useSharedPresentableImage))
+	, m_vkd						(m_vki, *m_device)
+	, m_queue					(getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
+
+	, m_commandPool				(createCommandPool(m_vkd, *m_device, m_queueFamilyIndex))
+	, m_vertexShaderModule		(vk::createShaderModule(m_vkd, *m_device, context.getBinaryCollection().get("quad-vert"), 0u))
+	, m_fragmentShaderModule	(vk::createShaderModule(m_vkd, *m_device, context.getBinaryCollection().get("quad-frag"), 0u))
+	, m_pipelineLayout			(createPipelineLayout(m_vkd, *m_device))
+
+	, m_supportedUsageFlags		(0u)
+	, m_surfaceProperties		(getPhysicalDeviceSurfaceCapabilities(m_vki, m_physicalDevice, *m_surface, &m_supportedUsageFlags))
+	, m_surfaceFormats			(vk::wsi::getPhysicalDeviceSurfaceFormats(m_vki, m_physicalDevice, *m_surface))
+	, m_presentModes			(vk::wsi::getPhysicalDeviceSurfacePresentModes(m_vki, m_physicalDevice, *m_surface))
+
+	, m_swapchainConfigs		(generateSwapchainConfigs(*m_surface, m_queueFamilyIndex, testConfig.scaling, m_surfaceProperties, m_surfaceFormats, m_presentModes, testConfig.presentMode, m_supportedUsageFlags))
+	, m_swapchainConfigNdx		(0u)
+
+	, m_frameCount				(60u * 5u)
+	, m_frameNdx				(0u)
+
+	, m_maxOutOfDateCount		(20u)
+	, m_outOfDateCount			(0u)
+{
+	{
+		const tcu::ScopedLogSection surfaceInfo (m_context.getTestContext().getLog(), "SurfaceCapabilities", "SurfaceCapabilities");
+		m_context.getTestContext().getLog() << TestLog::Message << m_surfaceProperties << TestLog::EndMessage;
+		m_context.getTestContext().getLog() << TestLog::Message << "SharedPresentSupportedUsageFlags: " << m_supportedUsageFlags << TestLog::EndMessage;
+
+	}
+}
+
+SharedPresentableImageTestInstance::~SharedPresentableImageTestInstance (void)
+{
+	deinitSwapchainResources();
+}
+
+void SharedPresentableImageTestInstance::initSwapchainResources (void)
+{
+	const size_t		fenceCount	= 6;
+	const deUint32		imageWidth	= m_swapchainConfigs[m_swapchainConfigNdx].imageExtent.width;
+	const deUint32		imageHeight	= m_swapchainConfigs[m_swapchainConfigNdx].imageExtent.height;
+	const vk::VkFormat	imageFormat	= m_swapchainConfigs[m_swapchainConfigNdx].imageFormat;
+
+	m_swapchain				= vk::createSwapchainKHR(m_vkd, *m_device, &m_swapchainConfigs[m_swapchainConfigNdx]);
+	m_swapchainImage		= vk::wsi::getSwapchainImages(m_vkd, *m_device, *m_swapchain).front();
+
+	m_renderPass			= createRenderPass(m_vkd, *m_device, imageFormat);
+	m_pipeline				= createPipeline(m_vkd, *m_device, *m_renderPass, *m_pipelineLayout, *m_vertexShaderModule, *m_fragmentShaderModule, imageWidth, imageHeight);
+
+	m_swapchainImageView	= createImageView(m_vkd, *m_device, m_swapchainImage, imageFormat);
+	m_framebuffer			= createFramebuffer(m_vkd, *m_device, *m_renderPass, *m_swapchainImageView, imageWidth, imageHeight);
+
+	m_renderSemaphores		= std::vector<vk::VkSemaphore>(fenceCount, (vk::VkSemaphore)0);
+	m_fences				= std::vector<vk::VkFence>(fenceCount, (vk::VkFence)0);
+	m_commandBuffers		= std::vector<vk::VkCommandBuffer>(m_fences.size(), (vk::VkCommandBuffer)0);
+
+	initSemaphores(m_vkd, *m_device, m_renderSemaphores);
+
+	initFences(m_vkd, *m_device, m_fences);
+
+	// Unlike a traditional swapchain, where we'd acquire a new image from the
+	// PE every frame, a shared image swapchain has a single image that is
+	// acquired upfront. We acquire it here, transition it to the proper layout,
+	// and present it.
+
+	// Acquire the one image
+	const deUint64				foreverNs		= 0xFFFFFFFFFFFFFFFFul;
+	vk::Move<vk::VkSemaphore>	semaphore(createSemaphore(m_vkd, *m_device));
+	deUint32					imageIndex		= 42;	// initialize to junk value
+
+	VK_CHECK(m_vkd.acquireNextImageKHR(*m_device, *m_swapchain, foreverNs, *semaphore, 0u, &imageIndex));
+	TCU_CHECK(imageIndex == 0);
+
+	// Transition to IMAGE_LAYOUT_SHARED_PRESENT_KHR
+	const vk::VkCommandBufferAllocateInfo allocateInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
+		DE_NULL,
+		*m_commandPool,
+		vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY,
+		1
+	};
+	const vk::VkCommandBufferBeginInfo	beginInfo		=
+	{
+		vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+		DE_NULL,
+		0u,
+		DE_NULL
+	};
+
+	const vk::Unique<vk::VkCommandBuffer>	commandBuffer	(vk::allocateCommandBuffer(m_vkd, *m_device, &allocateInfo));
+	VK_CHECK(m_vkd.beginCommandBuffer(*commandBuffer, &beginInfo));
+
+	const vk::VkImageMemoryBarrier barrier = {
+		vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+		DE_NULL,
+		0,
+		0,
+		vk::VK_IMAGE_LAYOUT_UNDEFINED,
+		vk::VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
+		VK_QUEUE_FAMILY_IGNORED,
+		VK_QUEUE_FAMILY_IGNORED,
+		m_swapchainImage,
+		{
+			vk::VK_IMAGE_ASPECT_COLOR_BIT,
+			0,
+			1,
+			0,
+			1
+		},
+	};
+
+	m_vkd.cmdPipelineBarrier(*commandBuffer,
+							vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+							vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+							0u,
+							0, DE_NULL,
+							0, DE_NULL,
+							1, &barrier);
+
+	VK_CHECK(m_vkd.endCommandBuffer(*commandBuffer));
+
+	const vk::VkSubmitInfo submitInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,
+		DE_NULL,
+		1, &*semaphore, DE_NULL,
+		1, &*commandBuffer,
+		0, DE_NULL,
+	};
+
+	VK_CHECK(m_vkd.queueSubmit(m_queue, 1u, &submitInfo, (vk::VkFence)0));
+	VK_CHECK(m_vkd.queueWaitIdle(m_queue));
+}
+
+void SharedPresentableImageTestInstance::deinitSwapchainResources (void)
+{
+	VK_CHECK(m_vkd.queueWaitIdle(m_queue));
+
+	deinitSemaphores(m_vkd, *m_device, m_renderSemaphores);
+	deinitFences(m_vkd, *m_device, m_fences);
+	deinitCommandBuffers(m_vkd, *m_device, *m_commandPool, m_commandBuffers);
+
+	m_framebuffer	= vk::Move<vk::VkFramebuffer>();
+	m_swapchainImageView = vk::Move<vk::VkImageView>();
+	m_swapchainImage = (vk::VkImage)0;
+
+	m_swapchain		= vk::Move<vk::VkSwapchainKHR>();
+	m_renderPass	= vk::Move<vk::VkRenderPass>();
+	m_pipeline		= vk::Move<vk::VkPipeline>();
+}
+
+void SharedPresentableImageTestInstance::render (void)
+{
+	const deUint64		foreverNs		= 0xFFFFFFFFFFFFFFFFul;
+	const vk::VkFence	fence			= m_fences[m_frameNdx % m_fences.size()];
+	const deUint32		width			= m_swapchainConfigs[m_swapchainConfigNdx].imageExtent.width;
+	const deUint32		height			= m_swapchainConfigs[m_swapchainConfigNdx].imageExtent.height;
+
+	// Throttle execution
+	if (m_frameNdx >= m_fences.size())
+	{
+		VK_CHECK(m_vkd.waitForFences(*m_device, 1u, &fence, VK_TRUE, foreverNs));
+		VK_CHECK(m_vkd.resetFences(*m_device, 1u, &fence));
+
+		m_vkd.freeCommandBuffers(*m_device, *m_commandPool, 1u, &m_commandBuffers[m_frameNdx % m_commandBuffers.size()]);
+		m_commandBuffers[m_frameNdx % m_commandBuffers.size()] = (vk::VkCommandBuffer)0;
+	}
+
+	deUint32			imageIndex = 0;		// There is only one image.
+	const vk::VkSemaphore currentRenderSemaphore = m_renderSemaphores[m_frameNdx % m_renderSemaphores.size()];
+
+	const bool willPresent = m_swapchainConfigs[m_swapchainConfigNdx].presentMode == vk::VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR || !m_frameNdx;
+
+	// Create command buffer
+	m_commandBuffers[m_frameNdx % m_commandBuffers.size()] = createCommandBuffer(m_vkd, *m_device, *m_commandPool, *m_pipelineLayout, *m_renderPass, *m_framebuffer, *m_pipeline, m_frameNdx, m_quadCount, width, height).disown();
+
+	// Submit command buffer
+	{
+		const vk::VkSubmitInfo			submitInfo		=
+		{
+			vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,
+			DE_NULL,
+			0u,
+			DE_NULL,
+			DE_NULL,
+			1u,
+			&m_commandBuffers[m_frameNdx % m_commandBuffers.size()],
+			willPresent ? 1u : 0u,	  // Only signal the semaphore if we're going to call QueuePresent.
+			&currentRenderSemaphore
+		};
+
+		// With a traditional swapchain, we'd fence on completion of
+		// AcquireNextImage. We never call that for a shared image swapchain, so
+		// fence on completion of the rendering work instead. A real shared
+		// image application would want a more substantial pacing mechanism.
+		VK_CHECK(m_vkd.queueSubmit(m_queue, 1u, &submitInfo, fence));
+	}
+
+	// DEMAND_REFRESH requires us to call QueuePresent whenever we want to be
+	// assured the PE has picked up a new frame. The PE /may/ also pick up
+	// changes whenever it likes.
+	//
+	// For CONTINUOUS_REFRESH, we need to just call QueuePresent once on the
+	// first frame to kick things off.
+	if (willPresent)
+	{
+
+		// Present frame
+		vk::VkResult result;
+		const vk::VkPresentInfoKHR presentInfo =
+		{
+			vk::VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
+			DE_NULL,
+			1u,
+			&currentRenderSemaphore,
+			1u,
+			&*m_swapchain,
+			&imageIndex,
+			&result
+		};
+
+		VK_CHECK(m_vkd.queuePresentKHR(m_queue, &presentInfo));
+		VK_CHECK(result);
+
+	}
+
+	// With either present mode, we can call GetSwapchainStatus at any time
+	// to detect possible OUT_OF_DATE conditions. Let's do that every frame.
+
+	const vk::VkResult swapchainStatus = m_vkd.getSwapchainStatusKHR(*m_device, *m_swapchain);
+	VK_CHECK(swapchainStatus);
+}
+
+tcu::TestStatus SharedPresentableImageTestInstance::iterate (void)
+{
+	// Initialize swapchain specific resources
+	// Render test
+	try
+	{
+		if (m_frameNdx == 0)
+		{
+			if (m_outOfDateCount == 0)
+				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Swapchain: " << m_swapchainConfigs[m_swapchainConfigNdx] << tcu::TestLog::EndMessage;
+
+			initSwapchainResources();
+		}
+
+		render();
+	}
+	catch (const vk::Error& error)
+	{
+		if (error.getError() == vk::VK_ERROR_OUT_OF_DATE_KHR)
+		{
+			m_swapchainConfigs = generateSwapchainConfigs(*m_surface, m_queueFamilyIndex, m_testConfig.scaling, m_surfaceProperties, m_surfaceFormats, m_presentModes, m_testConfig.presentMode, m_supportedUsageFlags);
+
+			if (m_outOfDateCount < m_maxOutOfDateCount)
+			{
+				m_context.getTestContext().getLog() << TestLog::Message << "Frame " << m_frameNdx << ": Swapchain out of date. Recreating resources." << TestLog::EndMessage;
+				deinitSwapchainResources();
+				m_frameNdx = 0;
+				m_outOfDateCount++;
+
+				return tcu::TestStatus::incomplete();
+			}
+			else
+			{
+				m_context.getTestContext().getLog() << TestLog::Message << "Frame " << m_frameNdx << ": Swapchain out of date." << TestLog::EndMessage;
+				m_resultCollector.fail("Received too many VK_ERROR_OUT_OF_DATE_KHR errors. Received " + de::toString(m_outOfDateCount) + ", max " + de::toString(m_maxOutOfDateCount));
+			}
+		}
+		else
+		{
+			m_resultCollector.fail(error.what());
+		}
+
+		deinitSwapchainResources();
+
+		m_swapchainConfigNdx++;
+		m_frameNdx = 0;
+		m_outOfDateCount = 0;
+
+		if (m_swapchainConfigNdx >= m_swapchainConfigs.size())
+			return tcu::TestStatus(m_resultCollector.getResult(), m_resultCollector.getMessage());
+		else
+			return tcu::TestStatus::incomplete();
+	}
+
+	m_frameNdx++;
+
+	if (m_frameNdx >= m_frameCount)
+	{
+		m_frameNdx = 0;
+		m_outOfDateCount = 0;
+		m_swapchainConfigNdx++;
+
+		deinitSwapchainResources();
+
+		if (m_swapchainConfigNdx >= m_swapchainConfigs.size())
+			return tcu::TestStatus(m_resultCollector.getResult(), m_resultCollector.getMessage());
+		else
+			return tcu::TestStatus::incomplete();
+	}
+	else
+		return tcu::TestStatus::incomplete();
+}
+
+struct Programs
+{
+	static void init (vk::SourceCollections& dst, TestConfig)
+	{
+		dst.glslSources.add("quad-vert") << glu::VertexSource(
+			"#version 450\n"
+			"out gl_PerVertex {\n"
+			"\tvec4 gl_Position;\n"
+			"};\n"
+			"layout(location = 0) out highp uint quadIndex;\n"
+			"highp float;\n"
+			"void main (void) {\n"
+			"\tgl_Position = vec4(((gl_VertexIndex + 2) / 3) % 2 == 0 ? -1.0 : 1.0,\n"
+			"\t                   ((gl_VertexIndex + 1) / 3) % 2 == 0 ? -1.0 : 1.0, 0.0, 1.0);\n"
+			"\tquadIndex = gl_VertexIndex / 6;\n"
+			"}\n");
+		dst.glslSources.add("quad-frag") << glu::FragmentSource(
+			"#version 310 es\n"
+			"layout(location = 0) flat in highp uint quadIndex;\n"
+			"layout(location = 0) out highp vec4 o_color;\n"
+			"layout(push_constant) uniform PushConstant {\n"
+			"\thighp uint frameNdx;\n"
+			"} pushConstants;\n"
+			"void main (void)\n"
+			"{\n"
+			"\thighp uint frameNdx = pushConstants.frameNdx;\n"
+			"\thighp uint cellX = bitfieldExtract(uint(gl_FragCoord.x), 7, 10);\n"
+			"\thighp uint cellY = bitfieldExtract(uint(gl_FragCoord.y), 7, 10);\n"
+			"\thighp uint x = quadIndex ^ (frameNdx + (uint(gl_FragCoord.x) >> cellX));\n"
+			"\thighp uint y = quadIndex ^ (frameNdx + (uint(gl_FragCoord.y) >> cellY));\n"
+			"\thighp uint r = 128u * bitfieldExtract(x, 0, 1)\n"
+			"\t             +  64u * bitfieldExtract(y, 1, 1)\n"
+			"\t             +  32u * bitfieldExtract(x, 3, 1);\n"
+			"\thighp uint g = 128u * bitfieldExtract(y, 0, 1)\n"
+			"\t             +  64u * bitfieldExtract(x, 2, 1)\n"
+			"\t             +  32u * bitfieldExtract(y, 3, 1);\n"
+			"\thighp uint b = 128u * bitfieldExtract(x, 1, 1)\n"
+			"\t             +  64u * bitfieldExtract(y, 2, 1)\n"
+			"\t             +  32u * bitfieldExtract(x, 4, 1);\n"
+			"\to_color = vec4(float(r) / 255.0, float(g) / 255.0, float(b) / 255.0, 1.0);\n"
+			"}\n");
+	}
+};
+
+} // anonymous
+
+void createSharedPresentableImageTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType)
+{
+	const struct
+	{
+		Scaling		scaling;
+		const char*	name;
+	} scaling [] =
+	{
+		{ SCALING_NONE,	"scale_none"	},
+		{ SCALING_UP,	"scale_up"		},
+		{ SCALING_DOWN, "scale_down"	}
+	};
+	const struct
+	{
+		vk::VkPresentModeKHR	mode;
+		const char*				name;
+	} presentModes[] =
+	{
+		{ vk::VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR,			"demand"			},
+		{ vk::VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR,		"continuous"		},
+	};
+
+	for (size_t scalingNdx = 0; scalingNdx < DE_LENGTH_OF_ARRAY(scaling); scalingNdx++)
+	{
+		if (scaling[scalingNdx].scaling == SCALING_NONE || wsiTypeSupportsScaling(wsiType))
+		{
+			de::MovePtr<tcu::TestCaseGroup>	scaleGroup	(new tcu::TestCaseGroup(testGroup->getTestContext(), scaling[scalingNdx].name, scaling[scalingNdx].name));
+
+			for (size_t presentModeNdx = 0; presentModeNdx < DE_LENGTH_OF_ARRAY(presentModes); presentModeNdx++)
+			{
+
+				const char* const				name		= presentModes[presentModeNdx].name;
+				TestConfig						config;
+
+				config.wsiType					= wsiType;
+				config.useSharedPresentableImage= true;
+				config.scaling					= scaling[scalingNdx].scaling;
+				config.presentMode				= presentModes[presentModeNdx].mode;
+
+				scaleGroup->addChild(new vkt::InstanceFactory1<SharedPresentableImageTestInstance, TestConfig, Programs>(testGroup->getTestContext(), tcu::NODETYPE_SELF_VALIDATE, name, name, Programs(), config));
+			}
+
+			testGroup->addChild(scaleGroup.release());
+		}
+	}
+}
+
+} // wsi
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.hpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.hpp
new file mode 100644
index 0000000..29a9b84
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSharedPresentableImageTests.hpp
@@ -0,0 +1,40 @@
+#ifndef _VKTWSISHAREDPRESENTABLEIMAGETESTS_HPP
+#define _VKTWSISHAREDPRESENTABLEIMAGETESTS_HPP
+/*-------------------------------------------------------------------------
+* Vulkan Conformance Tests
+* ------------------------
+*
+* Copyright (c) 2017 Google Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*//*!
+* \file
+* \brief Tests for shared presentable image extension
+*//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+#include "vkDefs.hpp"
+
+namespace vkt
+{
+namespace wsi
+{
+
+void  createSharedPresentableImageTests	(tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType);
+
+} // wsi
+} // vkt
+
+#endif // _VKTWSISHAREDPRESENTABLEIMAGETESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiTests.cpp
index 678995e..708500a 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiTests.cpp
@@ -29,6 +29,7 @@
 #include "vktWsiSwapchainTests.hpp"
 #include "vktWsiIncrementalPresentTests.hpp"
 #include "vktWsiDisplayTimingTests.hpp"
+#include "vktWsiSharedPresentableImageTests.hpp"
 
 namespace vkt
 {
@@ -44,6 +45,7 @@
 	addTestGroup(testGroup, "swapchain",			"VkSwapchain Tests",			createSwapchainTests,			wsiType);
 	addTestGroup(testGroup, "incremental_present",	"Incremental present tests",	createIncrementalPresentTests,	wsiType);
 	addTestGroup(testGroup, "display_timing",		"Display Timing Tests",			createDisplayTimingTests,		wsiType);
+	addTestGroup(testGroup, "shared_presentable_image",	"VK_KHR_shared_presentable_image tests",	createSharedPresentableImageTests,	wsiType);
 }
 
 void createWsiTests (tcu::TestCaseGroup* apiTests)
diff --git a/external/vulkancts/mustpass/1.0.2/vk-default.txt b/external/vulkancts/mustpass/1.0.2/vk-default.txt
index 20bd87e..c5b85b5 100644
--- a/external/vulkancts/mustpass/1.0.2/vk-default.txt
+++ b/external/vulkancts/mustpass/1.0.2/vk-default.txt
@@ -134357,6 +134357,8 @@
 dEQP-VK.wsi.xlib.display_timing.immediate.display_timing
 dEQP-VK.wsi.xlib.display_timing.mailbox.reference
 dEQP-VK.wsi.xlib.display_timing.mailbox.display_timing
+dEQP-VK.wsi.xlib.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.xlib.shared_presentable_image.scale_none.continuous
 dEQP-VK.wsi.xcb.surface.create
 dEQP-VK.wsi.xcb.surface.create_custom_allocator
 dEQP-VK.wsi.xcb.surface.create_simulate_oom
@@ -134408,6 +134410,8 @@
 dEQP-VK.wsi.xcb.display_timing.immediate.display_timing
 dEQP-VK.wsi.xcb.display_timing.mailbox.reference
 dEQP-VK.wsi.xcb.display_timing.mailbox.display_timing
+dEQP-VK.wsi.xcb.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.xcb.shared_presentable_image.scale_none.continuous
 dEQP-VK.wsi.wayland.surface.create
 dEQP-VK.wsi.wayland.surface.create_custom_allocator
 dEQP-VK.wsi.wayland.surface.create_simulate_oom
@@ -134458,6 +134462,8 @@
 dEQP-VK.wsi.wayland.display_timing.immediate.display_timing
 dEQP-VK.wsi.wayland.display_timing.mailbox.reference
 dEQP-VK.wsi.wayland.display_timing.mailbox.display_timing
+dEQP-VK.wsi.wayland.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.wayland.shared_presentable_image.scale_none.continuous
 dEQP-VK.wsi.mir.surface.create
 dEQP-VK.wsi.mir.surface.create_custom_allocator
 dEQP-VK.wsi.mir.surface.create_simulate_oom
@@ -134526,6 +134532,12 @@
 dEQP-VK.wsi.mir.display_timing.immediate.display_timing
 dEQP-VK.wsi.mir.display_timing.mailbox.reference
 dEQP-VK.wsi.mir.display_timing.mailbox.display_timing
+dEQP-VK.wsi.mir.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.mir.shared_presentable_image.scale_none.continuous
+dEQP-VK.wsi.mir.shared_presentable_image.scale_up.demand
+dEQP-VK.wsi.mir.shared_presentable_image.scale_up.continuous
+dEQP-VK.wsi.mir.shared_presentable_image.scale_down.demand
+dEQP-VK.wsi.mir.shared_presentable_image.scale_down.continuous
 dEQP-VK.wsi.android.surface.create
 dEQP-VK.wsi.android.surface.create_custom_allocator
 dEQP-VK.wsi.android.surface.create_simulate_oom
@@ -134593,6 +134605,12 @@
 dEQP-VK.wsi.android.display_timing.immediate.display_timing
 dEQP-VK.wsi.android.display_timing.mailbox.reference
 dEQP-VK.wsi.android.display_timing.mailbox.display_timing
+dEQP-VK.wsi.android.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.android.shared_presentable_image.scale_none.continuous
+dEQP-VK.wsi.android.shared_presentable_image.scale_up.demand
+dEQP-VK.wsi.android.shared_presentable_image.scale_up.continuous
+dEQP-VK.wsi.android.shared_presentable_image.scale_down.demand
+dEQP-VK.wsi.android.shared_presentable_image.scale_down.continuous
 dEQP-VK.wsi.win32.surface.create
 dEQP-VK.wsi.win32.surface.create_custom_allocator
 dEQP-VK.wsi.win32.surface.create_simulate_oom
@@ -134644,6 +134662,8 @@
 dEQP-VK.wsi.win32.display_timing.immediate.display_timing
 dEQP-VK.wsi.win32.display_timing.mailbox.reference
 dEQP-VK.wsi.win32.display_timing.mailbox.display_timing
+dEQP-VK.wsi.win32.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.win32.shared_presentable_image.scale_none.continuous
 dEQP-VK.synchronization.smoke.fences
 dEQP-VK.synchronization.smoke.semaphores
 dEQP-VK.synchronization.smoke.events
diff --git a/external/vulkancts/scripts/src/vulkan.h.in b/external/vulkancts/scripts/src/vulkan.h.in
index 21aecc7..aac2a32 100644
--- a/external/vulkancts/scripts/src/vulkan.h.in
+++ b/external/vulkancts/scripts/src/vulkan.h.in
@@ -238,6 +238,7 @@
     VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = 1000080000,
     VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000,
+    VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000,
     VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = 1000085000,
     VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX = 1000086000,
     VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX = 1000086001,
@@ -536,6 +537,7 @@
     VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7,
     VK_IMAGE_LAYOUT_PREINITIALIZED = 8,
     VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,
+    VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000,
     VK_IMAGE_LAYOUT_BEGIN_RANGE = VK_IMAGE_LAYOUT_UNDEFINED,
     VK_IMAGE_LAYOUT_END_RANGE = VK_IMAGE_LAYOUT_PREINITIALIZED,
     VK_IMAGE_LAYOUT_RANGE_SIZE = (VK_IMAGE_LAYOUT_PREINITIALIZED - VK_IMAGE_LAYOUT_UNDEFINED + 1),
@@ -3253,6 +3255,8 @@
     VK_PRESENT_MODE_MAILBOX_KHR = 1,
     VK_PRESENT_MODE_FIFO_KHR = 2,
     VK_PRESENT_MODE_FIFO_RELAXED_KHR = 3,
+    VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR = 1000111000,
+    VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR = 1000111001,
     VK_PRESENT_MODE_BEGIN_RANGE_KHR = VK_PRESENT_MODE_IMMEDIATE_KHR,
     VK_PRESENT_MODE_END_RANGE_KHR = VK_PRESENT_MODE_FIFO_RELAXED_KHR,
     VK_PRESENT_MODE_RANGE_SIZE_KHR = (VK_PRESENT_MODE_FIFO_RELAXED_KHR - VK_PRESENT_MODE_IMMEDIATE_KHR + 1),
@@ -3963,6 +3967,23 @@
     VkSurfaceFormat2KHR*                        pSurfaceFormats);
 #endif
 
+#define VK_KHR_shared_presentable_image 1
+#define VK_KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION 1
+#define VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME "VK_KHR_shared_presentable_image"
+typedef struct VkSharedPresentSurfaceCapabilitiesKHR {
+    VkStructureType      sType;
+    void*                pNext;
+    VkImageUsageFlags    sharedPresentSupportedUsageFlags;
+} VkSharedPresentSurfaceCapabilitiesKHR;
+
+typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainStatusKHR)(VkDevice device, VkSwapchainKHR swapchain);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainStatusKHR(
+    VkDevice                                    device,
+    VkSwapchainKHR                              swapchain);
+#endif
+
 #define VK_EXT_debug_report 1
 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)
 
