mirror of
https://gitlab.freedesktop.org/pipewire/pipewire
synced 2024-10-14 20:02:38 +00:00
vulkan: Split buffer import into CPU and GPU part
This commit is contained in:
parent
3f47825082
commit
75daa140f3
|
@ -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];
|
struct vulkan_stream *p = &s->streams[pass->in_stream_id];
|
||||||
|
|
||||||
if (p->spa_buffers[pass->in_buffer_id]->datas[0].type == SPA_DATA_MemPtr) {
|
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];
|
struct spa_buffer *spa_buf = p->spa_buffers[pass->in_buffer_id];
|
||||||
VkBufferImageCopy copy;
|
|
||||||
struct vulkan_write_pixels_info writeInfo = {
|
struct vulkan_write_pixels_info writeInfo = {
|
||||||
.data = spa_buf->datas[0].data,
|
.data = spa_buf->datas[0].data,
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
|
@ -89,12 +87,9 @@ static int runImportSHMBuffers(struct vulkan_blit_state *s, struct vulkan_pass *
|
||||||
.bytes_per_pixel = p->bpp,
|
.bytes_per_pixel = p->bpp,
|
||||||
.size.width = p->dim.width,
|
.size.width = p->dim.width,
|
||||||
.size.height = p->dim.height,
|
.size.height = p->dim.height,
|
||||||
.copies = ©,
|
.copies = &pass->in_copy,
|
||||||
};
|
};
|
||||||
CHECK(vulkan_write_pixels(&s->base, &writeInfo, &s->staging_buffer));
|
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;
|
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));
|
VK_CHECK_RESULT(vkBeginCommandBuffer(s->commandBuffer, &beginInfo));
|
||||||
|
|
||||||
CHECK(runImportSHMBuffers(s, pass));
|
|
||||||
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
struct vulkan_stream *stream_input = &s->streams[pass->in_stream_id];
|
struct vulkan_stream *stream_input = &s->streams[pass->in_stream_id];
|
||||||
struct vulkan_stream *stream_output = &s->streams[pass->out_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 src_image = stream_input->buffers[pass->in_buffer_id].image;
|
||||||
VkImage dst_image = stream_output->buffers[pass->out_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 = {
|
VkImageBlit imageBlitRegion = {
|
||||||
.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
.srcSubresource.layerCount = 1,
|
.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)];
|
struct vulkan_buffer *current_buffer = &p->buffers[GET_BUFFER_ID_FROM_STREAM(p, pass)];
|
||||||
|
|
||||||
VkAccessFlags access_flags;
|
VkAccessFlags access_flags;
|
||||||
|
VkAccessFlags release_flags;
|
||||||
if (p->direction == SPA_DIRECTION_INPUT) {
|
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 {
|
} else {
|
||||||
access_flags = VK_ACCESS_TRANSFER_WRITE_BIT;
|
access_flags = VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
|
release_flags = VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
acquire_barrier[i]= (VkImageMemoryBarrier) {
|
acquire_barrier[i]= (VkImageMemoryBarrier) {
|
||||||
|
@ -247,7 +270,7 @@ static int runCommandBuffer(struct vulkan_blit_state *s, struct vulkan_pass *pas
|
||||||
.image = current_buffer->image,
|
.image = current_buffer->image,
|
||||||
.oldLayout = VK_IMAGE_LAYOUT_GENERAL,
|
.oldLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
.newLayout = VK_IMAGE_LAYOUT_GENERAL,
|
.newLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
.srcAccessMask = access_flags,
|
.srcAccessMask = release_flags,
|
||||||
.dstAccessMask = 0,
|
.dstAccessMask = 0,
|
||||||
.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
.subresourceRange.levelCount = 1,
|
.subresourceRange.levelCount = 1,
|
||||||
|
@ -605,6 +628,7 @@ int spa_vulkan_blit_process(struct vulkan_blit_state *s)
|
||||||
CHECK(updateBuffers(s));
|
CHECK(updateBuffers(s));
|
||||||
CHECK(updatePass(s, &pass));
|
CHECK(updatePass(s, &pass));
|
||||||
CHECK(runImportSync(s, &pass));
|
CHECK(runImportSync(s, &pass));
|
||||||
|
CHECK(runImportSHMBuffers(s, &pass));
|
||||||
CHECK(runCommandBuffer(s, &pass));
|
CHECK(runCommandBuffer(s, &pass));
|
||||||
if (pass.sync_fd != -1) {
|
if (pass.sync_fd != -1) {
|
||||||
runExportSync(s, &pass);
|
runExportSync(s, &pass);
|
||||||
|
|
|
@ -21,6 +21,8 @@ struct vulkan_pass {
|
||||||
uint32_t out_buffer_id;
|
uint32_t out_buffer_id;
|
||||||
uint32_t out_stream_id;
|
uint32_t out_stream_id;
|
||||||
|
|
||||||
|
VkBufferImageCopy in_copy;
|
||||||
|
|
||||||
int sync_fd;
|
int sync_fd;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue