mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -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) {
|
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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue