Add API tests for VK_KHR_external_fence* extensions
authorMika Isojärvi <misojarvi@google.com>
Mon, 15 May 2017 21:58:26 +0000 (14:58 -0700)
committerAlexander Galazin <alexander.galazin@arm.com>
Fri, 23 Jun 2017 21:02:58 +0000 (23:02 +0200)
New Tests:
dEQP-VK.api.external.fence.*

VK-GL-CTS issues: 119
Components: Vulkan

Change-Id: Ie812cd66b7d7aa5731338b050c23bfe805583ef6

23 files changed:
android/cts/master/vk-master.txt
external/vulkancts/framework/vulkan/vkBasicTypes.inl
external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
external/vulkancts/framework/vulkan/vkStrUtil.inl
external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
external/vulkancts/framework/vulkan/vkStructTypes.inl
external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
external/vulkancts/modules/vulkan/vktExternalMemoryUtil.cpp
external/vulkancts/modules/vulkan/vktExternalMemoryUtil.hpp
external/vulkancts/mustpass/1.0.2/vk-default.txt
external/vulkancts/scripts/src/vulkan.h.in

index f6f7012..1e68fd0 100644 (file)
@@ -14404,6 +14404,96 @@ dEQP-VK.api.external.memory.opaque_win32_kmt.dedicated.image.info
 dEQP-VK.api.external.memory.opaque_win32_kmt.dedicated.image.bind_export_import_bind
 dEQP-VK.api.external.memory.opaque_win32_kmt.dedicated.image.export_bind_import_bind
 dEQP-VK.api.external.memory.opaque_win32_kmt.dedicated.image.export_import_bind_bind
+dEQP-VK.api.external.fence.sync_fd.info
+dEQP-VK.api.external.fence.sync_fd.import_twice_temporary
+dEQP-VK.api.external.fence.sync_fd.reimport_temporary
+dEQP-VK.api.external.fence.sync_fd.import_multiple_times_temporary
+dEQP-VK.api.external.fence.sync_fd.signal_export_import_wait_temporary
+dEQP-VK.api.external.fence.sync_fd.signal_import_temporary
+dEQP-VK.api.external.fence.sync_fd.reset_temporary
+dEQP-VK.api.external.fence.sync_fd.transference_temporary
+dEQP-VK.api.external.fence.sync_fd.export_multiple_times_temporary
+dEQP-VK.api.external.fence.sync_fd.dup_temporary
+dEQP-VK.api.external.fence.sync_fd.dup2_temporary
+dEQP-VK.api.external.fence.sync_fd.dup3_temporary
+dEQP-VK.api.external.fence.sync_fd.send_over_socket_temporary
+dEQP-VK.api.external.fence.opaque_fd.info
+dEQP-VK.api.external.fence.opaque_fd.import_twice_temporary
+dEQP-VK.api.external.fence.opaque_fd.reimport_temporary
+dEQP-VK.api.external.fence.opaque_fd.import_multiple_times_temporary
+dEQP-VK.api.external.fence.opaque_fd.signal_export_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_fd.signal_import_temporary
+dEQP-VK.api.external.fence.opaque_fd.reset_temporary
+dEQP-VK.api.external.fence.opaque_fd.transference_temporary
+dEQP-VK.api.external.fence.opaque_fd.export_multiple_times_temporary
+dEQP-VK.api.external.fence.opaque_fd.dup_temporary
+dEQP-VK.api.external.fence.opaque_fd.dup2_temporary
+dEQP-VK.api.external.fence.opaque_fd.dup3_temporary
+dEQP-VK.api.external.fence.opaque_fd.send_over_socket_temporary
+dEQP-VK.api.external.fence.opaque_fd.signal_wait_import_temporary
+dEQP-VK.api.external.fence.opaque_fd.export_signal_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_fd.export_import_signal_wait_temporary
+dEQP-VK.api.external.fence.opaque_fd.import_twice_permanent
+dEQP-VK.api.external.fence.opaque_fd.reimport_permanent
+dEQP-VK.api.external.fence.opaque_fd.import_multiple_times_permanent
+dEQP-VK.api.external.fence.opaque_fd.signal_export_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_fd.signal_import_permanent
+dEQP-VK.api.external.fence.opaque_fd.reset_permanent
+dEQP-VK.api.external.fence.opaque_fd.transference_permanent
+dEQP-VK.api.external.fence.opaque_fd.export_multiple_times_permanent
+dEQP-VK.api.external.fence.opaque_fd.dup_permanent
+dEQP-VK.api.external.fence.opaque_fd.dup2_permanent
+dEQP-VK.api.external.fence.opaque_fd.dup3_permanent
+dEQP-VK.api.external.fence.opaque_fd.send_over_socket_permanent
+dEQP-VK.api.external.fence.opaque_fd.signal_wait_import_permanent
+dEQP-VK.api.external.fence.opaque_fd.export_signal_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_fd.export_import_signal_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32.info
+dEQP-VK.api.external.fence.opaque_win32.create_win32_temporary
+dEQP-VK.api.external.fence.opaque_win32.import_twice_temporary
+dEQP-VK.api.external.fence.opaque_win32.reimport_temporary
+dEQP-VK.api.external.fence.opaque_win32.import_multiple_times_temporary
+dEQP-VK.api.external.fence.opaque_win32.signal_export_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32.signal_import_temporary
+dEQP-VK.api.external.fence.opaque_win32.reset_temporary
+dEQP-VK.api.external.fence.opaque_win32.transference_temporary
+dEQP-VK.api.external.fence.opaque_win32.signal_wait_import_temporary
+dEQP-VK.api.external.fence.opaque_win32.export_signal_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32.export_import_signal_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32.create_win32_permanent
+dEQP-VK.api.external.fence.opaque_win32.import_twice_permanent
+dEQP-VK.api.external.fence.opaque_win32.reimport_permanent
+dEQP-VK.api.external.fence.opaque_win32.import_multiple_times_permanent
+dEQP-VK.api.external.fence.opaque_win32.signal_export_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32.signal_import_permanent
+dEQP-VK.api.external.fence.opaque_win32.reset_permanent
+dEQP-VK.api.external.fence.opaque_win32.transference_permanent
+dEQP-VK.api.external.fence.opaque_win32.signal_wait_import_permanent
+dEQP-VK.api.external.fence.opaque_win32.export_signal_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32.export_import_signal_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.info
+dEQP-VK.api.external.fence.opaque_win32_kmt.create_win32_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.import_twice_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.reimport_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.import_multiple_times_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_export_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_import_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.reset_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.transference_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_wait_import_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.export_signal_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.export_import_signal_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.create_win32_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.import_twice_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.reimport_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.import_multiple_times_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_export_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_import_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.reset_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.transference_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_wait_import_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.export_signal_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.export_import_signal_wait_permanent
 dEQP-VK.memory.allocation.basic.size_64.forward.count_1
 dEQP-VK.memory.allocation.basic.size_64.forward.count_10
 dEQP-VK.memory.allocation.basic.size_64.forward.count_100
index 18f0869..f47ea06 100644 (file)
@@ -193,6 +193,14 @@ enum VkStructureType
        VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR            = 1000085000,
        VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE                                                     = 1000092000,
        VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR                       = 1000111000,
+       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR                       = 1000112000,
+       VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR                                         = 1000112001,
+       VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR                                          = 1000113000,
+       VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR                            = 1000114000,
+       VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR                            = 1000114001,
+       VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR                                       = 1000114002,
+       VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR                                                      = 1000115000,
+       VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR                                                         = 1000115001,
        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR                            = 1000119000,
        VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR                                            = 1000119001,
        VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR                                                          = 1000119002,
@@ -1217,6 +1225,28 @@ enum VkDisplayPlaneAlphaFlagBitsKHR
 };
 typedef deUint32 VkDisplayPlaneAlphaFlagsKHR;
 
+enum VkExternalFenceHandleTypeFlagBitsKHR
+{
+       VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR                 = 0x00000001,
+       VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR              = 0x00000002,
+       VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR  = 0x00000004,
+       VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR                   = 0x00000008,
+};
+typedef deUint32 VkExternalFenceHandleTypeFlagsKHR;
+
+enum VkExternalFenceFeatureFlagBitsKHR
+{
+       VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR    = 0x00000001,
+       VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR    = 0x00000002,
+};
+typedef deUint32 VkExternalFenceFeatureFlagsKHR;
+
+enum VkFenceImportFlagBitsKHR
+{
+       VK_FENCE_IMPORT_TEMPORARY_BIT_KHR       = 0x00000001,
+};
+typedef deUint32 VkFenceImportFlagsKHR;
+
 enum VkDebugReportFlagBitsEXT
 {
        VK_DEBUG_REPORT_INFORMATION_BIT_EXT                     = 0x00000001,
index a786238..ead3c17 100644 (file)
@@ -134,6 +134,10 @@ virtual void               destroyDescriptorUpdateTemplateKHR              (VkDevice device, VkDescriptor
 virtual void           updateDescriptorSetWithTemplateKHR              (VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void* pData) const;
 virtual void           cmdPushDescriptorSetWithTemplateKHR             (VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData) const;
 virtual VkResult       getSwapchainStatusKHR                                   (VkDevice device, VkSwapchainKHR swapchain) const;
+virtual VkResult       importFenceWin32HandleKHR                               (VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo) const;
+virtual VkResult       getFenceWin32HandleKHR                                  (VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const;
+virtual VkResult       importFenceFdKHR                                                (VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo) const;
+virtual VkResult       getFenceFdKHR                                                   (VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) const;
 virtual void           getImageMemoryRequirements2KHR                  (VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const;
 virtual void           getBufferMemoryRequirements2KHR                 (VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const;
 virtual void           getImageSparseMemoryRequirements2KHR    (VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements) const;
index df516e2..9b38c47 100644 (file)
@@ -46,6 +46,7 @@ virtual void                          getPhysicalDeviceMemoryProperties2KHR                           (VkPhysicalDevice physi
 virtual void                           getPhysicalDeviceSparseImageFormatProperties2KHR        (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR* pFormatInfo, deUint32* pPropertyCount, VkSparseImageFormatProperties2KHR* pProperties) const;
 virtual VkResult                       getPhysicalDeviceSurfaceCapabilities2KHR                        (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities) const;
 virtual VkResult                       getPhysicalDeviceSurfaceFormats2KHR                                     (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, deUint32* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats) const;
+virtual void                           getPhysicalDeviceExternalFencePropertiesKHR                     (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, VkExternalFencePropertiesKHR* pExternalFenceProperties) const;
 virtual VkResult                       createDebugReportCallbackEXT                                            (VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback) const;
 virtual void                           destroyDebugReportCallbackEXT                                           (VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator) const;
 virtual void                           debugReportMessageEXT                                                           (VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const;
index fb850f7..bc61e21 100644 (file)
@@ -667,6 +667,26 @@ VkResult DeviceDriver::getSwapchainStatusKHR (VkDevice device, VkSwapchainKHR sw
        return m_vk.getSwapchainStatusKHR(device, swapchain);
 }
 
+VkResult DeviceDriver::importFenceWin32HandleKHR (VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo) const
+{
+       return m_vk.importFenceWin32HandleKHR(device, pImportFenceWin32HandleInfo);
+}
+
+VkResult DeviceDriver::getFenceWin32HandleKHR (VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const
+{
+       return m_vk.getFenceWin32HandleKHR(device, pGetWin32HandleInfo, pHandle);
+}
+
+VkResult DeviceDriver::importFenceFdKHR (VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo) const
+{
+       return m_vk.importFenceFdKHR(device, pImportFenceFdInfo);
+}
+
+VkResult DeviceDriver::getFenceFdKHR (VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) const
+{
+       return m_vk.getFenceFdKHR(device, pGetFdInfo, pFd);
+}
+
 void DeviceDriver::getImageMemoryRequirements2KHR (VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const
 {
        m_vk.getImageMemoryRequirements2KHR(device, pInfo, pMemoryRequirements);
index bd8dc81..51d10e6 100644 (file)
@@ -134,6 +134,10 @@ DestroyDescriptorUpdateTemplateKHRFunc             destroyDescriptorUpdateTemplateKHR;
 UpdateDescriptorSetWithTemplateKHRFunc         updateDescriptorSetWithTemplateKHR;
 CmdPushDescriptorSetWithTemplateKHRFunc                cmdPushDescriptorSetWithTemplateKHR;
 GetSwapchainStatusKHRFunc                                      getSwapchainStatusKHR;
+ImportFenceWin32HandleKHRFunc                          importFenceWin32HandleKHR;
+GetFenceWin32HandleKHRFunc                                     getFenceWin32HandleKHR;
+ImportFenceFdKHRFunc                                           importFenceFdKHR;
+GetFenceFdKHRFunc                                                      getFenceFdKHR;
 GetImageMemoryRequirements2KHRFunc                     getImageMemoryRequirements2KHR;
 GetBufferMemoryRequirements2KHRFunc                    getBufferMemoryRequirements2KHR;
 GetImageSparseMemoryRequirements2KHRFunc       getImageSparseMemoryRequirements2KHR;
index 980dd04..192d0e0 100644 (file)
@@ -183,6 +183,11 @@ typedef VKAPI_ATTR void                                    (VKAPI_CALL* CmdPushDescriptorSetWithTemplateKHRFunc
 typedef VKAPI_ATTR VkResult                            (VKAPI_CALL* GetSwapchainStatusKHRFunc)                                                         (VkDevice device, VkSwapchainKHR swapchain);
 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 void                                        (VKAPI_CALL* GetPhysicalDeviceExternalFencePropertiesKHRFunc)           (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, VkExternalFencePropertiesKHR* pExternalFenceProperties);
+typedef VKAPI_ATTR VkResult                            (VKAPI_CALL* ImportFenceWin32HandleKHRFunc)                                                     (VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);
+typedef VKAPI_ATTR VkResult                            (VKAPI_CALL* GetFenceWin32HandleKHRFunc)                                                        (VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle);
+typedef VKAPI_ATTR VkResult                            (VKAPI_CALL* ImportFenceFdKHRFunc)                                                                      (VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
+typedef VKAPI_ATTR VkResult                            (VKAPI_CALL* GetFenceFdKHRFunc)                                                                         (VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd);
 typedef VKAPI_ATTR void                                        (VKAPI_CALL* GetImageMemoryRequirements2KHRFunc)                                        (VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements);
 typedef VKAPI_ATTR void                                        (VKAPI_CALL* GetBufferMemoryRequirements2KHRFunc)                                       (VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements);
 typedef VKAPI_ATTR void                                        (VKAPI_CALL* GetImageSparseMemoryRequirements2KHRFunc)                          (VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements);
index a51e917..8c038ca 100644 (file)
@@ -134,6 +134,10 @@ m_vk.destroyDescriptorUpdateTemplateKHR            = (DestroyDescriptorUpdateTemplateKHRFu
 m_vk.updateDescriptorSetWithTemplateKHR                = (UpdateDescriptorSetWithTemplateKHRFunc)              GET_PROC_ADDR("vkUpdateDescriptorSetWithTemplateKHR");
 m_vk.cmdPushDescriptorSetWithTemplateKHR       = (CmdPushDescriptorSetWithTemplateKHRFunc)             GET_PROC_ADDR("vkCmdPushDescriptorSetWithTemplateKHR");
 m_vk.getSwapchainStatusKHR                                     = (GetSwapchainStatusKHRFunc)                                   GET_PROC_ADDR("vkGetSwapchainStatusKHR");
+m_vk.importFenceWin32HandleKHR                         = (ImportFenceWin32HandleKHRFunc)                               GET_PROC_ADDR("vkImportFenceWin32HandleKHR");
+m_vk.getFenceWin32HandleKHR                                    = (GetFenceWin32HandleKHRFunc)                                  GET_PROC_ADDR("vkGetFenceWin32HandleKHR");
+m_vk.importFenceFdKHR                                          = (ImportFenceFdKHRFunc)                                                GET_PROC_ADDR("vkImportFenceFdKHR");
+m_vk.getFenceFdKHR                                                     = (GetFenceFdKHRFunc)                                                   GET_PROC_ADDR("vkGetFenceFdKHR");
 m_vk.getImageMemoryRequirements2KHR                    = (GetImageMemoryRequirements2KHRFunc)                  GET_PROC_ADDR("vkGetImageMemoryRequirements2KHR");
 m_vk.getBufferMemoryRequirements2KHR           = (GetBufferMemoryRequirements2KHRFunc)                 GET_PROC_ADDR("vkGetBufferMemoryRequirements2KHR");
 m_vk.getImageSparseMemoryRequirements2KHR      = (GetImageSparseMemoryRequirements2KHRFunc)    GET_PROC_ADDR("vkGetImageSparseMemoryRequirements2KHR");
index 10d2476..34ece9c 100644 (file)
@@ -46,6 +46,7 @@ m_vk.getPhysicalDeviceMemoryProperties2KHR                            = (GetPhysicalDeviceMemoryProperti
 m_vk.getPhysicalDeviceSparseImageFormatProperties2KHR  = (GetPhysicalDeviceSparseImageFormatProperties2KHRFunc)        GET_PROC_ADDR("vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
 m_vk.getPhysicalDeviceSurfaceCapabilities2KHR                  = (GetPhysicalDeviceSurfaceCapabilities2KHRFunc)                        GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceCapabilities2KHR");
 m_vk.getPhysicalDeviceSurfaceFormats2KHR                               = (GetPhysicalDeviceSurfaceFormats2KHRFunc)                                     GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceFormats2KHR");
+m_vk.getPhysicalDeviceExternalFencePropertiesKHR               = (GetPhysicalDeviceExternalFencePropertiesKHRFunc)                     GET_PROC_ADDR("vkGetPhysicalDeviceExternalFencePropertiesKHR");
 m_vk.createDebugReportCallbackEXT                                              = (CreateDebugReportCallbackEXTFunc)                                            GET_PROC_ADDR("vkCreateDebugReportCallbackEXT");
 m_vk.destroyDebugReportCallbackEXT                                             = (DestroyDebugReportCallbackEXTFunc)                                           GET_PROC_ADDR("vkDestroyDebugReportCallbackEXT");
 m_vk.debugReportMessageEXT                                                             = (DebugReportMessageEXTFunc)                                                           GET_PROC_ADDR("vkDebugReportMessageEXT");
index 7b296f1..c7e210e 100644 (file)
@@ -227,6 +227,11 @@ VkResult InstanceDriver::getPhysicalDeviceSurfaceFormats2KHR (VkPhysicalDevice p
        return m_vk.getPhysicalDeviceSurfaceFormats2KHR(physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats);
 }
 
+void InstanceDriver::getPhysicalDeviceExternalFencePropertiesKHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, VkExternalFencePropertiesKHR* pExternalFenceProperties) const
+{
+       m_vk.getPhysicalDeviceExternalFencePropertiesKHR(physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+}
+
 VkResult InstanceDriver::createDebugReportCallbackEXT (VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback) const
 {
        return m_vk.createDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
index a70a96a..e0c5ef0 100644 (file)
@@ -46,6 +46,7 @@ GetPhysicalDeviceMemoryProperties2KHRFunc                             getPhysicalDeviceMemoryProperties2K
 GetPhysicalDeviceSparseImageFormatProperties2KHRFunc   getPhysicalDeviceSparseImageFormatProperties2KHR;
 GetPhysicalDeviceSurfaceCapabilities2KHRFunc                   getPhysicalDeviceSurfaceCapabilities2KHR;
 GetPhysicalDeviceSurfaceFormats2KHRFunc                                        getPhysicalDeviceSurfaceFormats2KHR;
+GetPhysicalDeviceExternalFencePropertiesKHRFunc                        getPhysicalDeviceExternalFencePropertiesKHR;
 CreateDebugReportCallbackEXTFunc                                               createDebugReportCallbackEXT;
 DestroyDebugReportCallbackEXTFunc                                              destroyDebugReportCallbackEXT;
 DebugReportMessageEXTFunc                                                              debugReportMessageEXT;
index 9432e7d..d7c502b 100644 (file)
@@ -1222,6 +1222,43 @@ VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceSurfaceFormats2KHR (VkPhysicalDe
        return VK_SUCCESS;
 }
 
+VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceExternalFencePropertiesKHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, VkExternalFencePropertiesKHR* pExternalFenceProperties)
+{
+       DE_UNREF(physicalDevice);
+       DE_UNREF(pExternalFenceInfo);
+       DE_UNREF(pExternalFenceProperties);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL importFenceWin32HandleKHR (VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo)
+{
+       DE_UNREF(device);
+       DE_UNREF(pImportFenceWin32HandleInfo);
+       return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getFenceWin32HandleKHR (VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle)
+{
+       DE_UNREF(device);
+       DE_UNREF(pGetWin32HandleInfo);
+       DE_UNREF(pHandle);
+       return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL importFenceFdKHR (VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo)
+{
+       DE_UNREF(device);
+       DE_UNREF(pImportFenceFdInfo);
+       return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getFenceFdKHR (VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd)
+{
+       DE_UNREF(device);
+       DE_UNREF(pGetFdInfo);
+       DE_UNREF(pFd);
+       return VK_SUCCESS;
+}
+
 VKAPI_ATTR void VKAPI_CALL getImageMemoryRequirements2KHR (VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements)
 {
        DE_UNREF(device);
@@ -1406,6 +1443,7 @@ static const tcu::StaticFunctionLibrary::Entry s_instanceFunctions[] =
        VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR,  getPhysicalDeviceSparseImageFormatProperties2KHR),
        VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceCapabilities2KHR,                  getPhysicalDeviceSurfaceCapabilities2KHR),
        VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceFormats2KHR,                               getPhysicalDeviceSurfaceFormats2KHR),
+       VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR,               getPhysicalDeviceExternalFencePropertiesKHR),
        VK_NULL_FUNC_ENTRY(vkCreateDebugReportCallbackEXT,                                              createDebugReportCallbackEXT),
        VK_NULL_FUNC_ENTRY(vkDestroyDebugReportCallbackEXT,                                             destroyDebugReportCallbackEXT),
        VK_NULL_FUNC_ENTRY(vkDebugReportMessageEXT,                                                             debugReportMessageEXT),
@@ -1548,6 +1586,10 @@ static const tcu::StaticFunctionLibrary::Entry s_deviceFunctions[] =
        VK_NULL_FUNC_ENTRY(vkUpdateDescriptorSetWithTemplateKHR,        updateDescriptorSetWithTemplateKHR),
        VK_NULL_FUNC_ENTRY(vkCmdPushDescriptorSetWithTemplateKHR,       cmdPushDescriptorSetWithTemplateKHR),
        VK_NULL_FUNC_ENTRY(vkGetSwapchainStatusKHR,                                     getSwapchainStatusKHR),
+       VK_NULL_FUNC_ENTRY(vkImportFenceWin32HandleKHR,                         importFenceWin32HandleKHR),
+       VK_NULL_FUNC_ENTRY(vkGetFenceWin32HandleKHR,                            getFenceWin32HandleKHR),
+       VK_NULL_FUNC_ENTRY(vkImportFenceFdKHR,                                          importFenceFdKHR),
+       VK_NULL_FUNC_ENTRY(vkGetFenceFdKHR,                                                     getFenceFdKHR),
        VK_NULL_FUNC_ENTRY(vkGetImageMemoryRequirements2KHR,            getImageMemoryRequirements2KHR),
        VK_NULL_FUNC_ENTRY(vkGetBufferMemoryRequirements2KHR,           getBufferMemoryRequirements2KHR),
        VK_NULL_FUNC_ENTRY(vkGetImageSparseMemoryRequirements2KHR,      getImageSparseMemoryRequirements2KHR),
index 1b51136..2e8c580 100644 (file)
@@ -163,6 +163,9 @@ tcu::Format::Bitfield<32>   getSurfaceTransformFlagsKHRStr                                  (VkSurfaceTransform
 tcu::Format::Bitfield<32>      getCompositeAlphaFlagsKHRStr                                    (VkCompositeAlphaFlagsKHR value);
 tcu::Format::Bitfield<32>      getSwapchainCreateFlagsKHRStr                                   (VkSwapchainCreateFlagsKHR value);
 tcu::Format::Bitfield<32>      getDisplayPlaneAlphaFlagsKHRStr                                 (VkDisplayPlaneAlphaFlagsKHR value);
+tcu::Format::Bitfield<32>      getExternalFenceHandleTypeFlagsKHRStr                   (VkExternalFenceHandleTypeFlagsKHR value);
+tcu::Format::Bitfield<32>      getExternalFenceFeatureFlagsKHRStr                              (VkExternalFenceFeatureFlagsKHR value);
+tcu::Format::Bitfield<32>      getFenceImportFlagsKHRStr                                               (VkFenceImportFlagsKHR value);
 tcu::Format::Bitfield<32>      getDebugReportFlagsEXTStr                                               (VkDebugReportFlagsEXT value);
 tcu::Format::Bitfield<32>      getExternalMemoryHandleTypeFlagsKHRStr                  (VkExternalMemoryHandleTypeFlagsKHR value);
 tcu::Format::Bitfield<32>      getExternalMemoryFeatureFlagsKHRStr                             (VkExternalMemoryFeatureFlagsKHR value);
@@ -351,6 +354,14 @@ std::ostream&      operator<<      (std::ostream& s, const VkSharedPresentSurfaceCapabilit
 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 VkPhysicalDeviceExternalFenceInfoKHR& value);
+std::ostream&  operator<<      (std::ostream& s, const VkExternalFencePropertiesKHR& value);
+std::ostream&  operator<<      (std::ostream& s, const VkExportFenceCreateInfoKHR& value);
+std::ostream&  operator<<      (std::ostream& s, const VkImportFenceWin32HandleInfoKHR& value);
+std::ostream&  operator<<      (std::ostream& s, const VkExportFenceWin32HandleInfoKHR& value);
+std::ostream&  operator<<      (std::ostream& s, const VkFenceGetWin32HandleInfoKHR& value);
+std::ostream&  operator<<      (std::ostream& s, const VkImportFenceFdInfoKHR& value);
+std::ostream&  operator<<      (std::ostream& s, const VkFenceGetFdInfoKHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkMemoryDedicatedRequirementsKHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkMemoryDedicatedAllocateInfoKHR& value);
 std::ostream&  operator<<      (std::ostream& s, const VkBufferMemoryRequirementsInfo2KHR& value);
index 5e67f16..0c34b6e 100644 (file)
@@ -204,6 +204,14 @@ const char* getStructureTypeName (VkStructureType value)
                case VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR:              return "VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR";
                case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:                                               return "VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE";
                case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:                 return "VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR";
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR:                 return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR";
+               case VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR:                                   return "VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR";
+               case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR:                                    return "VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR";
+               case VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR:                              return "VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR";
+               case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:                              return "VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR";
+               case VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR:                                 return "VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR";
+               case VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR:                                                return "VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR";
+               case VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR:                                                   return "VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR";
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR:                              return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR";
                case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR:                                              return "VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR";
                case VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR:                                                    return "VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR";
@@ -1424,6 +1432,37 @@ tcu::Format::Bitfield<32> getDisplayPlaneAlphaFlagsKHRStr (VkDisplayPlaneAlphaFl
        return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
 }
 
+tcu::Format::Bitfield<32> getExternalFenceHandleTypeFlagsKHRStr (VkExternalFenceHandleTypeFlagsKHR value)
+{
+       static const tcu::Format::BitDesc s_desc[] =
+       {
+               tcu::Format::BitDesc(VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR,                   "VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR"),
+               tcu::Format::BitDesc(VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR,                "VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR"),
+               tcu::Format::BitDesc(VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR,    "VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR"),
+               tcu::Format::BitDesc(VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR,                             "VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR"),
+       };
+       return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getExternalFenceFeatureFlagsKHRStr (VkExternalFenceFeatureFlagsKHR value)
+{
+       static const tcu::Format::BitDesc s_desc[] =
+       {
+               tcu::Format::BitDesc(VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR,      "VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR"),
+               tcu::Format::BitDesc(VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR,      "VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR"),
+       };
+       return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getFenceImportFlagsKHRStr (VkFenceImportFlagsKHR value)
+{
+       static const tcu::Format::BitDesc s_desc[] =
+       {
+               tcu::Format::BitDesc(VK_FENCE_IMPORT_TEMPORARY_BIT_KHR, "VK_FENCE_IMPORT_TEMPORARY_BIT_KHR"),
+       };
+       return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
 tcu::Format::Bitfield<32> getDebugReportFlagsEXTStr (VkDebugReportFlagsEXT value)
 {
        static const tcu::Format::BitDesc s_desc[] =
@@ -3633,6 +3672,99 @@ std::ostream& operator<< (std::ostream& s, const VkSurfaceFormat2KHR& value)
        return s;
 }
 
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceExternalFenceInfoKHR& value)
+{
+       s << "VkPhysicalDeviceExternalFenceInfoKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\thandleType = " << value.handleType << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkExternalFencePropertiesKHR& value)
+{
+       s << "VkExternalFencePropertiesKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\texportFromImportedHandleTypes = " << getExternalFenceHandleTypeFlagsKHRStr(value.exportFromImportedHandleTypes) << '\n';
+       s << "\tcompatibleHandleTypes = " << getExternalFenceHandleTypeFlagsKHRStr(value.compatibleHandleTypes) << '\n';
+       s << "\texternalFenceFeatures = " << getExternalFenceFeatureFlagsKHRStr(value.externalFenceFeatures) << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkExportFenceCreateInfoKHR& value)
+{
+       s << "VkExportFenceCreateInfoKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\thandleTypes = " << getExternalFenceHandleTypeFlagsKHRStr(value.handleTypes) << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkImportFenceWin32HandleInfoKHR& value)
+{
+       s << "VkImportFenceWin32HandleInfoKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tfence = " << value.fence << '\n';
+       s << "\tflags = " << getFenceImportFlagsKHRStr(value.flags) << '\n';
+       s << "\thandleType = " << value.handleType << '\n';
+       s << "\thandle = " << value.handle << '\n';
+       s << "\tname = " << getCharPtrStr(value.name) << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkExportFenceWin32HandleInfoKHR& value)
+{
+       s << "VkExportFenceWin32HandleInfoKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tpAttributes = " << value.pAttributes << '\n';
+       s << "\tdwAccess = " << value.dwAccess << '\n';
+       s << "\tname = " << getCharPtrStr(value.name) << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkFenceGetWin32HandleInfoKHR& value)
+{
+       s << "VkFenceGetWin32HandleInfoKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tfence = " << value.fence << '\n';
+       s << "\thandleType = " << value.handleType << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkImportFenceFdInfoKHR& value)
+{
+       s << "VkImportFenceFdInfoKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tfence = " << value.fence << '\n';
+       s << "\tflags = " << getFenceImportFlagsKHRStr(value.flags) << '\n';
+       s << "\thandleType = " << value.handleType << '\n';
+       s << "\tfd = " << value.fd << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkFenceGetFdInfoKHR& value)
+{
+       s << "VkFenceGetFdInfoKHR = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tfence = " << value.fence << '\n';
+       s << "\thandleType = " << value.handleType << '\n';
+       s << '}';
+       return s;
+}
+
 std::ostream& operator<< (std::ostream& s, const VkMemoryDedicatedRequirementsKHR& value)
 {
        s << "VkMemoryDedicatedRequirementsKHR = {\n";
index d4d5263..959f74e 100644 (file)
@@ -1524,6 +1524,75 @@ struct VkSurfaceFormat2KHR
        VkSurfaceFormatKHR      surfaceFormat;
 };
 
+struct VkPhysicalDeviceExternalFenceInfoKHR
+{
+       VkStructureType                                                 sType;
+       const void*                                                             pNext;
+       VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+};
+
+struct VkExternalFencePropertiesKHR
+{
+       VkStructureType                                         sType;
+       void*                                                           pNext;
+       VkExternalFenceHandleTypeFlagsKHR       exportFromImportedHandleTypes;
+       VkExternalFenceHandleTypeFlagsKHR       compatibleHandleTypes;
+       VkExternalFenceFeatureFlagsKHR          externalFenceFeatures;
+};
+
+struct VkExportFenceCreateInfoKHR
+{
+       VkStructureType                                         sType;
+       const void*                                                     pNext;
+       VkExternalFenceHandleTypeFlagsKHR       handleTypes;
+};
+
+struct VkImportFenceWin32HandleInfoKHR
+{
+       VkStructureType                                                 sType;
+       const void*                                                             pNext;
+       VkFence                                                                 fence;
+       VkFenceImportFlagsKHR                                   flags;
+       VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+       pt::Win32Handle                                                 handle;
+       char*                                                                   name;
+};
+
+struct VkExportFenceWin32HandleInfoKHR
+{
+       VkStructureType                                 sType;
+       const void*                                             pNext;
+       pt::Win32SecurityAttributesPtr  pAttributes;
+       deUint32                                                dwAccess;
+       char*                                                   name;
+};
+
+struct VkFenceGetWin32HandleInfoKHR
+{
+       VkStructureType                                                 sType;
+       const void*                                                             pNext;
+       VkFence                                                                 fence;
+       VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+};
+
+struct VkImportFenceFdInfoKHR
+{
+       VkStructureType                                                 sType;
+       const void*                                                             pNext;
+       VkFence                                                                 fence;
+       VkFenceImportFlagsKHR                                   flags;
+       VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+       int                                                                             fd;
+};
+
+struct VkFenceGetFdInfoKHR
+{
+       VkStructureType                                                 sType;
+       const void*                                                             pNext;
+       VkFence                                                                 fence;
+       VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+};
+
 struct VkMemoryDedicatedRequirementsKHR
 {
        VkStructureType sType;
index 5e6b068..80636fa 100644 (file)
@@ -134,6 +134,10 @@ virtual void               destroyDescriptorUpdateTemplateKHR              (VkDevice device, VkDescriptor
 virtual void           updateDescriptorSetWithTemplateKHR              (VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void* pData) const = 0;
 virtual void           cmdPushDescriptorSetWithTemplateKHR             (VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData) const = 0;
 virtual VkResult       getSwapchainStatusKHR                                   (VkDevice device, VkSwapchainKHR swapchain) const = 0;
+virtual VkResult       importFenceWin32HandleKHR                               (VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo) const = 0;
+virtual VkResult       getFenceWin32HandleKHR                                  (VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const = 0;
+virtual VkResult       importFenceFdKHR                                                (VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo) const = 0;
+virtual VkResult       getFenceFdKHR                                                   (VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
 virtual void           getImageMemoryRequirements2KHR                  (VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const = 0;
 virtual void           getBufferMemoryRequirements2KHR                 (VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const = 0;
 virtual void           getImageSparseMemoryRequirements2KHR    (VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements) const = 0;
index 97592bb..2923961 100644 (file)
@@ -46,6 +46,7 @@ virtual void                          getPhysicalDeviceMemoryProperties2KHR                           (VkPhysicalDevice physi
 virtual void                           getPhysicalDeviceSparseImageFormatProperties2KHR        (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR* pFormatInfo, deUint32* pPropertyCount, VkSparseImageFormatProperties2KHR* pProperties) const = 0;
 virtual VkResult                       getPhysicalDeviceSurfaceCapabilities2KHR                        (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities) const = 0;
 virtual VkResult                       getPhysicalDeviceSurfaceFormats2KHR                                     (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, deUint32* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats) const = 0;
+virtual void                           getPhysicalDeviceExternalFencePropertiesKHR                     (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, VkExternalFencePropertiesKHR* pExternalFenceProperties) const = 0;
 virtual VkResult                       createDebugReportCallbackEXT                                            (VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback) const = 0;
 virtual void                           destroyDebugReportCallbackEXT                                           (VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator) const = 0;
 virtual void                           debugReportMessageEXT                                                           (VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const = 0;
index 8ac6a81..925bdd8 100644 (file)
@@ -177,7 +177,8 @@ uint32_t chooseQueueFamilyIndex (const vk::InstanceInterface&       vki,
 
 vk::Move<vk::VkInstance> createInstance (const vk::PlatformInterface&                                          vkp,
                                                                                 const vk::VkExternalSemaphoreHandleTypeFlagsKHR        externalSemaphoreTypes,
-                                                                                const vk::VkExternalMemoryHandleTypeFlagsKHR           externalMemoryTypes)
+                                                                                const vk::VkExternalMemoryHandleTypeFlagsKHR           externalMemoryTypes,
+                                                                                const vk::VkExternalFenceHandleTypeFlagsKHR            externalFenceTypes)
 {
        std::vector<std::string> instanceExtensions;
 
@@ -189,6 +190,9 @@ vk::Move<vk::VkInstance> createInstance (const vk::PlatformInterface&                                               vkp,
        if (externalMemoryTypes != 0)
                instanceExtensions.push_back("VK_KHR_external_memory_capabilities");
 
+       if (externalFenceTypes != 0)
+               instanceExtensions.push_back("VK_KHR_external_fence_capabilities");
+
        try
        {
                return vk::createDefaultInstance(vkp, std::vector<std::string>(), instanceExtensions);
@@ -206,6 +210,7 @@ vk::Move<vk::VkDevice> createDevice (const vk::InstanceInterface&                                           vki,
                                                                         vk::VkPhysicalDevice                                                           physicalDevice,
                                                                         const vk::VkExternalSemaphoreHandleTypeFlagsKHR        externalSemaphoreTypes,
                                                                         const vk::VkExternalMemoryHandleTypeFlagsKHR           externalMemoryTypes,
+                                                                        const vk::VkExternalFenceHandleTypeFlagsKHR            externalFenceTypes,
                                                                         deUint32                                                                                       queueFamilyIndex,
                                                                         bool                                                                                           useDedicatedAllocs = false)
 {
@@ -218,6 +223,13 @@ vk::Move<vk::VkDevice> createDevice (const vk::InstanceInterface&                                          vki,
                deviceExtensions.push_back("VK_KHR_external_semaphore_fd");
        }
 
+       if ((externalFenceTypes
+                       & (vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR
+                               | vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR)) != 0)
+       {
+               deviceExtensions.push_back("VK_KHR_external_fence_fd");
+       }
+
        if (useDedicatedAllocs)
        {
                deviceExtensions.push_back("VK_KHR_dedicated_allocation");
@@ -232,12 +244,18 @@ vk::Move<vk::VkDevice> createDevice (const vk::InstanceInterface&                                         vki,
 
        if ((externalSemaphoreTypes
                        & (vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
-                               | vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT_KHR
                                | vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR)) != 0)
        {
                deviceExtensions.push_back("VK_KHR_external_semaphore_win32");
        }
 
+       if ((externalFenceTypes
+                       & (vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
+                               | vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR)) != 0)
+       {
+               deviceExtensions.push_back("VK_KHR_external_fence_win32");
+       }
+
        if ((externalMemoryTypes
                        & (vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
                           | vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR
@@ -328,7 +346,35 @@ void checkSemaphoreSupport (const vk::InstanceInterface&                                   vki,
                TCU_THROW(NotSupportedError, "Semaphore doesn't support exporting in external type");
 
        if ((properties.externalSemaphoreFeatures & vk::VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR) == 0)
-               TCU_THROW(NotSupportedError, "Semaphore doesn't support exporting in external type");
+               TCU_THROW(NotSupportedError, "Semaphore doesn't support importing in external type");
+}
+
+void checkFenceSupport (const vk::InstanceInterface&                           vki,
+                                               vk::VkPhysicalDevice                                            device,
+                                               vk::VkExternalFenceHandleTypeFlagBitsKHR        externalType)
+{
+       const vk::VkPhysicalDeviceExternalFenceInfoKHR  info                    =
+       {
+               vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR,
+               DE_NULL,
+               externalType
+       };
+       vk::VkExternalFencePropertiesKHR                                properties      =
+       {
+               vk::VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR,
+               DE_NULL,
+               0u,
+               0u,
+               0u
+       };
+
+       vki.getPhysicalDeviceExternalFencePropertiesKHR(device, &info, &properties);
+
+       if ((properties.externalFenceFeatures & vk::VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR) == 0)
+               TCU_THROW(NotSupportedError, "Fence doesn't support exporting in external type");
+
+       if ((properties.externalFenceFeatures & vk::VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR) == 0)
+               TCU_THROW(NotSupportedError, "Fence doesn't support importing in external type");
 }
 
 void checkBufferSupport (const vk::InstanceInterface&                          vki,
@@ -471,10 +517,33 @@ void submitDummyWait (const vk::DeviceInterface&  vkd,
        VK_CHECK(vkd.queueSubmit(queue, 1, &submit, (vk::VkFence)0u));
 }
 
+void submitDummySignal (const vk::DeviceInterface&     vkd,
+                                               vk::VkQueue                                     queue,
+                                               vk::VkFence                                     fence)
+{
+       const vk::VkSubmitInfo submit =
+       {
+               vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,
+               DE_NULL,
+
+               0u,
+               DE_NULL,
+               DE_NULL,
+
+               0u,
+               DE_NULL,
+
+               0u,
+               DE_NULL
+       };
+
+       VK_CHECK(vkd.queueSubmit(queue, 1, &submit, fence));
+}
+
 tcu::TestStatus testSemaphoreQueries (Context& context, vk::VkExternalSemaphoreHandleTypeFlagBitsKHR externalType)
 {
        const vk::PlatformInterface&            vkp                             (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                (createInstance(vkp, externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                (createInstance(vkp, externalType, 0u, 0u));
        const vk::InstanceDriver                        vki                             (vkp, *instance);
        const vk::VkPhysicalDevice                      device                  (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
 
@@ -523,7 +592,7 @@ tcu::TestStatus testSemaphoreWin32Create (Context&                                  context,
 #if (DE_OS == DE_OS_WIN32)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
@@ -531,7 +600,7 @@ tcu::TestStatus testSemaphoreWin32Create (Context&                                  context,
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>                                  device                  (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>                                  device                  (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
                const vk::DeviceDriver                                                  vkd                             (vki, *device);
                const vk::VkQueue                                                               queue                   (getQueue(vkd, *device, queueFamilyIndex));
                const vk::VkExportSemaphoreWin32HandleInfoKHR   win32ExportInfo =
@@ -594,7 +663,7 @@ tcu::TestStatus testSemaphoreImportTwice (Context&                                  context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
@@ -602,7 +671,7 @@ tcu::TestStatus testSemaphoreImportTwice (Context&                                  context,
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device                  (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>          device                  (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
                const vk::DeviceDriver                          vkd                             (vki, *device);
                const vk::VkQueue                                       queue                   (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkSemaphore>       semaphore               (createExportableSemaphore(vkd, *device, config.externalType));
@@ -641,7 +710,7 @@ tcu::TestStatus testSemaphoreImportReimport (Context&                                       context,
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
@@ -649,7 +718,7 @@ tcu::TestStatus testSemaphoreImportReimport (Context&                                       context,
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device                  (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>          device                  (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
                const vk::DeviceDriver                          vkd                             (vki, *device);
                const vk::VkQueue                                       queue                   (getQueue(vkd, *device, queueFamilyIndex));
 
@@ -687,7 +756,7 @@ tcu::TestStatus testSemaphoreSignalExportImportWait (Context&                                       context,
                                                                                                         const SemaphoreTestConfig      config)
 {
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
@@ -695,7 +764,7 @@ tcu::TestStatus testSemaphoreSignalExportImportWait (Context&                                       context,
        checkSemaphoreSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device                          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>          device                          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
                const vk::DeviceDriver                          vkd                                     (vki, *device);
                const vk::VkQueue                                       queue                           (getQueue(vkd, *device, queueFamilyIndex));
                const vk::Unique<vk::VkSemaphore>       semaphoreA                      (createExportableSemaphore(vkd, *device, config.externalType));
@@ -720,35 +789,966 @@ tcu::TestStatus testSemaphoreSignalExportImportWait (Context&                                    context,
        }
 }
 
-tcu::TestStatus testSemaphoreExportSignalImportWait (Context&                                  context,
-                                                                                                        const SemaphoreTestConfig      config)
+tcu::TestStatus testSemaphoreExportSignalImportWait (Context&                                  context,
+                                                                                                        const SemaphoreTestConfig      config)
+{
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+       const vk::VkSemaphoreImportFlagsKHR     flags                           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+
+       DE_ASSERT(getHandelTypeTransferences(config.externalType) == TRANSFERENCE_REFERENCE);
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::Unique<vk::VkDevice>          device                          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                                     (vki, *device);
+               const vk::VkQueue                                       queue                           (getQueue(vkd, *device, queueFamilyIndex));
+
+               const vk::Unique<vk::VkSemaphore>       semaphoreA                      (createExportableSemaphore(vkd, *device, config.externalType));
+               NativeHandle                                            handle;
+
+               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+
+               submitDummySignal(vkd, queue, *semaphoreA);
+               {
+                       {
+                               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createAndImportSemaphore(vkd, *device, config.externalType, handle, flags));
+
+                               submitDummyWait(vkd, queue, *semaphoreB);
+                               VK_CHECK(vkd.queueWaitIdle(queue));
+                       }
+               }
+
+               return tcu::TestStatus::pass("Pass");
+       }
+}
+
+tcu::TestStatus testSemaphoreExportImportSignalWait (Context&                                  context,
+                                                                                                        const SemaphoreTestConfig      config)
+{
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       DE_ASSERT(getHandelTypeTransferences(config.externalType) == TRANSFERENCE_REFERENCE);
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+
+               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
+               NativeHandle                                            handle;
+
+               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+
+               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createAndImportSemaphore(vkd, *device, config.externalType, handle, flags));
+
+               submitDummySignal(vkd, queue, *semaphoreA);
+               submitDummyWait(vkd, queue, *semaphoreB);
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               return tcu::TestStatus::pass("Pass");
+       }
+}
+
+tcu::TestStatus testSemaphoreSignalImport (Context&                                            context,
+                                                                                  const SemaphoreTestConfig    config)
+{
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+
+               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
+               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createSemaphore(vkd, *device));
+               NativeHandle                                            handle;
+
+               submitDummySignal(vkd, queue, *semaphoreB);
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummySignal(vkd, queue, *semaphoreA);
+
+               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+
+               importSemaphore(vkd, *device, *semaphoreB, config.externalType, handle, flags);
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummyWait(vkd, queue, *semaphoreB);
+               else if (transference == TRANSFERENCE_REFERENCE)
+               {
+                       submitDummySignal(vkd, queue, *semaphoreA);
+                       submitDummyWait(vkd, queue, *semaphoreB);
+               }
+               else
+                       DE_FATAL("Unknown transference.");
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               return tcu::TestStatus::pass("Pass");
+       }
+}
+
+tcu::TestStatus testSemaphoreSignalWaitImport (Context&                                                context,
+                                                                                          const SemaphoreTestConfig    config)
+{
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+
+               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
+               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createSemaphore(vkd, *device));
+               NativeHandle                                            handle;
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummySignal(vkd, queue, *semaphoreA);
+
+               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+
+               submitDummySignal(vkd, queue, *semaphoreB);
+               submitDummyWait(vkd, queue, *semaphoreB);
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               importSemaphore(vkd, *device, *semaphoreB, config.externalType, handle, flags);
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummyWait(vkd, queue, *semaphoreB);
+               else if (transference == TRANSFERENCE_REFERENCE)
+               {
+                       submitDummySignal(vkd, queue, *semaphoreA);
+                       submitDummyWait(vkd, queue, *semaphoreB);
+               }
+               else
+                       DE_FATAL("Unknown transference.");
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               return tcu::TestStatus::pass("Pass");
+       }
+}
+
+tcu::TestStatus testSemaphoreMultipleExports (Context&                                 context,
+                                                                                         const SemaphoreTestConfig     config)
+{
+       const size_t                                            exportCount                     = 4 * 1024;
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::Unique<vk::VkSemaphore>       semaphore       (createExportableSemaphore(vkd, *device, config.externalType));
+
+               for (size_t exportNdx = 0; exportNdx < exportCount; exportNdx++)
+               {
+                       NativeHandle handle;
+
+                       if (transference == TRANSFERENCE_COPY)
+                               submitDummySignal(vkd, queue, *semaphore);
+
+                       getSemaphoreNative(vkd, *device, *semaphore, config.externalType, handle);
+               }
+
+               submitDummySignal(vkd, queue, *semaphore);
+               submitDummyWait(vkd, queue, *semaphore);
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+       }
+
+       return tcu::TestStatus::pass("Pass");
+}
+
+tcu::TestStatus testSemaphoreMultipleImports (Context&                                 context,
+                                                                                         const SemaphoreTestConfig     config)
+{
+       const size_t                                            importCount                     = 4 * 1024;
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
+               NativeHandle                                            handleA;
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummySignal(vkd, queue, *semaphoreA);
+
+               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handleA);
+
+               for (size_t importNdx = 0; importNdx < importCount; importNdx++)
+               {
+                       NativeHandle                                            handleB         (handleA);
+                       const vk::Unique<vk::VkSemaphore>       semaphoreB      (createAndImportSemaphore(vkd, *device, config.externalType, handleB, flags));
+               }
+
+               if (transference == TRANSFERENCE_COPY)
+               {
+                       importSemaphore(vkd, *device, *semaphoreA, config.externalType, handleA, flags);
+                       submitDummyWait(vkd, queue, *semaphoreA);
+               }
+               else if (transference == TRANSFERENCE_REFERENCE)
+               {
+                       submitDummySignal(vkd, queue, *semaphoreA);
+                       submitDummyWait(vkd, queue, *semaphoreA);
+               }
+               else
+                       DE_FATAL("Unknown transference.");
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+       }
+
+       return tcu::TestStatus::pass("Pass");
+}
+
+tcu::TestStatus testSemaphoreTransference (Context&                                            context,
+                                                                                  const SemaphoreTestConfig    config)
+{
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+
+               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
+               NativeHandle                                            handle;
+
+               submitDummySignal(vkd, queue, *semaphoreA);
+
+               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+
+               {
+                       const vk::Unique<vk::VkSemaphore>       semaphoreB                      (createAndImportSemaphore(vkd, *device, config.externalType, handle, flags));
+
+                       if (config.permanence == PERMANENCE_PERMANENT)
+                       {
+                               if (transference == TRANSFERENCE_COPY)
+                               {
+                                       submitDummySignal(vkd, queue, *semaphoreA);
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.queueWaitIdle(queue));
+
+                                       submitDummySignal(vkd, queue, *semaphoreB);
+
+                                       submitDummyWait(vkd, queue, *semaphoreA);
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.queueWaitIdle(queue));
+                               }
+                               else if (transference== TRANSFERENCE_REFERENCE)
+                               {
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.queueWaitIdle(queue));
+
+                                       submitDummySignal(vkd, queue, *semaphoreA);
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+
+                                       submitDummySignal(vkd, queue, *semaphoreB);
+                                       submitDummyWait(vkd, queue, *semaphoreA);
+                                       VK_CHECK(vkd.queueWaitIdle(queue));
+                               }
+                               else
+                                       DE_FATAL("Unknown transference.");
+                       }
+                       else if (config.permanence == PERMANENCE_TEMPORARY)
+                       {
+                               if (transference == TRANSFERENCE_COPY)
+                               {
+                                       submitDummySignal(vkd, queue, *semaphoreA);
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.queueWaitIdle(queue));
+
+                                       submitDummySignal(vkd, queue, *semaphoreB);
+
+                                       submitDummyWait(vkd, queue, *semaphoreA);
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.queueWaitIdle(queue));
+                               }
+                               else if (transference== TRANSFERENCE_REFERENCE)
+                               {
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.queueWaitIdle(queue));
+
+                                       submitDummySignal(vkd, queue, *semaphoreA);
+                                       submitDummySignal(vkd, queue, *semaphoreB);
+
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       submitDummyWait(vkd, queue, *semaphoreA);
+                                       VK_CHECK(vkd.queueWaitIdle(queue));
+                               }
+                               else
+                                       DE_FATAL("Unknown transference.");
+                       }
+                       else
+                               DE_FATAL("Unknown permanence.");
+               }
+
+               return tcu::TestStatus::pass("Pass");
+       }
+}
+
+tcu::TestStatus testSemaphoreFdDup (Context&                                   context,
+                                                                       const SemaphoreTestConfig       config)
+{
+#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+
+               TestLog&                                                        log                     = context.getTestContext().getLog();
+               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummySignal(vkd, queue, *semaphoreA);
+
+               {
+                       const NativeHandle      fd              (getSemaphoreFd(vkd, *device, *semaphoreA, config.externalType));
+                       NativeHandle            newFd   (dup(fd.getFd()));
+
+                       if (newFd.getFd() < 0)
+                               log << TestLog::Message << "dup() failed: '" << strerror(errno) << "'" << TestLog::EndMessage;
+
+                       TCU_CHECK_MSG(newFd.getFd() >= 0, "Failed to call dup() for semaphores fd");
+
+                       {
+                               const vk::Unique<vk::VkSemaphore> semaphoreB (createAndImportSemaphore(vkd, *device, config.externalType, newFd, flags));
+
+                               if (transference == TRANSFERENCE_COPY)
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+                               else if (transference == TRANSFERENCE_REFERENCE)
+                               {
+                                       submitDummySignal(vkd, queue, *semaphoreA);
+                                       submitDummyWait(vkd, queue, *semaphoreB);
+                               }
+                               else
+                                       DE_FATAL("Unknown permanence.");
+                       }
+               }
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               return tcu::TestStatus::pass("Pass");
+       }
+#else
+       DE_UNREF(context);
+       DE_UNREF(config);
+       TCU_THROW(NotSupportedError, "Platform doesn't support dup()");
+#endif
+}
+
+tcu::TestStatus testSemaphoreFdDup2 (Context&                                  context,
+                                                                        const SemaphoreTestConfig      config)
+{
+#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+
+               TestLog&                                                        log                     = context.getTestContext().getLog();
+               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
+               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createExportableSemaphore(vkd, *device, config.externalType));
+
+               if (transference == TRANSFERENCE_COPY)
+               {
+                       submitDummySignal(vkd, queue, *semaphoreA);
+                       submitDummySignal(vkd, queue, *semaphoreB);
+               }
+
+               {
+                       const NativeHandle      fd                      (getSemaphoreFd(vkd, *device, *semaphoreA, config.externalType));
+                       NativeHandle            secondFd        (getSemaphoreFd(vkd, *device, *semaphoreB, config.externalType));
+                       int                                     newFd           (dup2(fd.getFd(), secondFd.getFd()));
+
+                       if (newFd < 0)
+                               log << TestLog::Message << "dup2() failed: '" << strerror(errno) << "'" << TestLog::EndMessage;
+
+                       TCU_CHECK_MSG(newFd >= 0, "Failed to call dup2() for fences fd");
+
+                       {
+                               const vk::Unique<vk::VkSemaphore> semaphoreC (createAndImportSemaphore(vkd, *device, config.externalType, secondFd, flags));
+
+                               if (transference == TRANSFERENCE_COPY)
+                                       submitDummyWait(vkd, queue, *semaphoreC);
+                               else if (transference == TRANSFERENCE_REFERENCE)
+                               {
+                                       submitDummySignal(vkd, queue, *semaphoreA);
+                                       submitDummyWait(vkd, queue, *semaphoreC);
+                               }
+                               else
+                                       DE_FATAL("Unknown permanence.");
+                       }
+               }
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               return tcu::TestStatus::pass("Pass");
+       }
+#else
+       DE_UNREF(context);
+       DE_UNREF(config);
+       TCU_THROW(NotSupportedError, "Platform doesn't support dup2()");
+#endif
+}
+
+tcu::TestStatus testSemaphoreFdDup3 (Context&                                  context,
+                                                                        const SemaphoreTestConfig      config)
+{
+#if (DE_OS == DE_OS_UNIX) && defined(_GNU_SOURCE)
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+
+               TestLog&                                                        log                     = context.getTestContext().getLog();
+               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
+               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createExportableSemaphore(vkd, *device, config.externalType));
+
+               if (transference == TRANSFERENCE_COPY)
+               {
+                       submitDummySignal(vkd, queue, *semaphoreA);
+                       submitDummySignal(vkd, queue, *semaphoreB);
+               }
+
+               {
+                       const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+                       const NativeHandle                                      fd                      (getSemaphoreFd(vkd, *device, *semaphoreA, config.externalType));
+                       NativeHandle                                            secondFd        (getSemaphoreFd(vkd, *device, *semaphoreB, config.externalType));
+                       const int                                                       newFd           (dup3(fd.getFd(), secondFd.getFd(), 0));
+
+                       if (newFd < 0)
+                               log << TestLog::Message << "dup3() failed: '" << strerror(errno) << "'" << TestLog::EndMessage;
+
+                       TCU_CHECK_MSG(newFd >= 0, "Failed to call dup3() for fences fd");
+
+                       {
+                               const vk::Unique<vk::VkSemaphore> semaphoreC (createAndImportSemaphore(vkd, *device, config.externalType, secondFd, flags));
+
+                               if (transference == TRANSFERENCE_COPY)
+                                       submitDummyWait(vkd, queue, *semaphoreC);
+                               else if (transference == TRANSFERENCE_REFERENCE)
+                               {
+                                       submitDummySignal(vkd, queue, *semaphoreA);
+                                       submitDummyWait(vkd, queue, *semaphoreC);
+                               }
+                               else
+                                       DE_FATAL("Unknown permanence.");
+                       }
+               }
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               return tcu::TestStatus::pass("Pass");
+       }
+#else
+       DE_UNREF(context);
+       DE_UNREF(config);
+       TCU_THROW(NotSupportedError, "Platform doesn't support dup3()");
+#endif
+}
+
+tcu::TestStatus testSemaphoreFdSendOverSocket (Context&                                                context,
+                                                                                          const SemaphoreTestConfig    config)
+{
+#if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u, 0u));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, 0u, queueFamilyIndex));
+               const vk::DeviceDriver                          vkd                     (vki, *device);
+               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+
+               TestLog&                                                        log                     = context.getTestContext().getLog();
+               const vk::Unique<vk::VkSemaphore>       semaphore       (createExportableSemaphore(vkd, *device, config.externalType));
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummySignal(vkd, queue, *semaphore);
+
+               const NativeHandle      fd      (getSemaphoreFd(vkd, *device, *semaphore, config.externalType));
+
+               {
+                       int sv[2];
+
+                       if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) != 0)
+                       {
+                               log << TestLog::Message << "Failed to create socket pair: '" << strerror(errno) << "'" << TestLog::EndMessage;
+                               TCU_FAIL("Failed to create socket pair");
+                       }
+
+                       {
+                               const NativeHandle      srcSocket       (sv[0]);
+                               const NativeHandle      dstSocket       (sv[1]);
+                               std::string                     sendData        ("deqp");
+
+                               // Send FD
+                               {
+                                       const int                       fdRaw   (fd.getFd());
+                                       msghdr                          msg;
+                                       cmsghdr*                        cmsg;
+                                       char                            buffer[CMSG_SPACE(sizeof(int))];
+                                       iovec                           iov             = { &sendData[0], sendData.length()};
+
+                                       deMemset(&msg, 0, sizeof(msg));
+
+                                       msg.msg_control         = buffer;
+                                       msg.msg_controllen      = sizeof(buffer);
+                                       msg.msg_iovlen          = 1;
+                                       msg.msg_iov                     = &iov;
+
+                                       cmsg                            = CMSG_FIRSTHDR(&msg);
+                                       cmsg->cmsg_level        = SOL_SOCKET;
+                                       cmsg->cmsg_type         = SCM_RIGHTS;
+                                       cmsg->cmsg_len          = CMSG_LEN(sizeof(int));
+
+                                       deMemcpy(CMSG_DATA(cmsg), &fdRaw, sizeof(int));
+                                       msg.msg_controllen = cmsg->cmsg_len;
+
+                                       if (sendmsg(srcSocket.getFd(), &msg, 0) < 0)
+                                       {
+                                               log << TestLog::Message << "Failed to send fd over socket: '" << strerror(errno) << "'" << TestLog::EndMessage;
+                                               TCU_FAIL("Failed to send fd over socket");
+                                       }
+                               }
+
+                               // Recv FD
+                               {
+                                       msghdr                  msg;
+                                       char                    buffer[CMSG_SPACE(sizeof(int))];
+                                       std::string             recvData        (4, '\0');
+                                       iovec                   iov                     = { &recvData[0], recvData.length() };
+
+                                       deMemset(&msg, 0, sizeof(msg));
+
+                                       msg.msg_control         = buffer;
+                                       msg.msg_controllen      = sizeof(buffer);
+                                       msg.msg_iovlen          = 1;
+                                       msg.msg_iov                     = &iov;
+
+                                       const ssize_t   bytes = recvmsg(dstSocket.getFd(), &msg, 0);
+
+                                       if (bytes < 0)
+                                       {
+                                               log << TestLog::Message << "Failed to recv fd over socket: '" << strerror(errno) << "'" << TestLog::EndMessage;
+                                               TCU_FAIL("Failed to recv fd over socket");
+
+                                       }
+                                       else if (bytes != (ssize_t)sendData.length())
+                                       {
+                                               TCU_FAIL("recvmsg() returned unpexpected number of bytes");
+                                       }
+                                       else
+                                       {
+                                               const vk::VkSemaphoreImportFlagsKHR     flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+                                               const cmsghdr* const                            cmsg    = CMSG_FIRSTHDR(&msg);
+                                               int                                                                     newFd_;
+                                               deMemcpy(&newFd_, CMSG_DATA(cmsg), sizeof(int));
+                                               NativeHandle                                            newFd   (newFd_);
+
+                                               TCU_CHECK(cmsg->cmsg_level == SOL_SOCKET);
+                                               TCU_CHECK(cmsg->cmsg_type == SCM_RIGHTS);
+                                               TCU_CHECK(cmsg->cmsg_len == CMSG_LEN(sizeof(int)));
+                                               TCU_CHECK(recvData == sendData);
+                                               TCU_CHECK_MSG(newFd.getFd() >= 0, "Didn't receive valid fd from socket");
+
+                                               {
+                                                       const vk::Unique<vk::VkSemaphore> newSemaphore (createAndImportSemaphore(vkd, *device, config.externalType, newFd, flags));
+
+                                                       if (transference == TRANSFERENCE_COPY)
+                                                               submitDummyWait(vkd, queue, *newSemaphore);
+                                                       else if (transference == TRANSFERENCE_REFERENCE)
+                                                       {
+                                                               submitDummySignal(vkd, queue, *newSemaphore);
+                                                               submitDummyWait(vkd, queue, *newSemaphore);
+                                                       }
+                                                       else
+                                                               DE_FATAL("Unknown permanence.");
+
+                                                       VK_CHECK(vkd.queueWaitIdle(queue));
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return tcu::TestStatus::pass("Pass");
+#else
+       DE_UNREF(context);
+       DE_UNREF(config);
+       TCU_THROW(NotSupportedError, "Platform doesn't support sending file descriptors over socket");
+#endif
+}
+
+tcu::TestStatus testFenceQueries (Context& context, vk::VkExternalFenceHandleTypeFlagBitsKHR externalType)
+{
+       const vk::PlatformInterface&            vkp                             (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                (createInstance(vkp, 0u, 0u, externalType));
+       const vk::InstanceDriver                        vki                             (vkp, *instance);
+       const vk::VkPhysicalDevice                      device                  (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+
+       TestLog&                                                        log                             = context.getTestContext().getLog();
+
+       const vk::VkPhysicalDeviceExternalFenceInfoKHR  info                    =
+       {
+               vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR,
+               DE_NULL,
+               externalType
+       };
+       vk::VkExternalFencePropertiesKHR                                properties      =
+       {
+               vk::VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR,
+               DE_NULL,
+               0u,
+               0u,
+               0u
+       };
+
+       vki.getPhysicalDeviceExternalFencePropertiesKHR(device, &info, &properties);
+       log << TestLog::Message << properties << TestLog::EndMessage;
+
+       TCU_CHECK(properties.pNext == DE_NULL);
+       TCU_CHECK(properties.sType == vk::VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR);
+
+       return tcu::TestStatus::pass("Pass");
+}
+
+struct FenceTestConfig
+{
+                                                                                               FenceTestConfig (vk::VkExternalFenceHandleTypeFlagBitsKHR       externalType_,
+                                                                                                                                Permanence                                                                     permanence_)
+               : externalType          (externalType_)
+               , permanence            (permanence_)
+       {
+       }
+
+       vk::VkExternalFenceHandleTypeFlagBitsKHR        externalType;
+       Permanence                                                                      permanence;
+};
+
+
+tcu::TestStatus testFenceWin32Create (Context&                         context,
+                                                                         const FenceTestConfig config)
+{
+#if (DE_OS == DE_OS_WIN32)
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkFenceSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::Unique<vk::VkDevice>                          device                  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                                          vkd                             (vki, *device);
+               const vk::VkQueue                                                       queue                   (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::VkExportFenceWin32HandleInfoKHR       win32ExportInfo =
+               {
+                       vk::VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR,
+                       DE_NULL,
+
+                       (vk::pt::Win32SecurityAttributesPtr)DE_NULL,
+                       DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE,
+                       DE_NULL
+               };
+               const vk::VkExportFenceCreateInfoKHR            exportCreateInfo=
+               {
+                       vk::VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR,
+                       &win32ExportInfo,
+                       (vk::VkExternalFenceHandleTypeFlagsKHR)config.externalType
+               };
+               const vk::VkFenceCreateInfo                                     createInfo              =
+               {
+                       vk::VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
+                       &exportCreateInfo,
+                       0u
+               };
+               const vk::Unique<vk::VkFence>                           fence           (vk::createFence(vkd, *device, &createInfo));
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummySignal(vkd, queue, *fence);
+
+               NativeHandle                                            handleA;
+               getFenceNative(vkd, *device, *fence, config.externalType, handleA);
+
+               {
+                       const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+                       const vk::Unique<vk::VkFence>   fenceA  (createAndImportFence(vkd, *device, config.externalType, handleA, flags));
+
+                       if (transference == TRANSFERENCE_COPY)
+                               VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
+                       else if (transference == TRANSFERENCE_REFERENCE)
+                       {
+                               submitDummySignal(vkd, queue, *fence);
+                               VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
+                       }
+                       else
+                               DE_FATAL("Unknown transference.");
+
+                       VK_CHECK(vkd.queueWaitIdle(queue));
+               }
+
+               return tcu::TestStatus::pass("Pass");
+       }
+#else
+       DE_UNREF(context);
+       DE_UNREF(config);
+       TCU_THROW(NotSupportedError, "Platform doesn't support win32 handles");
+#endif
+}
+
+tcu::TestStatus testFenceImportTwice (Context&                         context,
+                                                                         const FenceTestConfig config)
+{
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkFenceSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::Unique<vk::VkDevice>  device          (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd                     (vki, *device);
+               const vk::VkQueue                               queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::Unique<vk::VkFence>   fence           (createExportableFence(vkd, *device, config.externalType));
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummySignal(vkd, queue, *fence);
+
+               NativeHandle                                            handleA;
+               getFenceNative(vkd, *device, *fence, config.externalType, handleA);
+
+               {
+                       NativeHandle                                    handleB (handleA);
+                       const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+                       const vk::Unique<vk::VkFence>   fenceA  (createAndImportFence(vkd, *device, config.externalType, handleA, flags));
+                       const vk::Unique<vk::VkFence>   fenceB  (createAndImportFence(vkd, *device, config.externalType, handleB, flags));
+
+                       if (transference == TRANSFERENCE_COPY)
+                               VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
+                       else if (transference == TRANSFERENCE_REFERENCE)
+                       {
+                               submitDummySignal(vkd, queue, *fenceA);
+                               VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
+                       }
+                       else
+                               DE_FATAL("Unknown transference.");
+
+                       VK_CHECK(vkd.queueWaitIdle(queue));
+               }
+
+               return tcu::TestStatus::pass("Pass");
+       }
+}
+
+tcu::TestStatus testFenceImportReimport (Context&                              context,
+                                                                                const FenceTestConfig  config)
+{
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkFenceSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
+
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
+
+               if (transference == TRANSFERENCE_COPY)
+                       submitDummySignal(vkd, queue, *fenceA);
+
+               NativeHandle                                    handleA;
+               getFenceNative(vkd, *device, *fenceA, config.externalType, handleA);
+
+               NativeHandle                                    handleB (handleA);
+               const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkFence>   fenceB  (createAndImportFence(vkd, *device, config.externalType, handleA, flags));
+
+               importFence(vkd, *device, *fenceB, config.externalType, handleB, flags);
+
+               if (transference == TRANSFERENCE_COPY)
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
+               else if (transference == TRANSFERENCE_REFERENCE)
+               {
+                       submitDummySignal(vkd, queue, *fenceA);
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
+               }
+               else
+                       DE_FATAL("Unknown transference.");
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               return tcu::TestStatus::pass("Pass");
+       }
+}
+
+tcu::TestStatus testFenceSignalExportImportWait (Context&                              context,
+                                                                                                const FenceTestConfig  config)
+{
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkFenceSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
+
+               submitDummySignal(vkd, queue, *fenceA);
+
+               {
+                       NativeHandle    handle;
+
+                       getFenceNative(vkd, *device, *fenceA, config.externalType, handle);
+
+                       {
+                               const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+                               const vk::Unique<vk::VkFence>   fenceB  (createAndImportFence(vkd, *device, config.externalType, handle, flags));
+                               VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
+
+                               VK_CHECK(vkd.queueWaitIdle(queue));
+                       }
+               }
+
+               return tcu::TestStatus::pass("Pass");
+       }
+}
+
+tcu::TestStatus testFenceExportSignalImportWait (Context&                              context,
+                                                                                                const FenceTestConfig  config)
 {
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::VkSemaphoreImportFlagsKHR     flags                           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+       const vk::VkFenceImportFlagsKHR         flags                           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
 
        DE_ASSERT(getHandelTypeTransferences(config.externalType) == TRANSFERENCE_REFERENCE);
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device                          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                                     (vki, *device);
-               const vk::VkQueue                                       queue                           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
-               const vk::Unique<vk::VkSemaphore>       semaphoreA                      (createExportableSemaphore(vkd, *device, config.externalType));
-               NativeHandle                                            handle;
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
+               NativeHandle                                    handle;
 
-               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+               getFenceNative(vkd, *device, *fenceA, config.externalType, handle);
 
-               submitDummySignal(vkd, queue, *semaphoreA);
+               submitDummySignal(vkd, queue, *fenceA);
                {
                        {
-                               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createAndImportSemaphore(vkd, *device, config.externalType, handle, flags));
+                               const vk::Unique<vk::VkFence>   fenceB  (createAndImportFence(vkd, *device, config.externalType, handle, flags));
 
-                               submitDummyWait(vkd, queue, *semaphoreB);
+                               VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                VK_CHECK(vkd.queueWaitIdle(queue));
                        }
                }
@@ -757,33 +1757,33 @@ tcu::TestStatus testSemaphoreExportSignalImportWait (Context&                                    context,
        }
 }
 
-tcu::TestStatus testSemaphoreExportImportSignalWait (Context&                                  context,
-                                                                                                        const SemaphoreTestConfig      config)
+tcu::TestStatus testFenceExportImportSignalWait (Context&                              context,
+                                                                                                const FenceTestConfig  config)
 {
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        DE_ASSERT(getHandelTypeTransferences(config.externalType) == TRANSFERENCE_REFERENCE);
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::VkFenceImportFlagsKHR flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>  device          (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd                     (vki, *device);
+               const vk::VkQueue                               queue           (getQueue(vkd, *device, queueFamilyIndex));
 
-               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
-               NativeHandle                                            handle;
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
+               NativeHandle                                    handle;
 
-               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+               getFenceNative(vkd, *device, *fenceA, config.externalType, handle);
 
-               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createAndImportSemaphore(vkd, *device, config.externalType, handle, flags));
+               const vk::Unique<vk::VkFence>   fenceB  (createAndImportFence(vkd, *device, config.externalType, handle, flags));
 
-               submitDummySignal(vkd, queue, *semaphoreA);
-               submitDummyWait(vkd, queue, *semaphoreB);
+               submitDummySignal(vkd, queue, *fenceA);
+               VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
 
                VK_CHECK(vkd.queueWaitIdle(queue));
 
@@ -791,44 +1791,44 @@ tcu::TestStatus testSemaphoreExportImportSignalWait (Context&                                    context,
        }
 }
 
-tcu::TestStatus testSemaphoreSignalImport (Context&                                            context,
-                                                                                  const SemaphoreTestConfig    config)
+tcu::TestStatus testFenceSignalImport (Context&                                        context,
+                                                                          const FenceTestConfig        config)
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
-               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
-               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createSemaphore(vkd, *device));
-               NativeHandle                                            handle;
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
+               const vk::Unique<vk::VkFence>   fenceB  (createFence(vkd, *device));
+               NativeHandle                                    handle;
 
-               submitDummySignal(vkd, queue, *semaphoreB);
+               submitDummySignal(vkd, queue, *fenceB);
                VK_CHECK(vkd.queueWaitIdle(queue));
 
                if (transference == TRANSFERENCE_COPY)
-                       submitDummySignal(vkd, queue, *semaphoreA);
+                       submitDummySignal(vkd, queue, *fenceA);
 
-               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+               getFenceNative(vkd, *device, *fenceA, config.externalType, handle);
 
-               importSemaphore(vkd, *device, *semaphoreB, config.externalType, handle, flags);
+               importFence(vkd, *device, *fenceB, config.externalType, handle, flags);
 
                if (transference == TRANSFERENCE_COPY)
-                       submitDummyWait(vkd, queue, *semaphoreB);
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                else if (transference == TRANSFERENCE_REFERENCE)
                {
-                       submitDummySignal(vkd, queue, *semaphoreA);
-                       submitDummyWait(vkd, queue, *semaphoreB);
+                       submitDummySignal(vkd, queue, *fenceA);
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                }
                else
                        DE_FATAL("Unknown transference.");
@@ -839,46 +1839,112 @@ tcu::TestStatus testSemaphoreSignalImport (Context&                                             context,
        }
 }
 
-tcu::TestStatus testSemaphoreSignalWaitImport (Context&                                                context,
-                                                                                          const SemaphoreTestConfig    config)
+tcu::TestStatus testFenceReset (Context&                               context,
+                                                               const FenceTestConfig   config)
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
-               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
-               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createSemaphore(vkd, *device));
-               NativeHandle                                            handle;
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
+               const vk::Unique<vk::VkFence>   fenceB  (createFence(vkd, *device));
+               const vk::Unique<vk::VkFence>   fenceC  (createFence(vkd, *device));
+               NativeHandle                                    handle;
+
+               submitDummySignal(vkd, queue, *fenceB);
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               submitDummySignal(vkd, queue, *fenceA);
+
+               getFenceNative(vkd, *device, *fenceA, config.externalType, handle);
+               importFence(vkd, *device, *fenceB, config.externalType, handle, flags);
+               importFence(vkd, *device, *fenceC, config.externalType, handle, flags);
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+               VK_CHECK(vkd.resetFences(*device, 1u, &*fenceB));
+
+               if (config.permanence == PERMANENCE_TEMPORARY || transference == TRANSFERENCE_COPY)
+               {
+                       // vkResetFences() should restore fenceBs prior payload and reset that no affecting fenceCs payload
+                       // or fenceB should be separate copy of the payload and not affect fenceC
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceC, VK_TRUE, ~0ull));
+
+                       // vkResetFences() should have restored fenceBs prior state and should be now reset
+                       // or fenceB should have it's separate payload
+                       submitDummySignal(vkd, queue, *fenceB);
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
+               }
+               else if (config.permanence == PERMANENCE_PERMANENT)
+               {
+                       DE_ASSERT(transference == TRANSFERENCE_REFERENCE);
+
+                       // Reset fences should have reset all of the fences
+                       submitDummySignal(vkd, queue, *fenceC);
+
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceC, VK_TRUE, ~0ull));
+               }
+               else
+                       DE_FATAL("Unknown permanence");
+
+               VK_CHECK(vkd.queueWaitIdle(queue));
+
+               return tcu::TestStatus::pass("Pass");
+       }
+}
+
+tcu::TestStatus testFenceSignalWaitImport (Context&                                    context,
+                                                                                  const FenceTestConfig        config)
+{
+       const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
+       const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
+       const vk::InstanceDriver                        vki                                     (vkp, *instance);
+       const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
+       const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
+
+       checkFenceSupport(vki, physicalDevice, config.externalType);
+
+       {
+               const vk::VkFenceImportFlagsKHR flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>  device          (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd                     (vki, *device);
+               const vk::VkQueue                               queue           (getQueue(vkd, *device, queueFamilyIndex));
+
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
+               const vk::Unique<vk::VkFence>   fenceB  (createFence(vkd, *device));
+               NativeHandle                                    handle;
 
                if (transference == TRANSFERENCE_COPY)
-                       submitDummySignal(vkd, queue, *semaphoreA);
+                       submitDummySignal(vkd, queue, *fenceA);
 
-               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+               getFenceNative(vkd, *device, *fenceA, config.externalType, handle);
 
-               submitDummySignal(vkd, queue, *semaphoreB);
-               submitDummyWait(vkd, queue, *semaphoreB);
+               submitDummySignal(vkd, queue, *fenceB);
+               VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
 
                VK_CHECK(vkd.queueWaitIdle(queue));
 
-               importSemaphore(vkd, *device, *semaphoreB, config.externalType, handle, flags);
+               importFence(vkd, *device, *fenceB, config.externalType, handle, flags);
 
                if (transference == TRANSFERENCE_COPY)
-                       submitDummyWait(vkd, queue, *semaphoreB);
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                else if (transference == TRANSFERENCE_REFERENCE)
                {
-                       submitDummySignal(vkd, queue, *semaphoreA);
-                       submitDummyWait(vkd, queue, *semaphoreB);
+                       submitDummySignal(vkd, queue, *fenceA);
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                }
                else
                        DE_FATAL("Unknown transference.");
@@ -889,37 +1955,37 @@ tcu::TestStatus testSemaphoreSignalWaitImport (Context&                                          context,
        }
 }
 
-tcu::TestStatus testSemaphoreMultipleExports (Context&                                 context,
-                                                                                         const SemaphoreTestConfig     config)
+tcu::TestStatus testFenceMultipleExports (Context&                             context,
+                                                                                 const FenceTestConfig config)
 {
        const size_t                                            exportCount                     = 4 * 1024;
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
-               const vk::Unique<vk::VkSemaphore>       semaphore       (createExportableSemaphore(vkd, *device, config.externalType));
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::Unique<vk::VkFence>   fence   (createExportableFence(vkd, *device, config.externalType));
 
                for (size_t exportNdx = 0; exportNdx < exportCount; exportNdx++)
                {
                        NativeHandle handle;
 
                        if (transference == TRANSFERENCE_COPY)
-                               submitDummySignal(vkd, queue, *semaphore);
+                               submitDummySignal(vkd, queue, *fence);
 
-                       getSemaphoreNative(vkd, *device, *semaphore, config.externalType, handle);
+                       getFenceNative(vkd, *device, *fence, config.externalType, handle);
                }
 
-               submitDummySignal(vkd, queue, *semaphore);
-               submitDummyWait(vkd, queue, *semaphore);
+               submitDummySignal(vkd, queue, *fence);
+               VK_CHECK(vkd.waitForFences(*device, 1u, &*fence, VK_TRUE, ~0ull));
 
                VK_CHECK(vkd.queueWaitIdle(queue));
        }
@@ -927,47 +1993,47 @@ tcu::TestStatus testSemaphoreMultipleExports (Context&                                   context,
        return tcu::TestStatus::pass("Pass");
 }
 
-tcu::TestStatus testSemaphoreMultipleImports (Context&                                 context,
-                                                                                         const SemaphoreTestConfig     config)
+tcu::TestStatus testFenceMultipleImports (Context&                             context,
+                                                                                 const FenceTestConfig config)
 {
        const size_t                                            importCount                     = 4 * 1024;
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
-               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
-               NativeHandle                                            handleA;
+               const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
+               NativeHandle                                    handleA;
 
                if (transference == TRANSFERENCE_COPY)
-                       submitDummySignal(vkd, queue, *semaphoreA);
+                       submitDummySignal(vkd, queue, *fenceA);
 
-               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handleA);
+               getFenceNative(vkd, *device, *fenceA, config.externalType, handleA);
 
                for (size_t importNdx = 0; importNdx < importCount; importNdx++)
                {
-                       NativeHandle                                            handleB         (handleA);
-                       const vk::Unique<vk::VkSemaphore>       semaphoreB      (createAndImportSemaphore(vkd, *device, config.externalType, handleB, flags));
+                       NativeHandle                                    handleB         (handleA);
+                       const vk::Unique<vk::VkFence>   fenceB  (createAndImportFence(vkd, *device, config.externalType, handleB, flags));
                }
 
                if (transference == TRANSFERENCE_COPY)
                {
-                       importSemaphore(vkd, *device, *semaphoreA, config.externalType, handleA, flags);
-                       submitDummyWait(vkd, queue, *semaphoreA);
+                       importFence(vkd, *device, *fenceA, config.externalType, handleA, flags);
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
                }
                else if (transference == TRANSFERENCE_REFERENCE)
                {
-                       submitDummySignal(vkd, queue, *semaphoreA);
-                       submitDummyWait(vkd, queue, *semaphoreA);
+                       submitDummySignal(vkd, queue, *fenceA);
+                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
                }
                else
                        DE_FATAL("Unknown transference.");
@@ -978,58 +2044,61 @@ tcu::TestStatus testSemaphoreMultipleImports (Context&                                   context,
        return tcu::TestStatus::pass("Pass");
 }
 
-tcu::TestStatus testSemaphoreTransference (Context&                                            context,
-                                                                                  const SemaphoreTestConfig    config)
+tcu::TestStatus testFenceTransference (Context&                                        context,
+                                                                          const FenceTestConfig        config)
 {
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
-               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
-               NativeHandle                                            handle;
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
+               NativeHandle                                    handle;
 
-               submitDummySignal(vkd, queue, *semaphoreA);
+               submitDummySignal(vkd, queue, *fenceA);
 
-               getSemaphoreNative(vkd, *device, *semaphoreA, config.externalType, handle);
+               getFenceNative(vkd, *device, *fenceA, config.externalType, handle);
 
                {
-                       const vk::Unique<vk::VkSemaphore>       semaphoreB                      (createAndImportSemaphore(vkd, *device, config.externalType, handle, flags));
+                       const vk::Unique<vk::VkFence>   fenceB  (createAndImportFence(vkd, *device, config.externalType, handle, flags));
 
                        if (config.permanence == PERMANENCE_PERMANENT)
                        {
                                if (transference == TRANSFERENCE_COPY)
                                {
-                                       submitDummySignal(vkd, queue, *semaphoreA);
-                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       submitDummySignal(vkd, queue, *fenceA);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                        VK_CHECK(vkd.queueWaitIdle(queue));
 
-                                       submitDummySignal(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.resetFences(*device, 1u, &*fenceB));
+                                       submitDummySignal(vkd, queue, *fenceB);
 
-                                       submitDummyWait(vkd, queue, *semaphoreA);
-                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                        VK_CHECK(vkd.queueWaitIdle(queue));
                                }
                                else if (transference== TRANSFERENCE_REFERENCE)
                                {
-                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                        VK_CHECK(vkd.queueWaitIdle(queue));
 
-                                       submitDummySignal(vkd, queue, *semaphoreA);
-                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.resetFences(*device, 1u, &*fenceB));
+                                       submitDummySignal(vkd, queue, *fenceA);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
 
-                                       submitDummySignal(vkd, queue, *semaphoreB);
-                                       submitDummyWait(vkd, queue, *semaphoreA);
+                                       VK_CHECK(vkd.resetFences(*device, 1u, &*fenceA));
+                                       submitDummySignal(vkd, queue, *fenceB);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
                                        VK_CHECK(vkd.queueWaitIdle(queue));
                                }
                                else
@@ -1039,26 +2108,29 @@ tcu::TestStatus testSemaphoreTransference (Context&                                             context,
                        {
                                if (transference == TRANSFERENCE_COPY)
                                {
-                                       submitDummySignal(vkd, queue, *semaphoreA);
-                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       submitDummySignal(vkd, queue, *fenceA);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                        VK_CHECK(vkd.queueWaitIdle(queue));
 
-                                       submitDummySignal(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.resetFences(*device, 1u, &*fenceA));
+                                       submitDummySignal(vkd, queue, *fenceB);
 
-                                       submitDummyWait(vkd, queue, *semaphoreA);
-                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                        VK_CHECK(vkd.queueWaitIdle(queue));
                                }
-                               else if (transference== TRANSFERENCE_REFERENCE)
+                               else if (transference == TRANSFERENCE_REFERENCE)
                                {
-                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                        VK_CHECK(vkd.queueWaitIdle(queue));
 
-                                       submitDummySignal(vkd, queue, *semaphoreA);
-                                       submitDummySignal(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.resetFences(*device, 1u, &*fenceA));
+                                       VK_CHECK(vkd.resetFences(*device, 1u, &*fenceB));
+                                       submitDummySignal(vkd, queue, *fenceA);
+                                       submitDummySignal(vkd, queue, *fenceB);
 
-                                       submitDummyWait(vkd, queue, *semaphoreB);
-                                       submitDummyWait(vkd, queue, *semaphoreA);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceA, VK_TRUE, ~0ull));
                                        VK_CHECK(vkd.queueWaitIdle(queue));
                                }
                                else
@@ -1072,49 +2144,49 @@ tcu::TestStatus testSemaphoreTransference (Context&                                             context,
        }
 }
 
-tcu::TestStatus testSemaphoreFdDup (Context&                                   context,
-                                                                       const SemaphoreTestConfig       config)
+tcu::TestStatus testFenceFdDup (Context&                               context,
+                                                               const FenceTestConfig   config)
 {
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
-               TestLog&                                                        log                     = context.getTestContext().getLog();
-               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
+               TestLog&                                                log             = context.getTestContext().getLog();
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
 
                if (transference == TRANSFERENCE_COPY)
-                       submitDummySignal(vkd, queue, *semaphoreA);
+                       submitDummySignal(vkd, queue, *fenceA);
 
                {
-                       const NativeHandle      fd              (getSemaphoreFd(vkd, *device, *semaphoreA, config.externalType));
+                       const NativeHandle      fd              (getFenceFd(vkd, *device, *fenceA, config.externalType));
                        NativeHandle            newFd   (dup(fd.getFd()));
 
                        if (newFd.getFd() < 0)
                                log << TestLog::Message << "dup() failed: '" << strerror(errno) << "'" << TestLog::EndMessage;
 
-                       TCU_CHECK_MSG(newFd.getFd() >= 0, "Failed to call dup() for semaphores fd");
+                       TCU_CHECK_MSG(newFd.getFd() >= 0, "Failed to call dup() for fences fd");
 
                        {
-                               const vk::Unique<vk::VkSemaphore> semaphoreB (createAndImportSemaphore(vkd, *device, config.externalType, newFd, flags));
+                               const vk::Unique<vk::VkFence> fenceB (createAndImportFence(vkd, *device, config.externalType, newFd, flags));
 
                                if (transference == TRANSFERENCE_COPY)
-                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                else if (transference == TRANSFERENCE_REFERENCE)
                                {
-                                       submitDummySignal(vkd, queue, *semaphoreA);
-                                       submitDummyWait(vkd, queue, *semaphoreB);
+                                       submitDummySignal(vkd, queue, *fenceA);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                }
                                else
                                        DE_FATAL("Unknown permanence.");
@@ -1132,54 +2204,50 @@ tcu::TestStatus testSemaphoreFdDup (Context&                                    context,
 #endif
 }
 
-tcu::TestStatus testSemaphoreFdDup2 (Context&                                  context,
-                                                                        const SemaphoreTestConfig      config)
+tcu::TestStatus testFenceFdDup2 (Context&                              context,
+                                                                const FenceTestConfig  config)
 {
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
-               TestLog&                                                        log                     = context.getTestContext().getLog();
-               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
-               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createExportableSemaphore(vkd, *device, config.externalType));
+               TestLog&                                                log             = context.getTestContext().getLog();
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
 
                if (transference == TRANSFERENCE_COPY)
-               {
-                       submitDummySignal(vkd, queue, *semaphoreA);
-                       submitDummySignal(vkd, queue, *semaphoreB);
-               }
+                       submitDummySignal(vkd, queue, *fenceA);
 
                {
-                       const NativeHandle      fd                      (getSemaphoreFd(vkd, *device, *semaphoreA, config.externalType));
-                       NativeHandle            secondFd        (getSemaphoreFd(vkd, *device, *semaphoreB, config.externalType));
+                       const NativeHandle      fd                      (getFenceFd(vkd, *device, *fenceA, config.externalType));
+                       NativeHandle            secondFd        (getFenceFd(vkd, *device, *fenceA, config.externalType));
                        int                                     newFd           (dup2(fd.getFd(), secondFd.getFd()));
 
                        if (newFd < 0)
                                log << TestLog::Message << "dup2() failed: '" << strerror(errno) << "'" << TestLog::EndMessage;
 
-                       TCU_CHECK_MSG(newFd >= 0, "Failed to call dup2() for semaphores fd");
+                       TCU_CHECK_MSG(newFd >= 0, "Failed to call dup2() for fences fd");
 
                        {
-                               const vk::Unique<vk::VkSemaphore> semaphoreC (createAndImportSemaphore(vkd, *device, config.externalType, secondFd, flags));
+                               const vk::Unique<vk::VkFence> fenceB (createAndImportFence(vkd, *device, config.externalType, secondFd, flags));
 
                                if (transference == TRANSFERENCE_COPY)
-                                       submitDummyWait(vkd, queue, *semaphoreC);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                else if (transference == TRANSFERENCE_REFERENCE)
                                {
-                                       submitDummySignal(vkd, queue, *semaphoreA);
-                                       submitDummyWait(vkd, queue, *semaphoreC);
+                                       submitDummySignal(vkd, queue, *fenceA);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                }
                                else
                                        DE_FATAL("Unknown permanence.");
@@ -1197,54 +2265,50 @@ tcu::TestStatus testSemaphoreFdDup2 (Context&                                   context,
 #endif
 }
 
-tcu::TestStatus testSemaphoreFdDup3 (Context&                                  context,
-                                                                        const SemaphoreTestConfig      config)
+tcu::TestStatus testFenceFdDup3 (Context&                              context,
+                                                                const FenceTestConfig  config)
 {
 #if (DE_OS == DE_OS_UNIX) && defined(_GNU_SOURCE)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
-               TestLog&                                                        log                     = context.getTestContext().getLog();
-               const vk::Unique<vk::VkSemaphore>       semaphoreA      (createExportableSemaphore(vkd, *device, config.externalType));
-               const vk::Unique<vk::VkSemaphore>       semaphoreB      (createExportableSemaphore(vkd, *device, config.externalType));
+               TestLog&                                                log             = context.getTestContext().getLog();
+               const vk::Unique<vk::VkFence>   fenceA  (createExportableFence(vkd, *device, config.externalType));
 
                if (transference == TRANSFERENCE_COPY)
-               {
-                       submitDummySignal(vkd, queue, *semaphoreA);
-                       submitDummySignal(vkd, queue, *semaphoreB);
-               }
+                       submitDummySignal(vkd, queue, *fenceA);
 
                {
-                       const vk::VkSemaphoreImportFlagsKHR     flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
-                       const NativeHandle                                      fd                      (getSemaphoreFd(vkd, *device, *semaphoreA, config.externalType));
-                       NativeHandle                                            secondFd        (getSemaphoreFd(vkd, *device, *semaphoreB, config.externalType));
-                       const int                                                       newFd           (dup3(fd.getFd(), secondFd.getFd(), 0));
+                       const vk::VkFenceImportFlagsKHR flags           = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
+                       const NativeHandle                              fd                      (getFenceFd(vkd, *device, *fenceA, config.externalType));
+                       NativeHandle                                    secondFd        (getFenceFd(vkd, *device, *fenceA, config.externalType));
+                       const int                                               newFd           (dup3(fd.getFd(), secondFd.getFd(), 0));
 
                        if (newFd < 0)
                                log << TestLog::Message << "dup3() failed: '" << strerror(errno) << "'" << TestLog::EndMessage;
 
-                       TCU_CHECK_MSG(newFd >= 0, "Failed to call dup3() for semaphores fd");
+                       TCU_CHECK_MSG(newFd >= 0, "Failed to call dup3() for fences fd");
 
                        {
-                               const vk::Unique<vk::VkSemaphore> semaphoreC (createAndImportSemaphore(vkd, *device, config.externalType, secondFd, flags));
+                               const vk::Unique<vk::VkFence> fenceB (createAndImportFence(vkd, *device, config.externalType, secondFd, flags));
 
                                if (transference == TRANSFERENCE_COPY)
-                                       submitDummyWait(vkd, queue, *semaphoreC);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                else if (transference == TRANSFERENCE_REFERENCE)
                                {
-                                       submitDummySignal(vkd, queue, *semaphoreA);
-                                       submitDummyWait(vkd, queue, *semaphoreC);
+                                       submitDummySignal(vkd, queue, *fenceA);
+                                       VK_CHECK(vkd.waitForFences(*device, 1u, &*fenceB, VK_TRUE, ~0ull));
                                }
                                else
                                        DE_FATAL("Unknown permanence.");
@@ -1262,31 +2326,31 @@ tcu::TestStatus testSemaphoreFdDup3 (Context&                                   context,
 #endif
 }
 
-tcu::TestStatus testSemaphoreFdSendOverSocket (Context&                                                context,
-                                                                                          const SemaphoreTestConfig    config)
+tcu::TestStatus testFenceFdSendOverSocket (Context&                                    context,
+                                                                                  const FenceTestConfig        config)
 {
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const Transference                                      transference            (getHandelTypeTransferences(config.externalType));
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, config.externalType, 0u));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, 0u, config.externalType));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
-       checkSemaphoreSupport(vki, physicalDevice, config.externalType);
+       checkFenceSupport(vki, physicalDevice, config.externalType);
 
        {
-               const vk::Unique<vk::VkDevice>          device          (createDevice(vki, physicalDevice, config.externalType, 0u, queueFamilyIndex));
-               const vk::DeviceDriver                          vkd                     (vki, *device);
-               const vk::VkQueue                                       queue           (getQueue(vkd, *device, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>  device  (createDevice(vki, physicalDevice, 0u, 0u, config.externalType, queueFamilyIndex));
+               const vk::DeviceDriver                  vkd             (vki, *device);
+               const vk::VkQueue                               queue   (getQueue(vkd, *device, queueFamilyIndex));
 
-               TestLog&                                                        log                     = context.getTestContext().getLog();
-               const vk::Unique<vk::VkSemaphore>       semaphore       (createExportableSemaphore(vkd, *device, config.externalType));
+               TestLog&                                                log             = context.getTestContext().getLog();
+               const vk::Unique<vk::VkFence>   fence   (createExportableFence(vkd, *device, config.externalType));
 
                if (transference == TRANSFERENCE_COPY)
-                       submitDummySignal(vkd, queue, *semaphore);
+                       submitDummySignal(vkd, queue, *fence);
 
-               const NativeHandle      fd      (getSemaphoreFd(vkd, *device, *semaphore, config.externalType));
+               const NativeHandle      fd      (getFenceFd(vkd, *device, *fence, config.externalType));
 
                {
                        int sv[2];
@@ -1360,7 +2424,7 @@ tcu::TestStatus testSemaphoreFdSendOverSocket (Context&                                           context,
                                        }
                                        else
                                        {
-                                               const vk::VkSemaphoreImportFlagsKHR     flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkSemaphoreImportFlagBitsKHR)0u;
+                                               const vk::VkFenceImportFlagsKHR flags   = config.permanence == PERMANENCE_TEMPORARY ? vk::VK_FENCE_IMPORT_TEMPORARY_BIT_KHR : (vk::VkFenceImportFlagBitsKHR)0u;
                                                const cmsghdr* const                            cmsg    = CMSG_FIRSTHDR(&msg);
                                                int                                                                     newFd_;
                                                deMemcpy(&newFd_, CMSG_DATA(cmsg), sizeof(int));
@@ -1373,14 +2437,14 @@ tcu::TestStatus testSemaphoreFdSendOverSocket (Context&                                         context,
                                                TCU_CHECK_MSG(newFd.getFd() >= 0, "Didn't receive valid fd from socket");
 
                                                {
-                                                       const vk::Unique<vk::VkSemaphore> newSemaphore (createAndImportSemaphore(vkd, *device, config.externalType, newFd, flags));
+                                                       const vk::Unique<vk::VkFence> newFence (createAndImportFence(vkd, *device, config.externalType, newFd, flags));
 
                                                        if (transference == TRANSFERENCE_COPY)
-                                                               submitDummyWait(vkd, queue, *newSemaphore);
+                                                               VK_CHECK(vkd.waitForFences(*device, 1u, &*newFence, VK_TRUE, ~0ull));
                                                        else if (transference == TRANSFERENCE_REFERENCE)
                                                        {
-                                                               submitDummySignal(vkd, queue, *newSemaphore);
-                                                               submitDummyWait(vkd, queue, *newSemaphore);
+                                                               submitDummySignal(vkd, queue, *newFence);
+                                                               VK_CHECK(vkd.waitForFences(*device, 1u, &*newFence, VK_TRUE, ~0ull));
                                                        }
                                                        else
                                                                DE_FATAL("Unknown permanence.");
@@ -1423,7 +2487,7 @@ tcu::TestStatus testBufferQueries (Context& context, vk::VkExternalMemoryHandleT
                vk::VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
        };
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, externalType));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, externalType, 0u));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const vk::VkPhysicalDeviceFeatures      deviceFeatures          (vk::getPhysicalDeviceFeatures(vki, physicalDevice));
@@ -1485,7 +2549,7 @@ tcu::TestStatus testBufferQueries (Context& context, vk::VkExternalMemoryHandleT
                                // \note We need to re-create with dedicated mem extensions if previous device instance didn't have them
                                try
                                {
-                                       device                          = createDevice(vki, physicalDevice, 0u, externalType, queueFamilyIndex, requiresDedicated);
+                                       device                          = createDevice(vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
                                        vkd                                     = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vki, *device));
                                        deviceHasDedicated      = requiresDedicated;
                                }
@@ -1556,11 +2620,11 @@ tcu::TestStatus testMemoryWin32Create (Context& context, MemoryTestConfig config
 {
 #if (DE_OS == DE_OS_WIN32)
        const vk::PlatformInterface&                            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                        instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                        instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                          device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex));
+       const vk::Unique<vk::VkDevice>                          device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
        const vk::DeviceDriver                                          vkd                                     (vki, *device);
        const vk::VkBufferUsageFlags                            usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const deUint32                                                          seed                            = 1261033864u;
@@ -1635,11 +2699,11 @@ tcu::TestStatus testMemoryWin32Create (Context& context, MemoryTestConfig config
 tcu::TestStatus testMemoryImportTwice (Context& context, MemoryTestConfig config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex));
+       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
        const vk::DeviceDriver                                  vkd                                     (vki, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const deUint32                                                  seed                            = 1261033864u;
@@ -1687,11 +2751,11 @@ tcu::TestStatus testMemoryMultimpleImports (Context& context, MemoryTestConfig c
 {
        const size_t                                                    count                           = 4 * 1024;
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex));
+       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
        const vk::DeviceDriver                                  vkd                                     (vki, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
@@ -1719,11 +2783,11 @@ tcu::TestStatus testMemoryMultimpleExports (Context& context, MemoryTestConfig c
 {
        const size_t                                                    count                           = 4 * 1024;
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex));
+       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
        const vk::DeviceDriver                                  vkd                                     (vki, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
@@ -1748,13 +2812,13 @@ tcu::TestStatus testMemoryFdDup (Context& context, MemoryTestConfig config)
 {
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        {
-               const vk::Unique<vk::VkDevice>                  device                  (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>                  device                  (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
                const vk::DeviceDriver                                  vkd                             (vki, *device);
 
                TestLog&                                                                log                             = context.getTestContext().getLog();
@@ -1808,13 +2872,13 @@ tcu::TestStatus testMemoryFdDup2 (Context& context, MemoryTestConfig config)
 {
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        {
-               const vk::Unique<vk::VkDevice>                  device                  (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>                  device                  (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
                const vk::DeviceDriver                                  vkd                             (vki, *device);
 
                TestLog&                                                                log                             = context.getTestContext().getLog();
@@ -1869,13 +2933,13 @@ tcu::TestStatus testMemoryFdDup3 (Context& context, MemoryTestConfig config)
 {
 #if (DE_OS == DE_OS_UNIX) && defined(_GNU_SOURCE)
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        {
-               const vk::Unique<vk::VkDevice>                  device                  (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>                  device                  (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
                const vk::DeviceDriver                                  vkd                             (vki, *device);
 
                TestLog&                                                                log                             = context.getTestContext().getLog();
@@ -1930,13 +2994,13 @@ tcu::TestStatus testMemoryFdSendOverSocket (Context& context, MemoryTestConfig c
 {
 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
        const vk::PlatformInterface&                            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                        instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                        instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                          queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
 
        {
-               const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex));
+               const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex));
                const vk::DeviceDriver                                  vkd                                     (vki, *device);
 
                TestLog&                                                                log                                     = context.getTestContext().getLog();
@@ -2084,11 +3148,11 @@ tcu::TestStatus testBufferBindExportImportBind (Context&                                context,
                                                                                                const BufferTestConfig  config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex, config.dedicated));
+       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
        const vk::DeviceDriver                                  vkd                                     (vki, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
@@ -2119,11 +3183,11 @@ tcu::TestStatus testBufferExportBindImportBind (Context&                                context,
                                                                                                const BufferTestConfig  config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex, config.dedicated));
+       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
        const vk::DeviceDriver                                  vkd                                     (vki, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
@@ -2153,11 +3217,11 @@ tcu::TestStatus testBufferExportImportBindBind (Context&                                context,
                                                                                                const BufferTestConfig  config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex, config.dedicated));
+       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
        const vk::DeviceDriver                                  vkd                                     (vki, *device);
        const vk::VkBufferUsageFlags                    usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkDeviceSize                                  bufferSize                      = 1024;
@@ -2207,7 +3271,7 @@ tcu::TestStatus testImageQueries (Context& context, vk::VkExternalMemoryHandleTy
                vk::VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
        };
        const vk::PlatformInterface&            vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, externalType));
+       const vk::Unique<vk::VkInstance>        instance                        (createInstance(vkp, 0u, externalType, 0u));
        const vk::InstanceDriver                        vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                      physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const vk::VkPhysicalDeviceFeatures      deviceFeatures          (vk::getPhysicalDeviceFeatures(vki, physicalDevice));
@@ -2292,7 +3356,7 @@ tcu::TestStatus testImageQueries (Context& context, vk::VkExternalMemoryHandleTy
                                // \note We need to re-create with dedicated mem extensions if previous device instance didn't have them
                                try
                                {
-                                       device                          = createDevice(vki, physicalDevice, 0u, externalType, queueFamilyIndex, requiresDedicated);
+                                       device                          = createDevice(vki, physicalDevice, 0u, externalType, 0u, queueFamilyIndex, requiresDedicated);
                                        vkd                                     = de::MovePtr<vk::DeviceDriver>(new vk::DeviceDriver(vki, *device));
                                        deviceHasDedicated      = requiresDedicated;
                                }
@@ -2350,11 +3414,11 @@ tcu::TestStatus testImageBindExportImportBind (Context&                                 context,
                                                                                           const ImageTestConfig        config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex, config.dedicated));
+       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
        const vk::DeviceDriver                                  vkd                                     (vki, *device);
        const vk::VkImageUsageFlags                             usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkFormat                                              format                          = vk::VK_FORMAT_R8G8B8A8_UNORM;
@@ -2387,11 +3451,11 @@ tcu::TestStatus testImageExportBindImportBind (Context&                                 context,
                                                                                           const ImageTestConfig        config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex, config.dedicated));
+       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
        const vk::DeviceDriver                                  vkd                                     (vki, *device);
        const vk::VkImageUsageFlags                             usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkFormat                                              format                          = vk::VK_FORMAT_R8G8B8A8_UNORM;
@@ -2423,11 +3487,11 @@ tcu::TestStatus testImageExportImportBindBind (Context&                                 context,
                                                                                           const ImageTestConfig        config)
 {
        const vk::PlatformInterface&                    vkp                                     (context.getPlatformInterface());
-       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType));
+       const vk::Unique<vk::VkInstance>                instance                        (createInstance(vkp, 0u, config.externalType, 0u));
        const vk::InstanceDriver                                vki                                     (vkp, *instance);
        const vk::VkPhysicalDevice                              physicalDevice          (vk::chooseDevice(vki, *instance, context.getTestContext().getCommandLine()));
        const deUint32                                                  queueFamilyIndex        (chooseQueueFamilyIndex(vki, physicalDevice, 0u));
-       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, queueFamilyIndex, config.dedicated));
+       const vk::Unique<vk::VkDevice>                  device                          (createDevice(vki, physicalDevice, 0u, config.externalType, 0u, queueFamilyIndex, config.dedicated));
        const vk::DeviceDriver                                  vkd                                     (vki, *device);
        const vk::VkImageUsageFlags                             usage                           = vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT|vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
        const vk::VkFormat                                              format                          = vk::VK_FORMAT_R8G8B8A8_UNORM;
@@ -2455,6 +3519,79 @@ tcu::TestStatus testImageExportImportBindBind (Context&                                  context,
 
        return tcu::TestStatus::pass("Pass");
 }
+de::MovePtr<tcu::TestCaseGroup> createFenceTests (tcu::TestContext& testCtx, vk::VkExternalFenceHandleTypeFlagBitsKHR externalType)
+{
+       const struct
+       {
+               const char* const       name;
+               const Permanence        permanence;
+       } permanences[] =
+       {
+               { "temporary", PERMANENCE_TEMPORARY     },
+               { "permanent", PERMANENCE_PERMANENT     }
+       };
+
+       de::MovePtr<tcu::TestCaseGroup> fenceGroup (new tcu::TestCaseGroup(testCtx, externalFenceTypeToName(externalType), externalFenceTypeToName(externalType)));
+
+       addFunctionCase(fenceGroup.get(), "info",       "Test external fence queries.", testFenceQueries,       externalType);
+
+       for (size_t permanenceNdx = 0; permanenceNdx < DE_LENGTH_OF_ARRAY(permanences); permanenceNdx++)
+       {
+               const Permanence                permanence              (permanences[permanenceNdx].permanence);
+               const char* const               permanenceName  (permanences[permanenceNdx].name);
+               const FenceTestConfig   config                  (externalType, permanence);
+
+               if (!isSupportedPermanence(externalType, permanence))
+                       continue;
+
+               if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
+                       || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR)
+               {
+                       addFunctionCase(fenceGroup.get(), std::string("create_win32_") + permanenceName,        "Test creating fence with win32 properties.",   testFenceWin32Create,   config);
+               }
+
+               addFunctionCase(fenceGroup.get(), std::string("import_twice_") + permanenceName,                                "Test importing fence twice.",                                                                                  testFenceImportTwice,                           config);
+               addFunctionCase(fenceGroup.get(), std::string("reimport_") + permanenceName,                                    "Test importing again over previously imported fence.",                                 testFenceImportReimport,                        config);
+               addFunctionCase(fenceGroup.get(), std::string("import_multiple_times_") + permanenceName,               "Test importing fence multiple times.",                                                                 testFenceMultipleImports,                       config);
+               addFunctionCase(fenceGroup.get(), std::string("signal_export_import_wait_") + permanenceName,   "Test signaling, exporting, importing and waiting for the sempahore.",  testFenceSignalExportImportWait,        config);
+               addFunctionCase(fenceGroup.get(), std::string("signal_import_") + permanenceName,                               "Test signaling and importing the fence.",                                                              testFenceSignalImport,                          config);
+               addFunctionCase(fenceGroup.get(), std::string("reset_") + permanenceName,                                               "Test resetting the fence.",                                                                                    testFenceReset,                                         config);
+               addFunctionCase(fenceGroup.get(), std::string("transference_") + permanenceName,                                "Test fences transference.",                                                                                    testFenceTransference,                          config);
+
+               if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR
+                       || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR)
+               {
+                       // \note Not supported on WIN32 handles
+                       addFunctionCase(fenceGroup.get(), std::string("export_multiple_times_") + permanenceName,       "Test exporting fence multiple times.",         testFenceMultipleExports,       config);
+
+                       addFunctionCase(fenceGroup.get(), std::string("dup_") + permanenceName,                                         "Test calling dup() on exported fence.",        testFenceFdDup,                         config);
+                       addFunctionCase(fenceGroup.get(), std::string("dup2_") + permanenceName,                                        "Test calling dup2() on exported fence.",       testFenceFdDup2,                        config);
+                       addFunctionCase(fenceGroup.get(), std::string("dup3_") + permanenceName,                                        "Test calling dup3() on exported fence.",       testFenceFdDup3,                        config);
+                       addFunctionCase(fenceGroup.get(), std::string("send_over_socket_") + permanenceName,            "Test sending fence fd over socket.",           testFenceFdSendOverSocket,      config);
+               }
+
+               if (getHandelTypeTransferences(externalType) == TRANSFERENCE_REFERENCE)
+               {
+                       addFunctionCase(fenceGroup.get(), std::string("signal_wait_import_") + permanenceName,                  "Test signaling and then waiting for the the sepmahore.",                       testFenceSignalWaitImport,                      config);
+                       addFunctionCase(fenceGroup.get(), std::string("export_signal_import_wait_") + permanenceName,   "Test exporting, signaling, importing and waiting for the fence.",      testFenceExportSignalImportWait,        config);
+                       addFunctionCase(fenceGroup.get(), std::string("export_import_signal_wait_") + permanenceName,   "Test exporting, importing, signaling and waiting for the fence.",      testFenceExportImportSignalWait,        config);
+               }
+       }
+
+       return fenceGroup;
+}
+
+de::MovePtr<tcu::TestCaseGroup> createFenceTests (tcu::TestContext& testCtx)
+{
+       de::MovePtr<tcu::TestCaseGroup> fenceGroup (new tcu::TestCaseGroup(testCtx, "fence", "Tests for external fences."));
+
+       fenceGroup->addChild(createFenceTests(testCtx, vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR).release());
+       fenceGroup->addChild(createFenceTests(testCtx, vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR).release());
+       fenceGroup->addChild(createFenceTests(testCtx, vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR).release());
+       fenceGroup->addChild(createFenceTests(testCtx, vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR).release());
+
+       return fenceGroup;
+}
 
 de::MovePtr<tcu::TestCaseGroup> createSemaphoreTests (tcu::TestContext& testCtx, vk::VkExternalSemaphoreHandleTypeFlagBitsKHR externalType)
 {
@@ -2615,6 +3752,7 @@ tcu::TestCaseGroup* createExternalMemoryTests (tcu::TestContext& testCtx)
 
        group->addChild(createSemaphoreTests(testCtx).release());
        group->addChild(createMemoryTests(testCtx).release());
+       group->addChild(createFenceTests(testCtx).release());
 
        return group.release();
 }
index 2c0b14a..5c95cfe 100644 (file)
@@ -659,6 +659,7 @@ void checkInstanceExtensions (tcu::ResultCollector& results, const vector<string
                "VK_KHR_get_surface_capabilities2",
                "VK_KHR_external_memory_capabilities",
                "VK_KHR_external_semaphore_capabilities",
+               "VK_KHR_external_fence_capabilities",
        };
 
        checkKhrExtensions(results, extensions, DE_LENGTH_OF_ARRAY(s_allowedInstanceKhrExtensions), s_allowedInstanceKhrExtensions);
@@ -687,7 +688,10 @@ void checkDeviceExtensions (tcu::ResultCollector& results, const vector<string>&
                "VK_KHR_external_semaphore",
                "VK_KHR_external_semaphore_fd",
                "VK_KHR_external_semaphore_win32",
-        "VK_KHR_win32_keyed_mutex",
+               "VK_KHR_external_fence",
+               "VK_KHR_external_fence_fd",
+               "VK_KHR_external_fence_win32",
+               "VK_KHR_win32_keyed_mutex",
        };
 
        checkKhrExtensions(results, extensions, DE_LENGTH_OF_ARRAY(s_allowedDeviceKhrExtensions), s_allowedDeviceKhrExtensions);
index c95dff4..315f707 100644 (file)
@@ -232,6 +232,28 @@ const char* externalSemaphoreTypeToName (vk::VkExternalSemaphoreHandleTypeFlagBi
        }
 }
 
+const char* externalFenceTypeToName (vk::VkExternalFenceHandleTypeFlagBitsKHR type)
+{
+       switch (type)
+       {
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
+                       return "opaque_fd";
+
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR:
+                       return "opaque_win32";
+
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR:
+                       return "opaque_win32_kmt";
+
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR:
+                       return "sync_fd";
+
+               default:
+                       DE_FATAL("Unknown external fence type");
+                       return DE_NULL;
+       }
+}
+
 const char* externalMemoryTypeToName (vk::VkExternalMemoryHandleTypeFlagBitsKHR type)
 {
        switch (type)
@@ -279,7 +301,7 @@ bool isSupportedPermanence (vk::VkExternalSemaphoreHandleTypeFlagBitsKHR    type,
                        return permanence == PERMANENCE_TEMPORARY;
 
                default:
-                       DE_FATAL("Unknown external memory type");
+                       DE_FATAL("Unknown external semaphore type");
                        return false;
        }
 }
@@ -299,7 +321,48 @@ Transference getHandelTypeTransferences (vk::VkExternalSemaphoreHandleTypeFlagBi
                        return TRANSFERENCE_COPY;
 
                default:
-                       DE_FATAL("Unknown external memory type");
+                       DE_FATAL("Unknown external semaphore type");
+                       return TRANSFERENCE_REFERENCE;
+       }
+}
+
+bool isSupportedPermanence (vk::VkExternalFenceHandleTypeFlagBitsKHR   type,
+                                                       Permanence                                                                      permanence)
+{
+       switch (type)
+       {
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR:
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR:
+                       return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
+
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
+                       return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
+
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR:
+                       return permanence == PERMANENCE_TEMPORARY;
+
+               default:
+                       DE_FATAL("Unknown external fence type");
+                       return false;
+       }
+}
+
+Transference getHandelTypeTransferences (vk::VkExternalFenceHandleTypeFlagBitsKHR type)
+{
+       switch (type)
+       {
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR:
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR:
+                       return TRANSFERENCE_REFERENCE;
+
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR:
+                       return TRANSFERENCE_REFERENCE;
+
+               case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR:
+                       return TRANSFERENCE_COPY;
+
+               default:
+                       DE_FATAL("Unknown external fence type");
                        return TRANSFERENCE_REFERENCE;
        }
 }
@@ -380,17 +443,172 @@ void getMemoryNative (const vk::DeviceInterface&                                 vkd,
                DE_FATAL("Unknow external memory handle type");
 }
 
+vk::Move<vk::VkFence> createExportableFence (const vk::DeviceInterface&                                        vkd,
+                                                                                        vk::VkDevice                                                           device,
+                                                                                        vk::VkExternalFenceHandleTypeFlagBitsKHR       externalType)
+{
+       const vk::VkExportFenceCreateInfoKHR    exportCreateInfo        =
+       {
+               vk::VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR,
+               DE_NULL,
+               (vk::VkExternalFenceHandleTypeFlagsKHR)externalType
+       };
+       const vk::VkFenceCreateInfo                             createInfo                      =
+       {
+               vk::VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
+               &exportCreateInfo,
+               0u
+       };
+
+       return vk::createFence(vkd, device, &createInfo);
+}
+
+int getFenceFd (const vk::DeviceInterface&                                     vkd,
+                               vk::VkDevice                                                            device,
+                               vk::VkFence                                                                     fence,
+                               vk::VkExternalFenceHandleTypeFlagBitsKHR        externalType)
+{
+       const vk::VkFenceGetFdInfoKHR   info    =
+       {
+               vk::VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
+               DE_NULL,
+
+               fence,
+               externalType
+       };
+       int                                                             fd      = -1;
+
+       VK_CHECK(vkd.getFenceFdKHR(device, &info, &fd));
+       TCU_CHECK(fd >= 0);
+
+       return fd;
+}
+
+void getFenceNative (const vk::DeviceInterface&                                        vkd,
+                                        vk::VkDevice                                                           device,
+                                        vk::VkFence                                                            fence,
+                                        vk::VkExternalFenceHandleTypeFlagBitsKHR       externalType,
+                                        NativeHandle&                                                          nativeHandle)
+{
+       if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR
+               || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR)
+       {
+               const vk::VkFenceGetFdInfoKHR   info    =
+               {
+                       vk::VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
+                       DE_NULL,
+
+                       fence,
+                       externalType
+               };
+               int                                                             fd      = -1;
+
+               VK_CHECK(vkd.getFenceFdKHR(device, &info, &fd));
+               TCU_CHECK(fd >= 0);
+               nativeHandle = fd;
+       }
+       else if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
+               || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR)
+       {
+               const vk::VkFenceGetWin32HandleInfoKHR  info    =
+               {
+                       vk::VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR,
+                       DE_NULL,
+
+                       fence,
+                       externalType
+               };
+               vk::pt::Win32Handle                                             handle  (DE_NULL);
+
+               VK_CHECK(vkd.getFenceWin32HandleKHR(device, &info, &handle));
+
+               switch (externalType)
+               {
+                       case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR:
+                               nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
+                               break;
+
+                       case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR:
+                               nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
+                               break;
+
+                       default:
+                               DE_FATAL("Unknow external memory handle type");
+               }
+       }
+       else
+               DE_FATAL("Unknow external fence handle type");
+}
+
+void importFence (const vk::DeviceInterface&                           vkd,
+                                 const vk::VkDevice                                            device,
+                                 const vk::VkFence                                                     fence,
+                                 vk::VkExternalFenceHandleTypeFlagBitsKHR      externalType,
+                                 NativeHandle&                                                         handle,
+                                 vk::VkFenceImportFlagsKHR                                     flags)
+{
+       if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR
+               || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR)
+       {
+               const vk::VkImportFenceFdInfoKHR        importInfo      =
+               {
+                       vk::VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR,
+                       DE_NULL,
+                       fence,
+                       flags,
+                       externalType,
+                       handle.getFd()
+               };
+
+               VK_CHECK(vkd.importFenceFdKHR(device, &importInfo));
+               handle.disown();
+       }
+       else if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR
+                       || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR)
+       {
+               const vk::VkImportFenceWin32HandleInfoKHR       importInfo      =
+               {
+                       vk::VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR,
+                       DE_NULL,
+                       fence,
+                       flags,
+                       externalType,
+                       handle.getWin32Handle(),
+                       DE_NULL
+               };
+
+               VK_CHECK(vkd.importFenceWin32HandleKHR(device, &importInfo));
+               // \note File descriptors and win32 handles behave differently, but this call wil make it seem like they would behave in same way
+               handle.reset();
+       }
+       else
+               DE_FATAL("Unknown fence external handle type");
+}
+
+vk::Move<vk::VkFence> createAndImportFence (const vk::DeviceInterface&                                 vkd,
+                                                                                       const vk::VkDevice                                                      device,
+                                                                                       vk::VkExternalFenceHandleTypeFlagBitsKHR        externalType,
+                                                                                       NativeHandle&                                                           handle,
+                                                                                       vk::VkFenceImportFlagsKHR                                       flags)
+{
+       vk::Move<vk::VkFence>   fence   (createFence(vkd, device));
+
+       importFence(vkd, device, *fence, externalType, handle, flags);
+
+       return fence;
+}
+
 vk::Move<vk::VkSemaphore> createExportableSemaphore (const vk::DeviceInterface&                                                vkd,
                                                                                                         vk::VkDevice                                                                   device,
                                                                                                         vk::VkExternalSemaphoreHandleTypeFlagBitsKHR   externalType)
 {
-       const vk::VkExportSemaphoreCreateInfoKHR                        exportCreateInfo        =
+       const vk::VkExportSemaphoreCreateInfoKHR        exportCreateInfo        =
        {
                vk::VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR,
                DE_NULL,
                (vk::VkExternalSemaphoreHandleTypeFlagsKHR)externalType
        };
-       const vk::VkSemaphoreCreateInfo                                         createInfo                      =
+       const vk::VkSemaphoreCreateInfo                         createInfo                      =
        {
                vk::VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
                &exportCreateInfo,
@@ -461,11 +679,11 @@ void getSemaphoreNative (const vk::DeviceInterface&                                               vkd,
 
                switch (externalType)
                {
-                       case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR:
+                       case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR:
                                nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
                                break;
 
-                       case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR:
+                       case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR:
                                nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
                                break;
 
index 33edb1b..4bc1098 100644 (file)
@@ -67,6 +67,7 @@ private:
 };
 
 const char*                                            externalSemaphoreTypeToName     (vk::VkExternalSemaphoreHandleTypeFlagBitsKHR type);
+const char*                                            externalFenceTypeToName         (vk::VkExternalFenceHandleTypeFlagBitsKHR type);
 const char*                                            externalMemoryTypeToName        (vk::VkExternalMemoryHandleTypeFlagBitsKHR type);
 
 enum Permanence
@@ -85,6 +86,10 @@ bool                                                 isSupportedPermanence                           (vk::VkExternalSemaphoreHandleTypeFlagBitsKH
                                                                                                                                         Permanence                                                                             permanence);
 Transference                                   getHandelTypeTransferences                      (vk::VkExternalSemaphoreHandleTypeFlagBitsKHR   type);
 
+bool                                                   isSupportedPermanence                           (vk::VkExternalFenceHandleTypeFlagBitsKHR               type,
+                                                                                                                                        Permanence                                                                             permanence);
+Transference                                   getHandelTypeTransferences                      (vk::VkExternalFenceHandleTypeFlagBitsKHR               type);
+
 int                                                            getMemoryFd                                                     (const vk::DeviceInterface&                                     vkd,
                                                                                                                                         vk::VkDevice                                                           device,
                                                                                                                                         vk::VkDeviceMemory                                                     memory,
@@ -124,6 +129,39 @@ vk::Move<vk::VkSemaphore>          createAndImportSemaphore                        (const vk::DeviceInterface
                                                                                                                                         NativeHandle&                                                                  handle,
                                                                                                                                         vk::VkSemaphoreImportFlagsKHR                                  flags);
 
+vk::Move<vk::VkFence>                  createExportableFence                           (const vk::DeviceInterface&                                             vkd,
+                                                                                                                                        vk::VkDevice                                                                   device,
+                                                                                                                                        vk::VkExternalFenceHandleTypeFlagBitsKHR               externalType);
+
+int                                                            getFenceFd                                                      (const vk::DeviceInterface&                                             vkd,
+                                                                                                                                        vk::VkDevice                                                                   device,
+                                                                                                                                        vk::VkFence                                                                    fence,
+                                                                                                                                        vk::VkExternalFenceHandleTypeFlagBitsKHR               externalType);
+
+void                                                   getFenceNative                                          (const vk::DeviceInterface&                                             vkd,
+                                                                                                                                        vk::VkDevice                                                                   device,
+                                                                                                                                        vk::VkFence                                                                    fence,
+                                                                                                                                        vk::VkExternalFenceHandleTypeFlagBitsKHR               externalType,
+                                                                                                                                        NativeHandle&                                                                  nativeHandle);
+
+void                                                   importFence                                                     (const vk::DeviceInterface&                                             vkd,
+                                                                                                                                        const vk::VkDevice                                                             device,
+                                                                                                                                        const vk::VkFence                                                              fence,
+                                                                                                                                        vk::VkExternalFenceHandleTypeFlagBitsKHR               externalType,
+                                                                                                                                        NativeHandle&                                                                  handle,
+                                                                                                                                        vk::VkFenceImportFlagsKHR                                              flags);
+
+vk::Move<vk::VkFence>                  createAndImportFence                            (const vk::DeviceInterface&                                             vkd,
+                                                                                                                                        const vk::VkDevice                                                             device,
+                                                                                                                                        vk::VkExternalFenceHandleTypeFlagBitsKHR               externalType,
+                                                                                                                                        NativeHandle&                                                                  handle,
+                                                                                                                                        vk::VkFenceImportFlagsKHR                                              flags);
+
+vk::Move<vk::VkDeviceMemory>   allocateExportableMemory                        (const vk::DeviceInterface&                                     vkd,
+                                                                                                                                        vk::VkDevice                                                           device,
+                                                                                                                                        const vk::VkMemoryRequirements&                        requirements,
+                                                                                                                                        vk::VkExternalMemoryHandleTypeFlagBitsKHR      externalType);
+
 // If buffer is not null use dedicated allocation
 vk::Move<vk::VkDeviceMemory>   allocateExportableMemory                        (const vk::DeviceInterface&                                     vkd,
                                                                                                                                         vk::VkDevice                                                           device,
index fb954d9..c512c6d 100644 (file)
@@ -14401,6 +14401,96 @@ dEQP-VK.api.external.memory.opaque_win32_kmt.dedicated.image.info
 dEQP-VK.api.external.memory.opaque_win32_kmt.dedicated.image.bind_export_import_bind
 dEQP-VK.api.external.memory.opaque_win32_kmt.dedicated.image.export_bind_import_bind
 dEQP-VK.api.external.memory.opaque_win32_kmt.dedicated.image.export_import_bind_bind
+dEQP-VK.api.external.fence.sync_fd.info
+dEQP-VK.api.external.fence.sync_fd.import_twice_temporary
+dEQP-VK.api.external.fence.sync_fd.reimport_temporary
+dEQP-VK.api.external.fence.sync_fd.import_multiple_times_temporary
+dEQP-VK.api.external.fence.sync_fd.signal_export_import_wait_temporary
+dEQP-VK.api.external.fence.sync_fd.signal_import_temporary
+dEQP-VK.api.external.fence.sync_fd.reset_temporary
+dEQP-VK.api.external.fence.sync_fd.transference_temporary
+dEQP-VK.api.external.fence.sync_fd.export_multiple_times_temporary
+dEQP-VK.api.external.fence.sync_fd.dup_temporary
+dEQP-VK.api.external.fence.sync_fd.dup2_temporary
+dEQP-VK.api.external.fence.sync_fd.dup3_temporary
+dEQP-VK.api.external.fence.sync_fd.send_over_socket_temporary
+dEQP-VK.api.external.fence.opaque_fd.info
+dEQP-VK.api.external.fence.opaque_fd.import_twice_temporary
+dEQP-VK.api.external.fence.opaque_fd.reimport_temporary
+dEQP-VK.api.external.fence.opaque_fd.import_multiple_times_temporary
+dEQP-VK.api.external.fence.opaque_fd.signal_export_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_fd.signal_import_temporary
+dEQP-VK.api.external.fence.opaque_fd.reset_temporary
+dEQP-VK.api.external.fence.opaque_fd.transference_temporary
+dEQP-VK.api.external.fence.opaque_fd.export_multiple_times_temporary
+dEQP-VK.api.external.fence.opaque_fd.dup_temporary
+dEQP-VK.api.external.fence.opaque_fd.dup2_temporary
+dEQP-VK.api.external.fence.opaque_fd.dup3_temporary
+dEQP-VK.api.external.fence.opaque_fd.send_over_socket_temporary
+dEQP-VK.api.external.fence.opaque_fd.signal_wait_import_temporary
+dEQP-VK.api.external.fence.opaque_fd.export_signal_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_fd.export_import_signal_wait_temporary
+dEQP-VK.api.external.fence.opaque_fd.import_twice_permanent
+dEQP-VK.api.external.fence.opaque_fd.reimport_permanent
+dEQP-VK.api.external.fence.opaque_fd.import_multiple_times_permanent
+dEQP-VK.api.external.fence.opaque_fd.signal_export_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_fd.signal_import_permanent
+dEQP-VK.api.external.fence.opaque_fd.reset_permanent
+dEQP-VK.api.external.fence.opaque_fd.transference_permanent
+dEQP-VK.api.external.fence.opaque_fd.export_multiple_times_permanent
+dEQP-VK.api.external.fence.opaque_fd.dup_permanent
+dEQP-VK.api.external.fence.opaque_fd.dup2_permanent
+dEQP-VK.api.external.fence.opaque_fd.dup3_permanent
+dEQP-VK.api.external.fence.opaque_fd.send_over_socket_permanent
+dEQP-VK.api.external.fence.opaque_fd.signal_wait_import_permanent
+dEQP-VK.api.external.fence.opaque_fd.export_signal_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_fd.export_import_signal_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32.info
+dEQP-VK.api.external.fence.opaque_win32.create_win32_temporary
+dEQP-VK.api.external.fence.opaque_win32.import_twice_temporary
+dEQP-VK.api.external.fence.opaque_win32.reimport_temporary
+dEQP-VK.api.external.fence.opaque_win32.import_multiple_times_temporary
+dEQP-VK.api.external.fence.opaque_win32.signal_export_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32.signal_import_temporary
+dEQP-VK.api.external.fence.opaque_win32.reset_temporary
+dEQP-VK.api.external.fence.opaque_win32.transference_temporary
+dEQP-VK.api.external.fence.opaque_win32.signal_wait_import_temporary
+dEQP-VK.api.external.fence.opaque_win32.export_signal_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32.export_import_signal_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32.create_win32_permanent
+dEQP-VK.api.external.fence.opaque_win32.import_twice_permanent
+dEQP-VK.api.external.fence.opaque_win32.reimport_permanent
+dEQP-VK.api.external.fence.opaque_win32.import_multiple_times_permanent
+dEQP-VK.api.external.fence.opaque_win32.signal_export_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32.signal_import_permanent
+dEQP-VK.api.external.fence.opaque_win32.reset_permanent
+dEQP-VK.api.external.fence.opaque_win32.transference_permanent
+dEQP-VK.api.external.fence.opaque_win32.signal_wait_import_permanent
+dEQP-VK.api.external.fence.opaque_win32.export_signal_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32.export_import_signal_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.info
+dEQP-VK.api.external.fence.opaque_win32_kmt.create_win32_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.import_twice_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.reimport_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.import_multiple_times_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_export_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_import_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.reset_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.transference_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_wait_import_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.export_signal_import_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.export_import_signal_wait_temporary
+dEQP-VK.api.external.fence.opaque_win32_kmt.create_win32_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.import_twice_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.reimport_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.import_multiple_times_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_export_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_import_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.reset_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.transference_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.signal_wait_import_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.export_signal_import_wait_permanent
+dEQP-VK.api.external.fence.opaque_win32_kmt.export_import_signal_wait_permanent
 dEQP-VK.memory.allocation.basic.size_64.forward.count_1
 dEQP-VK.memory.allocation.basic.size_64.forward.count_10
 dEQP-VK.memory.allocation.basic.size_64.forward.count_100
index f9908c8..e4369f0 100644 (file)
@@ -258,6 +258,14 @@ typedef enum VkStructureType {
     VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = 1000085000,
     VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE = 1000092000,
     VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = 1000112000,
+    VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = 1000112001,
+    VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR = 1000113000,
+    VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000,
+    VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001,
+    VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002,
+    VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR = 1000115000,
+    VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR = 1000115001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000,
     VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR = 1000119001,
     VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR = 1000119002,
@@ -4166,6 +4174,151 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormats2KHR(
     VkSurfaceFormat2KHR*                        pSurfaceFormats);
 #endif
 
+#define VK_KHR_external_fence_capabilities 1
+#define VK_LUID_SIZE_KHR                  8
+#define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_SPEC_VERSION 1
+#define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME "VK_KHR_external_fence_capabilities"
+
+
+typedef enum VkExternalFenceHandleTypeFlagBitsKHR {
+    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = 0x00000001,
+    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = 0x00000002,
+    VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = 0x00000004,
+    VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR = 0x00000008,
+    VK_EXTERNAL_FENCE_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkExternalFenceHandleTypeFlagBitsKHR;
+typedef VkFlags VkExternalFenceHandleTypeFlagsKHR;
+
+typedef enum VkExternalFenceFeatureFlagBitsKHR {
+    VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR = 0x00000001,
+    VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR = 0x00000002,
+    VK_EXTERNAL_FENCE_FEATURE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkExternalFenceFeatureFlagBitsKHR;
+typedef VkFlags VkExternalFenceFeatureFlagsKHR;
+
+typedef struct VkPhysicalDeviceExternalFenceInfoKHR {
+    VkStructureType                         sType;
+    const void*                             pNext;
+    VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+} VkPhysicalDeviceExternalFenceInfoKHR;
+
+typedef struct VkExternalFencePropertiesKHR {
+    VkStructureType                      sType;
+    void*                                pNext;
+    VkExternalFenceHandleTypeFlagsKHR    exportFromImportedHandleTypes;
+    VkExternalFenceHandleTypeFlagsKHR    compatibleHandleTypes;
+    VkExternalFenceFeatureFlagsKHR       externalFenceFeatures;
+} VkExternalFencePropertiesKHR;
+
+typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, VkExternalFencePropertiesKHR* pExternalFenceProperties);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFencePropertiesKHR(
+    VkPhysicalDevice                            physicalDevice,
+    const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo,
+    VkExternalFencePropertiesKHR*               pExternalFenceProperties);
+#endif
+
+#define VK_KHR_external_fence 1
+#define VK_KHR_EXTERNAL_FENCE_SPEC_VERSION 1
+#define VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME "VK_KHR_external_fence"
+
+
+typedef enum VkFenceImportFlagBitsKHR {
+    VK_FENCE_IMPORT_TEMPORARY_BIT_KHR = 0x00000001,
+    VK_FENCE_IMPORT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkFenceImportFlagBitsKHR;
+typedef VkFlags VkFenceImportFlagsKHR;
+
+typedef struct VkExportFenceCreateInfoKHR {
+    VkStructureType                      sType;
+    const void*                          pNext;
+    VkExternalFenceHandleTypeFlagsKHR    handleTypes;
+} VkExportFenceCreateInfoKHR;
+
+
+
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+#define VK_KHR_external_fence_win32 1
+#define VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION 1
+#define VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME "VK_KHR_external_fence_win32"
+
+typedef struct VkImportFenceWin32HandleInfoKHR {
+    VkStructureType                         sType;
+    const void*                             pNext;
+    VkFence                                 fence;
+    VkFenceImportFlagsKHR                   flags;
+    VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+    HANDLE                                  handle;
+    LPCWSTR                                 name;
+} VkImportFenceWin32HandleInfoKHR;
+
+typedef struct VkExportFenceWin32HandleInfoKHR {
+    VkStructureType               sType;
+    const void*                   pNext;
+    const SECURITY_ATTRIBUTES*    pAttributes;
+    DWORD                         dwAccess;
+    LPCWSTR                       name;
+} VkExportFenceWin32HandleInfoKHR;
+
+typedef struct VkFenceGetWin32HandleInfoKHR {
+    VkStructureType                         sType;
+    const void*                             pNext;
+    VkFence                                 fence;
+    VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+} VkFenceGetWin32HandleInfoKHR;
+
+
+typedef VkResult (VKAPI_PTR *PFN_vkImportFenceWin32HandleKHR)(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkGetFenceWin32HandleKHR)(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceWin32HandleKHR(
+    VkDevice                                    device,
+    const VkImportFenceWin32HandleInfoKHR*      pImportFenceWin32HandleInfo);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceWin32HandleKHR(
+    VkDevice                                    device,
+    const VkFenceGetWin32HandleInfoKHR*         pGetWin32HandleInfo,
+    HANDLE*                                     pHandle);
+#endif
+#endif /* VK_USE_PLATFORM_WIN32_KHR */
+
+#define VK_KHR_external_fence_fd 1
+#define VK_KHR_EXTERNAL_FENCE_FD_SPEC_VERSION 1
+#define VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME "VK_KHR_external_fence_fd"
+
+typedef struct VkImportFenceFdInfoKHR {
+    VkStructureType                         sType;
+    const void*                             pNext;
+    VkFence                                 fence;
+    VkFenceImportFlagsKHR                   flags;
+    VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+    int                                     fd;
+} VkImportFenceFdInfoKHR;
+
+typedef struct VkFenceGetFdInfoKHR {
+    VkStructureType                         sType;
+    const void*                             pNext;
+    VkFence                                 fence;
+    VkExternalFenceHandleTypeFlagBitsKHR    handleType;
+} VkFenceGetFdInfoKHR;
+
+
+typedef VkResult (VKAPI_PTR *PFN_vkImportFenceFdKHR)(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkGetFenceFdKHR)(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceFdKHR(
+    VkDevice                                    device,
+    const VkImportFenceFdInfoKHR*               pImportFenceFdInfo);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceFdKHR(
+    VkDevice                                    device,
+    const VkFenceGetFdInfoKHR*                  pGetFdInfo,
+    int*                                        pFd);
+#endif
+
 #define VK_KHR_dedicated_allocation 1
 #define VK_KHR_DEDICATED_ALLOCATION_SPEC_VERSION 1
 #define VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME "VK_KHR_dedicated_allocation"