From 7ffd8ff4de188e2ad13b31a54ea3b8217644055c Mon Sep 17 00:00:00 2001 From: columbarius Date: Sun, 24 Sep 2023 20:36:02 +0200 Subject: [PATCH] vulkan: Add function to upload data to a staging buffer --- spa/plugins/vulkan/vulkan-utils.c | 32 +++++++++++++++++++++++++++++++ spa/plugins/vulkan/vulkan-utils.h | 11 +++++++++++ 2 files changed, 43 insertions(+) diff --git a/spa/plugins/vulkan/vulkan-utils.c b/spa/plugins/vulkan/vulkan-utils.c index 6d682032d..81ac4a16f 100644 --- a/spa/plugins/vulkan/vulkan-utils.c +++ b/spa/plugins/vulkan/vulkan-utils.c @@ -233,6 +233,38 @@ static int createDevice(struct vulkan_base *s, struct vulkan_base_info *info) return 0; } +int vulkan_write_pixels(struct vulkan_base *s, struct vulkan_write_pixels_info *info, struct vulkan_staging_buffer *vk_sbuf) +{ + void *vmap; + VK_CHECK_RESULT(vkMapMemory(s->device, vk_sbuf->memory, 0, VK_WHOLE_SIZE, 0, &vmap)); + + char *map = (char *)vmap; + + // upload data + const char *pdata = info->data; + memcpy(map, pdata, info->stride * info->size.height); + + info->copies[0] = (VkBufferImageCopy) { + .imageExtent.width = info->size.width, + .imageExtent.height = info->size.height, + .imageExtent.depth = 1, + .imageOffset.x = 0, + .imageOffset.y = 0, + .imageOffset.z = 0, + .bufferOffset = 0, + .bufferRowLength = info->size.width, + .bufferImageHeight = info->size.height, + .imageSubresource.mipLevel = 0, + .imageSubresource.baseArrayLayer = 0, + .imageSubresource.layerCount = 1, + .imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + }; + + vkUnmapMemory(s->device, vk_sbuf->memory); + + return 0; +} + int vulkan_read_pixels(struct vulkan_base *s, struct vulkan_read_pixels_info *info, struct vulkan_buffer *vk_buf) { VkImageSubresource img_sub_res = { diff --git a/spa/plugins/vulkan/vulkan-utils.h b/spa/plugins/vulkan/vulkan-utils.h index a0f1c8e11..7a6a34f93 100644 --- a/spa/plugins/vulkan/vulkan-utils.h +++ b/spa/plugins/vulkan/vulkan-utils.h @@ -46,6 +46,16 @@ return _res; \ } +struct vulkan_write_pixels_info { + struct spa_rectangle size; + uint32_t offset; + uint32_t stride; + uint32_t bytes_per_pixel; + + VkBufferImageCopy *copies; + void *data; +}; + struct vulkan_read_pixels_info { struct spa_rectangle size; void *data; @@ -70,6 +80,7 @@ struct external_buffer_info { struct spa_buffer *spa_buf; }; +int vulkan_write_pixels(struct vulkan_base *s, struct vulkan_write_pixels_info *info, struct vulkan_staging_buffer *vk_sbuf); int vulkan_read_pixels(struct vulkan_base *s, struct vulkan_read_pixels_info *info, struct vulkan_buffer *vk_buf); int vulkan_sync_foreign_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_buf);