mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	vulkan: Add functions to create staging buffers
This commit is contained in:
		
							parent
							
								
									d0e51dd066
								
							
						
					
					
						commit
						36aa413cd7
					
				
					 3 changed files with 42 additions and 0 deletions
				
			
		| 
						 | 
					@ -40,6 +40,11 @@ struct vulkan_buffer {
 | 
				
			||||||
	VkSemaphore foreign_semaphore;
 | 
						VkSemaphore foreign_semaphore;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct vulkan_staging_buffer {
 | 
				
			||||||
 | 
						VkBuffer buffer;
 | 
				
			||||||
 | 
						VkDeviceMemory memory;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct vulkan_base_info {
 | 
					struct vulkan_base_info {
 | 
				
			||||||
	uint32_t queueFlags;
 | 
						uint32_t queueFlags;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
					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 = {
 | 
						VkImageDrmFormatModifierListCreateInfoEXT imageDrmFormatModifierListCreateInfo = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
					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);
 | 
					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_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_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);
 | 
					int vulkan_create_dmabuf(struct vulkan_base *s, struct external_buffer_info *info, struct vulkan_buffer *vk_buf);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue