mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	vulkan: Add format convertion functions
This commit is contained in:
		
							parent
							
								
									ea2a2c47c7
								
							
						
					
					
						commit
						cf0e3a35ba
					
				
					 6 changed files with 42 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -390,7 +390,7 @@ static int clear_buffers(struct impl *this, struct port *port)
 | 
			
		|||
	if (port->n_buffers > 0) {
 | 
			
		||||
		spa_log_debug(this->log, NAME " %p: clear buffers", this);
 | 
			
		||||
		spa_vulkan_stop(&this->state);
 | 
			
		||||
		spa_vulkan_use_buffers(&this->state, &this->state.streams[port->stream_id], 0, 0, NULL);
 | 
			
		||||
		spa_vulkan_use_buffers(&this->state, &this->state.streams[port->stream_id], 0, &port->current_format.info.dsp, 0, NULL);
 | 
			
		||||
		port->n_buffers = 0;
 | 
			
		||||
		spa_list_init(&port->empty);
 | 
			
		||||
		spa_list_init(&port->ready);
 | 
			
		||||
| 
						 | 
				
			
			@ -504,7 +504,7 @@ impl_node_port_use_buffers(void *object,
 | 
			
		|||
		spa_log_info(this->log, "%p: %d:%d add buffer %p", port, direction, port_id, b);
 | 
			
		||||
		spa_list_append(&port->empty, &b->link);
 | 
			
		||||
	}
 | 
			
		||||
	spa_vulkan_use_buffers(&this->state, &this->state.streams[port->stream_id], flags, n_buffers, buffers);
 | 
			
		||||
	spa_vulkan_use_buffers(&this->state, &this->state.streams[port->stream_id], flags, &port->current_format.info.dsp, n_buffers, buffers);
 | 
			
		||||
	port->n_buffers = n_buffers;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -623,7 +623,7 @@ static int clear_buffers(struct impl *this, struct port *port)
 | 
			
		|||
{
 | 
			
		||||
	if (port->n_buffers > 0) {
 | 
			
		||||
		spa_log_debug(this->log, NAME " %p: clear buffers", this);
 | 
			
		||||
		spa_vulkan_use_buffers(&this->state, &this->state.streams[0], 0, 0, NULL);
 | 
			
		||||
		spa_vulkan_use_buffers(&this->state, &this->state.streams[0], 0, &port->current_format.info.dsp, 0, NULL);
 | 
			
		||||
		port->n_buffers = 0;
 | 
			
		||||
		spa_list_init(&port->empty);
 | 
			
		||||
		spa_list_init(&port->ready);
 | 
			
		||||
| 
						 | 
				
			
			@ -739,7 +739,7 @@ impl_node_port_use_buffers(void *object,
 | 
			
		|||
		spa_log_info(this->log, "%p: %d:%d add buffer %p", port, direction, port_id, b);
 | 
			
		||||
		spa_list_append(&port->empty, &b->link);
 | 
			
		||||
	}
 | 
			
		||||
	spa_vulkan_use_buffers(&this->state, &this->state.streams[0], flags, n_buffers, buffers);
 | 
			
		||||
	spa_vulkan_use_buffers(&this->state, &this->state.streams[0], flags, &port->current_format.info.dsp, n_buffers, buffers);
 | 
			
		||||
	port->n_buffers = n_buffers;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -332,11 +332,15 @@ static void clear_streams(struct vulkan_compute_state *s)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream *p, uint32_t flags,
 | 
			
		||||
		uint32_t n_buffers, struct spa_buffer **buffers)
 | 
			
		||||
		struct spa_video_info_dsp *dsp_info, uint32_t n_buffers, struct spa_buffer **buffers)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t i;
 | 
			
		||||
	VULKAN_INSTANCE_FUNCTION(vkGetMemoryFdKHR);
 | 
			
		||||
 | 
			
		||||
	VkFormat format = vulkan_id_to_vkformat(dsp_info->format);
 | 
			
		||||
	if (format == VK_FORMAT_UNDEFINED)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	clear_buffers(s, p);
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < n_buffers; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -344,7 +348,7 @@ int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream
 | 
			
		|||
		VkImageCreateInfo imageCreateInfo = {
 | 
			
		||||
			.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
 | 
			
		||||
			.imageType = VK_IMAGE_TYPE_2D,
 | 
			
		||||
			.format = VK_FORMAT_R32G32B32A32_SFLOAT,
 | 
			
		||||
			.format = format,
 | 
			
		||||
			.extent.width = s->constants.width,
 | 
			
		||||
			.extent.height = s->constants.height,
 | 
			
		||||
			.extent.depth = 1,
 | 
			
		||||
| 
						 | 
				
			
			@ -425,7 +429,7 @@ int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream
 | 
			
		|||
			.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
 | 
			
		||||
			.image = p->buffers[i].image,
 | 
			
		||||
			.viewType = VK_IMAGE_VIEW_TYPE_2D,
 | 
			
		||||
			.format = VK_FORMAT_R32G32B32A32_SFLOAT,
 | 
			
		||||
			.format = format,
 | 
			
		||||
			.components.r = VK_COMPONENT_SWIZZLE_R,
 | 
			
		||||
			.components.g = VK_COMPONENT_SWIZZLE_G,
 | 
			
		||||
			.components.b = VK_COMPONENT_SWIZZLE_B,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@
 | 
			
		|||
#include <vulkan/vulkan.h>
 | 
			
		||||
 | 
			
		||||
#include <spa/buffer/buffer.h>
 | 
			
		||||
#include <spa/param/video/format.h>
 | 
			
		||||
#include <spa/node/node.h>
 | 
			
		||||
 | 
			
		||||
#include "vulkan-utils.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +60,7 @@ int spa_vulkan_init_stream(struct vulkan_compute_state *s, struct vulkan_stream
 | 
			
		|||
 | 
			
		||||
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,
 | 
			
		||||
		uint32_t n_buffers, struct spa_buffer **buffers);
 | 
			
		||||
		struct spa_video_info_dsp *dsp_info, uint32_t n_buffers, struct spa_buffer **buffers);
 | 
			
		||||
int spa_vulkan_unprepare(struct vulkan_compute_state *s);
 | 
			
		||||
 | 
			
		||||
int spa_vulkan_start(struct vulkan_compute_state *s);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,6 +21,7 @@
 | 
			
		|||
 | 
			
		||||
#include <spa/utils/result.h>
 | 
			
		||||
#include <spa/utils/string.h>
 | 
			
		||||
#include <spa/param/video/format.h>
 | 
			
		||||
#include <spa/support/log.h>
 | 
			
		||||
#include <spa/debug/mem.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -92,6 +93,13 @@ static int vkresult_to_errno(VkResult result)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct {
 | 
			
		||||
	VkFormat format;
 | 
			
		||||
	uint32_t id;
 | 
			
		||||
} vk_video_format_convs[] = {
 | 
			
		||||
	{ VK_FORMAT_R32G32B32A32_SFLOAT, SPA_VIDEO_FORMAT_RGBA_F32 },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int createInstance(struct vulkan_base *s)
 | 
			
		||||
{
 | 
			
		||||
	static const VkApplicationInfo applicationInfo = {
 | 
			
		||||
| 
						 | 
				
			
			@ -274,6 +282,24 @@ int vulkan_stream_init(struct vulkan_stream *stream, enum spa_direction directio
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t vulkan_vkformat_to_id(VkFormat format)
 | 
			
		||||
{
 | 
			
		||||
	SPA_FOR_EACH_ELEMENT_VAR(vk_video_format_convs, f) {
 | 
			
		||||
		if (f->format == format)
 | 
			
		||||
			return f->id;
 | 
			
		||||
	}
 | 
			
		||||
	return SPA_VIDEO_FORMAT_UNKNOWN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VkFormat vulkan_id_to_vkformat(uint32_t id)
 | 
			
		||||
{
 | 
			
		||||
	SPA_FOR_EACH_ELEMENT_VAR(vk_video_format_convs, f) {
 | 
			
		||||
		if (f->id == id)
 | 
			
		||||
			return f->format;
 | 
			
		||||
	}
 | 
			
		||||
	return VK_FORMAT_UNDEFINED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int vulkan_vkresult_to_errno(VkResult result)
 | 
			
		||||
{
 | 
			
		||||
	return vkresult_to_errno(result);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,9 @@ void vulkan_buffer_clear(struct vulkan_base *s, struct vulkan_buffer *buffer);
 | 
			
		|||
int vulkan_stream_init(struct vulkan_stream *stream, enum spa_direction direction,
 | 
			
		||||
		struct spa_dict *props);
 | 
			
		||||
 | 
			
		||||
uint32_t vulkan_vkformat_to_id(VkFormat vkFormat);
 | 
			
		||||
VkFormat vulkan_id_to_vkformat(uint32_t id);
 | 
			
		||||
 | 
			
		||||
int vulkan_vkresult_to_errno(VkResult result);
 | 
			
		||||
 | 
			
		||||
int vulkan_base_init(struct vulkan_base *s, struct vulkan_base_info *info);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue