[vulkan] android: external fence sync fd support (guest)
bug: 139194471
+ Also fix up external semaphore support to not signal early (a hack)
and to not potentially get itself stuck (via the vkQueueWaitIdle in the
same thread as the vkQueueSubmit).
Use WorkPool (which should be libyarn in the near term) to schedule all
those wait/signals and joining.
Test: WorkPool unit tests
Android: dEQP-VK.api.external.fence.sync_fd*
Android: dEQP-VK.api.external.semaphore.sync_fd*
Android: No dEQP-VK regressions
Change-Id: Ie40e1d10636b39817d848c0156c51d69adf61e71
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index 39632be..791a2b2 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -43,9 +43,11 @@
VulkanHandleMapping* defaultMapping();
using HostConnectionGetFunc = HostConnection* (*)();
+ using VkEncoderGetFunc = VkEncoder* (*)(HostConnection*);
struct ThreadingCallbacks {
HostConnectionGetFunc hostConnectionGetFunc = 0;
+ VkEncoderGetFunc vkEncoderGetFunc = 0;
};
#define HANDLE_REGISTER_DECL(type) \
@@ -213,6 +215,10 @@
void* context, VkResult input_result,
VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
+ VkResult on_vkQueueWaitIdle(
+ void* context, VkResult input_result,
+ VkQueue queue);
+
void unwrap_VkNativeBufferANDROID(
const VkImageCreateInfo* pCreateInfo,
VkImageCreateInfo* local_pCreateInfo);
@@ -303,6 +309,60 @@
const VkAllocationCallbacks* pAllocator,
VkSampler* pSampler);
+ void on_vkGetPhysicalDeviceExternalFenceProperties(
+ void* context,
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
+ VkExternalFenceProperties* pExternalFenceProperties);
+
+ void on_vkGetPhysicalDeviceExternalFencePropertiesKHR(
+ void* context,
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
+ VkExternalFenceProperties* pExternalFenceProperties);
+
+ VkResult on_vkCreateFence(
+ void* context,
+ VkResult input_result,
+ VkDevice device,
+ const VkFenceCreateInfo* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator, VkFence* pFence);
+
+ void on_vkDestroyFence(
+ void* context,
+ VkDevice device,
+ VkFence fence,
+ const VkAllocationCallbacks* pAllocator);
+
+ VkResult on_vkResetFences(
+ void* context,
+ VkResult input_result,
+ VkDevice device,
+ uint32_t fenceCount,
+ const VkFence* pFences);
+
+ VkResult on_vkImportFenceFdKHR(
+ void* context,
+ VkResult input_result,
+ VkDevice device,
+ const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
+
+ VkResult on_vkGetFenceFdKHR(
+ void* context,
+ VkResult input_result,
+ VkDevice device,
+ const VkFenceGetFdInfoKHR* pGetFdInfo,
+ int* pFd);
+
+ VkResult on_vkWaitForFences(
+ void* context,
+ VkResult input_result,
+ VkDevice device,
+ uint32_t fenceCount,
+ const VkFence* pFences,
+ VkBool32 waitAll,
+ uint64_t timeout);
+
VkResult on_vkMapMemoryIntoAddressSpaceGOOGLE_pre(
void* context,
VkResult input_result,