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) {
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;

View file

@ -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;

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,
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,

View file

@ -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);

View file

@ -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);

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,
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);