diff --git a/spa/plugins/vulkan/vulkan-compute-filter.c b/spa/plugins/vulkan/vulkan-compute-filter.c index 8fb7f6515..ab51f42e3 100644 --- a/spa/plugins/vulkan/vulkan-compute-filter.c +++ b/spa/plugins/vulkan/vulkan-compute-filter.c @@ -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; diff --git a/spa/plugins/vulkan/vulkan-compute-source.c b/spa/plugins/vulkan/vulkan-compute-source.c index b15cfbc6d..980ee1e96 100644 --- a/spa/plugins/vulkan/vulkan-compute-source.c +++ b/spa/plugins/vulkan/vulkan-compute-source.c @@ -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; diff --git a/spa/plugins/vulkan/vulkan-compute-utils.c b/spa/plugins/vulkan/vulkan-compute-utils.c index 066614c81..76125c746 100644 --- a/spa/plugins/vulkan/vulkan-compute-utils.c +++ b/spa/plugins/vulkan/vulkan-compute-utils.c @@ -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, diff --git a/spa/plugins/vulkan/vulkan-compute-utils.h b/spa/plugins/vulkan/vulkan-compute-utils.h index 81d9c9e27..e1510b4b0 100644 --- a/spa/plugins/vulkan/vulkan-compute-utils.h +++ b/spa/plugins/vulkan/vulkan-compute-utils.h @@ -5,6 +5,7 @@ #include #include +#include #include #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); diff --git a/spa/plugins/vulkan/vulkan-utils.c b/spa/plugins/vulkan/vulkan-utils.c index 4ee933d5b..5c42b4d42 100644 --- a/spa/plugins/vulkan/vulkan-utils.c +++ b/spa/plugins/vulkan/vulkan-utils.c @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -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); diff --git a/spa/plugins/vulkan/vulkan-utils.h b/spa/plugins/vulkan/vulkan-utils.h index ed1e2a4c0..de9a4a670 100644 --- a/spa/plugins/vulkan/vulkan-utils.h +++ b/spa/plugins/vulkan/vulkan-utils.h @@ -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);