vulkan: Add functions to create staging buffers

This commit is contained in:
columbarius 2023-08-09 10:51:11 +02:00 committed by Wim Taymans
parent d0e51dd066
commit 36aa413cd7
3 changed files with 42 additions and 0 deletions

View file

@ -40,6 +40,11 @@ struct vulkan_buffer {
VkSemaphore foreign_semaphore;
};
struct vulkan_staging_buffer {
VkBuffer buffer;
VkDeviceMemory memory;
};
struct vulkan_base_info {
uint32_t queueFlags;
};

View file

@ -412,6 +412,40 @@ static VkImageAspectFlagBits mem_plane_aspect(uint32_t i)
}
}
int vulkan_staging_buffer_create(struct vulkan_base *s, uint32_t size, struct vulkan_staging_buffer *s_buf) {
VkBufferCreateInfo buf_info = {
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.size = size,
.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT |
VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
};
VK_CHECK_RESULT(vkCreateBuffer(s->device, &buf_info, NULL, &s_buf->buffer));
VkMemoryRequirements memoryRequirements;
vkGetBufferMemoryRequirements(s->device, s_buf->buffer, &memoryRequirements);
VkMemoryAllocateInfo mem_info = {
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
.allocationSize = memoryRequirements.size,
.memoryTypeIndex = vulkan_memoryType_find(s,
memoryRequirements.memoryTypeBits,
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT),
};
VK_CHECK_RESULT(vkAllocateMemory(s->device, &mem_info, NULL, &s_buf->memory));
VK_CHECK_RESULT(vkBindBufferMemory(s->device, s_buf->buffer, s_buf->memory, 0));
return 0;
}
void vulkan_staging_buffer_destroy(struct vulkan_base *s, struct vulkan_staging_buffer *s_buf) {
if (s_buf->buffer == VK_NULL_HANDLE)
return;
vkFreeMemory(s->device, s_buf->memory, NULL);
vkDestroyBuffer(s->device, s_buf->buffer, NULL);
}
static int allocate_dmabuf(struct vulkan_base *s, VkFormat format, uint32_t modifierCount, uint64_t *modifiers, VkImageUsageFlags usage, struct spa_rectangle *size, struct vulkan_buffer *vk_buf)
{
VkImageDrmFormatModifierListCreateInfoEXT imageDrmFormatModifierListCreateInfo = {

View file

@ -75,6 +75,9 @@ 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);
bool vulkan_sync_export_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd);
int vulkan_staging_buffer_create(struct vulkan_base *s, uint32_t size, struct vulkan_staging_buffer *s_buf);
void vulkan_staging_buffer_destroy(struct vulkan_base *s, struct vulkan_staging_buffer *s_buf);
int vulkan_validate_dmabuf_properties(const struct vulkan_modifier_info *modInfo, uint32_t *planeCount, struct spa_rectangle *dim);
int vulkan_fixate_modifier(struct vulkan_base *s, struct dmabuf_fixation_info *info, uint64_t *modifier);
int vulkan_create_dmabuf(struct vulkan_base *s, struct external_buffer_info *info, struct vulkan_buffer *vk_buf);