mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	vulkan: Add {spa_,}vulkan_fixate_modifier
This commit is contained in:
		
							parent
							
								
									35b080ec61
								
							
						
					
					
						commit
						402ed65a79
					
				
					 4 changed files with 51 additions and 0 deletions
				
			
		| 
						 | 
					@ -325,6 +325,25 @@ static void clear_streams(struct vulkan_compute_state *s)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int spa_vulkan_fixate_modifier(struct vulkan_compute_state *s, struct vulkan_stream *p, struct spa_video_info_dsp *dsp_info,
 | 
				
			||||||
 | 
							uint32_t modifierCount, uint64_t *modifiers, uint64_t *modifier)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						VkFormat format = vulkan_id_to_vkformat(dsp_info->format);
 | 
				
			||||||
 | 
						if (format == VK_FORMAT_UNDEFINED) {
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct dmabuf_fixation_info fixation_info = {
 | 
				
			||||||
 | 
							.format = format,
 | 
				
			||||||
 | 
							.modifierCount = modifierCount,
 | 
				
			||||||
 | 
							.modifiers = modifiers,
 | 
				
			||||||
 | 
							.size.width = s->constants.width,
 | 
				
			||||||
 | 
							.size.height = s->constants.height,
 | 
				
			||||||
 | 
							.usage = VK_IMAGE_USAGE_STORAGE_BIT,
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						return vulkan_fixate_modifier(&s->base, &fixation_info, modifier);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream *p, uint32_t flags,
 | 
					int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream *p, uint32_t flags,
 | 
				
			||||||
		struct spa_video_info_dsp *dsp_info, uint32_t n_buffers, struct spa_buffer **buffers)
 | 
							struct spa_video_info_dsp *dsp_info, uint32_t n_buffers, struct spa_buffer **buffers)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,6 +58,8 @@ struct vulkan_compute_state {
 | 
				
			||||||
int spa_vulkan_init_stream(struct vulkan_compute_state *s, struct vulkan_stream *stream, enum spa_direction,
 | 
					int spa_vulkan_init_stream(struct vulkan_compute_state *s, struct vulkan_stream *stream, enum spa_direction,
 | 
				
			||||||
		struct spa_dict *props);
 | 
							struct spa_dict *props);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int spa_vulkan_fixate_modifier(struct vulkan_compute_state *s, struct vulkan_stream *p, struct spa_video_info_dsp *dsp_info,
 | 
				
			||||||
 | 
							uint32_t modifierCount, uint64_t *modifiers, uint64_t *modifier);
 | 
				
			||||||
int spa_vulkan_prepare(struct vulkan_compute_state *s);
 | 
					int spa_vulkan_prepare(struct vulkan_compute_state *s);
 | 
				
			||||||
int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream *stream, uint32_t flags,
 | 
					int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream *stream, uint32_t flags,
 | 
				
			||||||
		struct spa_video_info_dsp *dsp_info, uint32_t n_buffers, struct spa_buffer **buffers);
 | 
							struct spa_video_info_dsp *dsp_info, uint32_t n_buffers, struct spa_buffer **buffers);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -475,6 +475,27 @@ static int allocate_dmabuf(struct vulkan_base *s, VkFormat format, uint32_t modi
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int vulkan_fixate_modifier(struct vulkan_base *s, struct dmabuf_fixation_info *info, uint64_t *modifier)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						VULKAN_INSTANCE_FUNCTION(vkGetImageDrmFormatModifierPropertiesEXT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct vulkan_buffer vk_buf;
 | 
				
			||||||
 | 
						vk_buf.fd = -1;
 | 
				
			||||||
 | 
						vk_buf.view = VK_NULL_HANDLE;
 | 
				
			||||||
 | 
						VK_CHECK_RESULT(allocate_dmabuf(s, info->format, info->modifierCount, info->modifiers, info->usage, &info->size, &vk_buf));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						VkImageDrmFormatModifierPropertiesEXT mod_prop = {
 | 
				
			||||||
 | 
							.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						VK_CHECK_RESULT(vkGetImageDrmFormatModifierPropertiesEXT(s->device, vk_buf.image, &mod_prop));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*modifier = mod_prop.drmFormatModifier;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						vulkan_buffer_clear(s, &vk_buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int vulkan_create_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf)
 | 
					int vulkan_create_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	VULKAN_INSTANCE_FUNCTION(vkGetMemoryFdKHR);
 | 
						VULKAN_INSTANCE_FUNCTION(vkGetMemoryFdKHR);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,6 +36,14 @@
 | 
				
			||||||
		return _res;								\
 | 
							return _res;								\
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct dmabuf_fixation_info {
 | 
				
			||||||
 | 
						VkFormat format;
 | 
				
			||||||
 | 
						uint64_t modifierCount;
 | 
				
			||||||
 | 
						uint64_t *modifiers;
 | 
				
			||||||
 | 
						struct spa_rectangle size;
 | 
				
			||||||
 | 
						VkImageUsageFlags usage;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct external_dmabuf_info {
 | 
					struct external_dmabuf_info {
 | 
				
			||||||
	VkFormat format;
 | 
						VkFormat format;
 | 
				
			||||||
	uint64_t modifier;
 | 
						uint64_t modifier;
 | 
				
			||||||
| 
						 | 
					@ -44,6 +52,7 @@ struct external_dmabuf_info {
 | 
				
			||||||
	struct spa_buffer *spa_buf;
 | 
						struct spa_buffer *spa_buf;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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_dmabuf_info *info, struct vulkan_buffer *vk_buf);
 | 
					int vulkan_create_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf);
 | 
				
			||||||
int vulkan_import_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf);
 | 
					int vulkan_import_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue