mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	vulkan: Split buffer import into CPU and GPU part
This commit is contained in:
		
							parent
							
								
									3f47825082
								
							
						
					
					
						commit
						75daa140f3
					
				
					 2 changed files with 36 additions and 10 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue