vulkan: Add format convertion functions

This commit is contained in:
columbarius 2023-02-21 16:29:17 +01:00 committed by Wim Taymans
parent ea2a2c47c7
commit cf0e3a35ba
6 changed files with 42 additions and 8 deletions

View file

@ -390,7 +390,7 @@ static int clear_buffers(struct impl *this, struct port *port)
if (port->n_buffers > 0) { if (port->n_buffers > 0) {
spa_log_debug(this->log, NAME " %p: clear buffers", this); spa_log_debug(this->log, NAME " %p: clear buffers", this);
spa_vulkan_stop(&this->state); 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; port->n_buffers = 0;
spa_list_init(&port->empty); spa_list_init(&port->empty);
spa_list_init(&port->ready); 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_log_info(this->log, "%p: %d:%d add buffer %p", port, direction, port_id, b);
spa_list_append(&port->empty, &b->link); 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; port->n_buffers = n_buffers;
return 0; return 0;

View file

@ -623,7 +623,7 @@ static int clear_buffers(struct impl *this, struct port *port)
{ {
if (port->n_buffers > 0) { if (port->n_buffers > 0) {
spa_log_debug(this->log, NAME " %p: clear buffers", this); 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; port->n_buffers = 0;
spa_list_init(&port->empty); spa_list_init(&port->empty);
spa_list_init(&port->ready); 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_log_info(this->log, "%p: %d:%d add buffer %p", port, direction, port_id, b);
spa_list_append(&port->empty, &b->link); 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; port->n_buffers = n_buffers;
return 0; return 0;

View file

@ -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, 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; uint32_t i;
VULKAN_INSTANCE_FUNCTION(vkGetMemoryFdKHR); VULKAN_INSTANCE_FUNCTION(vkGetMemoryFdKHR);
VkFormat format = vulkan_id_to_vkformat(dsp_info->format);
if (format == VK_FORMAT_UNDEFINED)
return -1;
clear_buffers(s, p); clear_buffers(s, p);
for (i = 0; i < n_buffers; i++) { 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 = { VkImageCreateInfo imageCreateInfo = {
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
.imageType = VK_IMAGE_TYPE_2D, .imageType = VK_IMAGE_TYPE_2D,
.format = VK_FORMAT_R32G32B32A32_SFLOAT, .format = format,
.extent.width = s->constants.width, .extent.width = s->constants.width,
.extent.height = s->constants.height, .extent.height = s->constants.height,
.extent.depth = 1, .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, .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.image = p->buffers[i].image, .image = p->buffers[i].image,
.viewType = VK_IMAGE_VIEW_TYPE_2D, .viewType = VK_IMAGE_VIEW_TYPE_2D,
.format = VK_FORMAT_R32G32B32A32_SFLOAT, .format = format,
.components.r = VK_COMPONENT_SWIZZLE_R, .components.r = VK_COMPONENT_SWIZZLE_R,
.components.g = VK_COMPONENT_SWIZZLE_G, .components.g = VK_COMPONENT_SWIZZLE_G,
.components.b = VK_COMPONENT_SWIZZLE_B, .components.b = VK_COMPONENT_SWIZZLE_B,

View file

@ -5,6 +5,7 @@
#include <vulkan/vulkan.h> #include <vulkan/vulkan.h>
#include <spa/buffer/buffer.h> #include <spa/buffer/buffer.h>
#include <spa/param/video/format.h>
#include <spa/node/node.h> #include <spa/node/node.h>
#include "vulkan-utils.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_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,
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_unprepare(struct vulkan_compute_state *s);
int spa_vulkan_start(struct vulkan_compute_state *s); int spa_vulkan_start(struct vulkan_compute_state *s);

View file

@ -21,6 +21,7 @@
#include <spa/utils/result.h> #include <spa/utils/result.h>
#include <spa/utils/string.h> #include <spa/utils/string.h>
#include <spa/param/video/format.h>
#include <spa/support/log.h> #include <spa/support/log.h>
#include <spa/debug/mem.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 int createInstance(struct vulkan_base *s)
{ {
static const VkApplicationInfo applicationInfo = { static const VkApplicationInfo applicationInfo = {
@ -274,6 +282,24 @@ int vulkan_stream_init(struct vulkan_stream *stream, enum spa_direction directio
return 0; 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) int vulkan_vkresult_to_errno(VkResult result)
{ {
return vkresult_to_errno(result); return vkresult_to_errno(result);

View file

@ -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, int vulkan_stream_init(struct vulkan_stream *stream, enum spa_direction direction,
struct spa_dict *props); 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_vkresult_to_errno(VkResult result);
int vulkan_base_init(struct vulkan_base *s, struct vulkan_base_info *info); int vulkan_base_init(struct vulkan_base *s, struct vulkan_base_info *info);