mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -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