diff --git a/spa/plugins/vulkan/vulkan-utils.c b/spa/plugins/vulkan/vulkan-utils.c index cd5ce95c7..cbf30f3a8 100644 --- a/spa/plugins/vulkan/vulkan-utils.c +++ b/spa/plugins/vulkan/vulkan-utils.c @@ -301,56 +301,16 @@ int vulkan_read_pixels(struct vulkan_base *s, struct vulkan_read_pixels_info *in int vulkan_sync_foreign_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_buf) { - VULKAN_INSTANCE_FUNCTION(vkImportSemaphoreFdKHR); - if (!s->implicit_sync_interop) { - struct pollfd pollfd = { - .fd = vk_buf->fd, - .events = POLLIN, - }; - int timeout_ms = 1000; - int ret = poll(&pollfd, 1, timeout_ms); - if (ret < 0) { - spa_log_error(s->log, "Failed to wait for DMA-BUF fence"); - return -1; - } else if (ret == 0) { - spa_log_error(s->log, "Timed out waiting for DMA-BUF fence"); - return -1; - } - return 0; + return vulkan_buffer_wait_dmabuf_fence(s, vk_buf); } - int sync_file_fd = dmabuf_export_sync_file(s->log, vk_buf->fd, DMA_BUF_SYNC_READ); - if (sync_file_fd < 0) { - spa_log_error(s->log, "Failed to extract for DMA-BUF fence"); - return -1; - } - - if (vk_buf->foreign_semaphore == VK_NULL_HANDLE) { - VkSemaphoreCreateInfo semaphore_info = { - .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, - }; - VK_CHECK_RESULT_WITH_CLEANUP(vkCreateSemaphore(s->device, &semaphore_info, NULL, &vk_buf->foreign_semaphore), close(sync_file_fd)); - } - - VkImportSemaphoreFdInfoKHR import_info = { - .sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, - .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, - .flags = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR, - .semaphore = vk_buf->foreign_semaphore, - .fd = sync_file_fd, - }; - VK_CHECK_RESULT_WITH_CLEANUP(vkImportSemaphoreFdKHR(s->device, &import_info), close(sync_file_fd)); - - return 0; + return vulkan_buffer_import_implicit_syncfd(s, vk_buf); } bool vulkan_sync_export_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd) { - if (!s->implicit_sync_interop) - return false; - - return dmabuf_import_sync_file(s->log, vk_buf->fd, DMA_BUF_SYNC_WRITE, sync_file_fd); + return vulkan_buffer_set_implicit_syncfd(s, vk_buf, sync_file_fd); } int vulkan_fence_create(struct vulkan_base *s, VkFence *fence) @@ -430,6 +390,73 @@ struct vulkan_modifier_info *vulkan_modifierInfo_find(struct vulkan_format_infos return NULL; } +int vulkan_buffer_get_implicit_syncfd(struct vulkan_base *s, struct vulkan_buffer *vk_buf) +{ + if (!s->implicit_sync_interop) + return -1; + + return dmabuf_export_sync_file(s->log, vk_buf->fd, DMA_BUF_SYNC_READ); +} + +bool vulkan_buffer_set_implicit_syncfd(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd) +{ + if (!s->implicit_sync_interop) + return false; + + return dmabuf_import_sync_file(s->log, vk_buf->fd, DMA_BUF_SYNC_WRITE, sync_file_fd); +} + +int vulkan_buffer_import_implicit_syncfd(struct vulkan_base *s, struct vulkan_buffer *vk_buf) +{ + int sync_file_fd = vulkan_buffer_get_implicit_syncfd(s, vk_buf); + if (sync_file_fd < 0) { + spa_log_error(s->log, "Failed to extract for DMA-BUF fence"); + return -1; + } + return vulkan_buffer_import_syncfd(s, vk_buf, sync_file_fd); +} + +int vulkan_buffer_wait_dmabuf_fence(struct vulkan_base *s, struct vulkan_buffer *vk_buf) +{ + struct pollfd pollfd = { + .fd = vk_buf->fd, + .events = POLLIN, + }; + int timeout_ms = 1000; + int ret = poll(&pollfd, 1, timeout_ms); + if (ret < 0) { + spa_log_error(s->log, "Failed to wait for DMA-BUF fence"); + return -1; + } else if (ret == 0) { + spa_log_error(s->log, "Timed out waiting for DMA-BUF fence"); + return -1; + } + return 0; +} + +int vulkan_buffer_import_syncfd(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd) +{ + VULKAN_INSTANCE_FUNCTION(vkImportSemaphoreFdKHR); + + if (vk_buf->foreign_semaphore == VK_NULL_HANDLE) { + VkSemaphoreCreateInfo semaphore_info = { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, + }; + VK_CHECK_RESULT_WITH_CLEANUP(vkCreateSemaphore(s->device, &semaphore_info, NULL, &vk_buf->foreign_semaphore), close(sync_file_fd)); + } + + VkImportSemaphoreFdInfoKHR import_info = { + .sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, + .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, + .flags = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR, + .semaphore = vk_buf->foreign_semaphore, + .fd = sync_file_fd, + }; + VK_CHECK_RESULT_WITH_CLEANUP(vkImportSemaphoreFdKHR(s->device, &import_info), close(sync_file_fd)); + + return 0; +} + void vulkan_buffer_clear(struct vulkan_base *s, struct vulkan_buffer *buffer) { if (buffer->fd != -1) diff --git a/spa/plugins/vulkan/vulkan-utils.h b/spa/plugins/vulkan/vulkan-utils.h index 7a6a34f93..60b092301 100644 --- a/spa/plugins/vulkan/vulkan-utils.h +++ b/spa/plugins/vulkan/vulkan-utils.h @@ -104,6 +104,11 @@ uint32_t vulkan_memoryType_find(struct vulkan_base *s, struct vulkan_format_info *vulkan_formatInfo_find(struct vulkan_format_infos *fmtInfo, VkFormat format); struct vulkan_modifier_info *vulkan_modifierInfo_find(struct vulkan_format_infos *fmtInfo, VkFormat format, uint64_t modifier); +int vulkan_buffer_get_implicit_syncfd(struct vulkan_base *s, struct vulkan_buffer *vk_buf); +bool vulkan_buffer_set_implicit_syncfd(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd); +int vulkan_buffer_import_implicit_syncfd(struct vulkan_base *s, struct vulkan_buffer *vk_buf); +int vulkan_buffer_wait_dmabuf_fence(struct vulkan_base *s, struct vulkan_buffer *vk_buf); +int vulkan_buffer_import_syncfd(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd); void vulkan_buffer_clear(struct vulkan_base *s, struct vulkan_buffer *buffer); uint32_t vulkan_vkformat_to_id(VkFormat vkFormat);