vulkan: Support MemPtr as import for compute

This commit is contained in:
columbarius 2024-01-28 01:44:46 +01:00 committed by Wim Taymans
parent 7ffd8ff4de
commit 3f80bc2e70
2 changed files with 49 additions and 2 deletions

View file

@ -241,6 +241,39 @@ static int createCommandBuffer(struct vulkan_compute_state *s)
return 0; return 0;
} }
static int runImportSHMBuffers(struct vulkan_compute_state *s) {
for (uint32_t i = 0; i < s->n_streams; i++) {
struct vulkan_stream *p = &s->streams[i];
if (p->direction == SPA_DIRECTION_OUTPUT)
continue;
struct pixel_format_info pixel_info;
CHECK(get_pixel_format_info(p->format, &pixel_info));
if (p->spa_buffers[p->current_buffer_id]->datas[0].type == SPA_DATA_MemPtr) {
struct vulkan_buffer *vk_buf = &p->buffers[p->current_buffer_id];
struct spa_buffer *spa_buf = p->spa_buffers[p->current_buffer_id];
VkBufferImageCopy copy;
struct vulkan_write_pixels_info writeInfo = {
.data = spa_buf->datas[0].data,
.offset = spa_buf->datas[0].chunk->offset,
.stride = spa_buf->datas[0].chunk->stride,
.bytes_per_pixel = pixel_info.bpp,
.size.width = s->constants.width,
.size.height = s->constants.height,
.copies = &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, &copy);
}
}
return 0;
}
static int runExportSHMBuffers(struct vulkan_compute_state *s) { static int runExportSHMBuffers(struct vulkan_compute_state *s) {
for (uint32_t i = 0; i < s->n_streams; i++) { for (uint32_t i = 0; i < s->n_streams; i++) {
struct vulkan_stream *p = &s->streams[i]; struct vulkan_stream *p = &s->streams[i];
@ -285,6 +318,8 @@ static int runCommandBuffer(struct vulkan_compute_state *s)
}; };
VK_CHECK_RESULT(vkBeginCommandBuffer(s->commandBuffer, &beginInfo)); VK_CHECK_RESULT(vkBeginCommandBuffer(s->commandBuffer, &beginInfo));
CHECK(runImportSHMBuffers(s));
vkCmdBindPipeline(s->commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, s->pipeline); vkCmdBindPipeline(s->commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, s->pipeline);
vkCmdPushConstants (s->commandBuffer, vkCmdPushConstants (s->commandBuffer,
s->pipelineLayout, VK_SHADER_STAGE_COMPUTE_BIT, s->pipelineLayout, VK_SHADER_STAGE_COMPUTE_BIT,
@ -444,6 +479,10 @@ static void clear_buffers(struct vulkan_compute_state *s, struct vulkan_stream *
p->spa_buffers[i] = NULL; p->spa_buffers[i] = NULL;
} }
p->n_buffers = 0; p->n_buffers = 0;
if (p->direction == SPA_DIRECTION_INPUT) {
vulkan_staging_buffer_destroy(&s->base, &s->staging_buffer);
s->staging_buffer.buffer = VK_NULL_HANDLE;
}
} }
static void clear_streams(struct vulkan_compute_state *s) static void clear_streams(struct vulkan_compute_state *s)
@ -532,7 +571,7 @@ int spa_vulkan_compute_use_buffers(struct vulkan_compute_state *s, struct vulkan
.size.height = s->constants.height, .size.height = s->constants.height,
.usage = p->direction == SPA_DIRECTION_OUTPUT .usage = p->direction == SPA_DIRECTION_OUTPUT
? VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT ? VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT
: VK_IMAGE_USAGE_SAMPLED_BIT, : VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
.spa_buf = buffers[i], .spa_buf = buffers[i],
}; };
ret = vulkan_import_memptr(&s->base, &memptrInfo, &p->buffers[i]); ret = vulkan_import_memptr(&s->base, &memptrInfo, &p->buffers[i]);
@ -549,6 +588,13 @@ int spa_vulkan_compute_use_buffers(struct vulkan_compute_state *s, struct vulkan
p->spa_buffers[i] = buffers[i]; p->spa_buffers[i] = buffers[i];
p->n_buffers++; p->n_buffers++;
} }
if (p->direction == SPA_DIRECTION_INPUT && buffers[0]->datas[0].type == SPA_DATA_MemPtr) {
ret = vulkan_staging_buffer_create(&s->base, buffers[0]->datas[0].maxsize, &s->staging_buffer);
if (ret < 0) {
spa_log_error(s->log, "Failed to create staging buffer");
return ret;
}
}
p->format = dsp_info->format; p->format = dsp_info->format;
return 0; return 0;
@ -668,7 +714,7 @@ int spa_vulkan_compute_get_buffer_caps(struct vulkan_compute_state *s, enum spa_
{ {
switch (direction) { switch (direction) {
case SPA_DIRECTION_INPUT: case SPA_DIRECTION_INPUT:
return VULKAN_BUFFER_TYPE_CAP_DMABUF; return VULKAN_BUFFER_TYPE_CAP_DMABUF | VULKAN_BUFFER_TYPE_CAP_SHM;
case SPA_DIRECTION_OUTPUT: case SPA_DIRECTION_OUTPUT:
return VULKAN_BUFFER_TYPE_CAP_DMABUF | VULKAN_BUFFER_TYPE_CAP_SHM; return VULKAN_BUFFER_TYPE_CAP_DMABUF | VULKAN_BUFFER_TYPE_CAP_SHM;
} }

View file

@ -56,6 +56,7 @@ struct vulkan_compute_state {
VkCommandPool commandPool; VkCommandPool commandPool;
VkCommandBuffer commandBuffer; VkCommandBuffer commandBuffer;
struct vulkan_staging_buffer staging_buffer;
VkFence fence; VkFence fence;
VkSemaphore pipelineSemaphore; VkSemaphore pipelineSemaphore;