From 75daa140f3b5a2cfd1f0e8f564abd4714675f7ec Mon Sep 17 00:00:00 2001 From: columbarius Date: Sun, 7 Apr 2024 17:34:53 +0200 Subject: [PATCH] vulkan: Split buffer import into CPU and GPU part --- spa/plugins/vulkan/vulkan-blit-utils.c | 44 ++++++++++++++++++++------ spa/plugins/vulkan/vulkan-blit-utils.h | 2 ++ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/spa/plugins/vulkan/vulkan-blit-utils.c b/spa/plugins/vulkan/vulkan-blit-utils.c index 99877b31b..b6640e8dc 100644 --- a/spa/plugins/vulkan/vulkan-blit-utils.c +++ b/spa/plugins/vulkan/vulkan-blit-utils.c @@ -79,9 +79,7 @@ static int runImportSHMBuffers(struct vulkan_blit_state *s, struct vulkan_pass * struct vulkan_stream *p = &s->streams[pass->in_stream_id]; if (p->spa_buffers[pass->in_buffer_id]->datas[0].type == SPA_DATA_MemPtr) { - struct vulkan_buffer *vk_buf = &p->buffers[pass->in_buffer_id]; struct spa_buffer *spa_buf = p->spa_buffers[pass->in_buffer_id]; - VkBufferImageCopy copy; struct vulkan_write_pixels_info writeInfo = { .data = spa_buf->datas[0].data, .offset = 0, @@ -89,12 +87,9 @@ static int runImportSHMBuffers(struct vulkan_blit_state *s, struct vulkan_pass * .bytes_per_pixel = p->bpp, .size.width = p->dim.width, .size.height = p->dim.height, - .copies = ©, + .copies = &pass->in_copy, }; CHECK(vulkan_write_pixels(&s->base, &writeInfo, &s->staging_buffer)); - - vkCmdCopyBufferToImage(s->commandBuffer, s->staging_buffer.buffer, vk_buf->image, - VK_IMAGE_LAYOUT_GENERAL, 1, ©); } return 0; @@ -171,8 +166,6 @@ static int runCommandBuffer(struct vulkan_blit_state *s, struct vulkan_pass *pas }; VK_CHECK_RESULT(vkBeginCommandBuffer(s->commandBuffer, &beginInfo)); - CHECK(runImportSHMBuffers(s, pass)); - uint32_t i; struct vulkan_stream *stream_input = &s->streams[pass->in_stream_id]; struct vulkan_stream *stream_output = &s->streams[pass->out_stream_id]; @@ -180,6 +173,31 @@ static int runCommandBuffer(struct vulkan_blit_state *s, struct vulkan_pass *pas VkImage src_image = stream_input->buffers[pass->in_buffer_id].image; VkImage dst_image = stream_output->buffers[pass->out_buffer_id].image; + if (stream_input->spa_buffers[pass->in_buffer_id]->datas[0].type == SPA_DATA_MemPtr) { + vkCmdCopyBufferToImage(s->commandBuffer, s->staging_buffer.buffer, src_image, + VK_IMAGE_LAYOUT_GENERAL, 1, &pass->in_copy); + + VkImageMemoryBarrier copy_barrier = { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .srcQueueFamilyIndex = s->base.queueFamilyIndex, + .dstQueueFamilyIndex = s->base.queueFamilyIndex, + .image = src_image, + .oldLayout = VK_IMAGE_LAYOUT_GENERAL, + .newLayout = VK_IMAGE_LAYOUT_GENERAL, + .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT, + .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .subresourceRange.levelCount = 1, + .subresourceRange.layerCount = 1, + }; + + vkCmdPipelineBarrier(s->commandBuffer, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, 0, NULL, 0, NULL, + 1, ©_barrier); + } + VkImageBlit imageBlitRegion = { .srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .srcSubresource.layerCount = 1, @@ -220,10 +238,15 @@ static int runCommandBuffer(struct vulkan_blit_state *s, struct vulkan_pass *pas struct vulkan_buffer *current_buffer = &p->buffers[GET_BUFFER_ID_FROM_STREAM(p, pass)]; VkAccessFlags access_flags; + VkAccessFlags release_flags; if (p->direction == SPA_DIRECTION_INPUT) { - access_flags = VK_ACCESS_TRANSFER_READ_BIT; + access_flags = p->spa_buffers[pass->in_buffer_id]->datas[0].type == SPA_DATA_DmaBuf + ? VK_ACCESS_TRANSFER_READ_BIT + : VK_ACCESS_TRANSFER_WRITE_BIT; + release_flags = VK_ACCESS_TRANSFER_READ_BIT; } else { access_flags = VK_ACCESS_TRANSFER_WRITE_BIT; + release_flags = VK_ACCESS_TRANSFER_WRITE_BIT; } acquire_barrier[i]= (VkImageMemoryBarrier) { @@ -247,7 +270,7 @@ static int runCommandBuffer(struct vulkan_blit_state *s, struct vulkan_pass *pas .image = current_buffer->image, .oldLayout = VK_IMAGE_LAYOUT_GENERAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL, - .srcAccessMask = access_flags, + .srcAccessMask = release_flags, .dstAccessMask = 0, .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .subresourceRange.levelCount = 1, @@ -605,6 +628,7 @@ int spa_vulkan_blit_process(struct vulkan_blit_state *s) CHECK(updateBuffers(s)); CHECK(updatePass(s, &pass)); CHECK(runImportSync(s, &pass)); + CHECK(runImportSHMBuffers(s, &pass)); CHECK(runCommandBuffer(s, &pass)); if (pass.sync_fd != -1) { runExportSync(s, &pass); diff --git a/spa/plugins/vulkan/vulkan-blit-utils.h b/spa/plugins/vulkan/vulkan-blit-utils.h index 8c7d822bc..a60f7f1e6 100644 --- a/spa/plugins/vulkan/vulkan-blit-utils.h +++ b/spa/plugins/vulkan/vulkan-blit-utils.h @@ -21,6 +21,8 @@ struct vulkan_pass { uint32_t out_buffer_id; uint32_t out_stream_id; + VkBufferImageCopy in_copy; + int sync_fd; };