mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	vulkan: Export functions to handle implicit_fd
This commit is contained in:
		
							parent
							
								
									5c8799a480
								
							
						
					
					
						commit
						f10e8d2717
					
				
					 2 changed files with 75 additions and 43 deletions
				
			
		| 
						 | 
					@ -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)
 | 
					int vulkan_sync_foreign_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	VULKAN_INSTANCE_FUNCTION(vkImportSemaphoreFdKHR);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!s->implicit_sync_interop) {
 | 
						if (!s->implicit_sync_interop) {
 | 
				
			||||||
		struct pollfd pollfd = {
 | 
							return vulkan_buffer_wait_dmabuf_fence(s, vk_buf);
 | 
				
			||||||
			.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 sync_file_fd = dmabuf_export_sync_file(s->log, vk_buf->fd, DMA_BUF_SYNC_READ);
 | 
						return vulkan_buffer_import_implicit_syncfd(s, vk_buf);
 | 
				
			||||||
	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;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool vulkan_sync_export_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd)
 | 
					bool vulkan_sync_export_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!s->implicit_sync_interop)
 | 
						return vulkan_buffer_set_implicit_syncfd(s, vk_buf, sync_file_fd);
 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return dmabuf_import_sync_file(s->log, vk_buf->fd, DMA_BUF_SYNC_WRITE, sync_file_fd);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int vulkan_fence_create(struct vulkan_base *s, VkFence *fence)
 | 
					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;
 | 
						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)
 | 
					void vulkan_buffer_clear(struct vulkan_base *s, struct vulkan_buffer *buffer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (buffer->fd != -1)
 | 
						if (buffer->fd != -1)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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_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);
 | 
					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);
 | 
					void vulkan_buffer_clear(struct vulkan_base *s, struct vulkan_buffer *buffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t vulkan_vkformat_to_id(VkFormat vkFormat);
 | 
					uint32_t vulkan_vkformat_to_id(VkFormat vkFormat);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue