mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
vulkan: spa_vulkan_use_buffers support datatype MemPtr
This commit is contained in:
parent
eea8096b12
commit
73d6c20225
3 changed files with 83 additions and 9 deletions
|
|
@ -469,7 +469,7 @@ int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream
|
||||||
for (uint32_t i = 0; i < n_buffers; i++) {
|
for (uint32_t i = 0; i < n_buffers; i++) {
|
||||||
if (alloc) {
|
if (alloc) {
|
||||||
if (SPA_FLAG_IS_SET(buffers[i]->datas[0].type, 1<<SPA_DATA_DmaBuf)) {
|
if (SPA_FLAG_IS_SET(buffers[i]->datas[0].type, 1<<SPA_DATA_DmaBuf)) {
|
||||||
struct external_dmabuf_info dmabuf_info = {
|
struct external_buffer_info dmabufInfo = {
|
||||||
.format = format,
|
.format = format,
|
||||||
.modifier = dsp_info->modifier,
|
.modifier = dsp_info->modifier,
|
||||||
.size.width = s->constants.width,
|
.size.width = s->constants.width,
|
||||||
|
|
@ -479,7 +479,7 @@ int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream
|
||||||
: VK_IMAGE_USAGE_SAMPLED_BIT,
|
: VK_IMAGE_USAGE_SAMPLED_BIT,
|
||||||
.spa_buf = buffers[i],
|
.spa_buf = buffers[i],
|
||||||
};
|
};
|
||||||
ret = vulkan_create_dmabuf(&s->base, &dmabuf_info, &p->buffers[i]);
|
ret = vulkan_create_dmabuf(&s->base, &dmabufInfo, &p->buffers[i]);
|
||||||
} else {
|
} else {
|
||||||
spa_log_error(s->log, "Unsupported buffer type mask %d", buffers[i]->datas[0].type);
|
spa_log_error(s->log, "Unsupported buffer type mask %d", buffers[i]->datas[0].type);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -487,7 +487,7 @@ int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream
|
||||||
} else {
|
} else {
|
||||||
switch (buffers[i]->datas[0].type) {
|
switch (buffers[i]->datas[0].type) {
|
||||||
case SPA_DATA_DmaBuf:;
|
case SPA_DATA_DmaBuf:;
|
||||||
struct external_dmabuf_info dmabuf_info = {
|
struct external_buffer_info dmabufInfo = {
|
||||||
.format = format,
|
.format = format,
|
||||||
.modifier = dsp_info->modifier,
|
.modifier = dsp_info->modifier,
|
||||||
.size.width = s->constants.width,
|
.size.width = s->constants.width,
|
||||||
|
|
@ -497,7 +497,19 @@ int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream
|
||||||
: VK_IMAGE_USAGE_SAMPLED_BIT,
|
: VK_IMAGE_USAGE_SAMPLED_BIT,
|
||||||
.spa_buf = buffers[i],
|
.spa_buf = buffers[i],
|
||||||
};
|
};
|
||||||
ret = vulkan_import_dmabuf(&s->base, &dmabuf_info, &p->buffers[i]);
|
ret = vulkan_import_dmabuf(&s->base, &dmabufInfo, &p->buffers[i]);
|
||||||
|
break;
|
||||||
|
case SPA_DATA_MemPtr:;
|
||||||
|
struct external_buffer_info memptrInfo = {
|
||||||
|
.format = format,
|
||||||
|
.size.width = s->constants.width,
|
||||||
|
.size.height = s->constants.height,
|
||||||
|
.usage = p->direction == SPA_DIRECTION_OUTPUT
|
||||||
|
? VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT
|
||||||
|
: VK_IMAGE_USAGE_SAMPLED_BIT,
|
||||||
|
.spa_buf = buffers[i],
|
||||||
|
};
|
||||||
|
ret = vulkan_import_memptr(&s->base, &memptrInfo, &p->buffers[i]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
spa_log_error(s->log, "Unsupported buffer type %d", buffers[i]->datas[0].type);
|
spa_log_error(s->log, "Unsupported buffer type %d", buffers[i]->datas[0].type);
|
||||||
|
|
|
||||||
|
|
@ -559,7 +559,7 @@ int vulkan_fixate_modifier(struct vulkan_base *s, struct dmabuf_fixation_info *i
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vulkan_create_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf)
|
int vulkan_create_dmabuf(struct vulkan_base *s, struct external_buffer_info *info, struct vulkan_buffer *vk_buf)
|
||||||
{
|
{
|
||||||
VULKAN_INSTANCE_FUNCTION(vkGetMemoryFdKHR);
|
VULKAN_INSTANCE_FUNCTION(vkGetMemoryFdKHR);
|
||||||
|
|
||||||
|
|
@ -624,7 +624,7 @@ int vulkan_create_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *inf
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vulkan_import_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf)
|
int vulkan_import_dmabuf(struct vulkan_base *s, struct external_buffer_info *info, struct vulkan_buffer *vk_buf)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (info->spa_buf->n_datas == 0 || info->spa_buf->n_datas > DMABUF_MAX_PLANES)
|
if (info->spa_buf->n_datas == 0 || info->spa_buf->n_datas > DMABUF_MAX_PLANES)
|
||||||
|
|
@ -728,6 +728,67 @@ int vulkan_import_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *inf
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int vulkan_import_memptr(struct vulkan_base *s, struct external_buffer_info *info, struct vulkan_buffer *vk_buf)
|
||||||
|
{
|
||||||
|
VkImageCreateInfo imageCreateInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
|
||||||
|
.imageType = VK_IMAGE_TYPE_2D,
|
||||||
|
.format = info->format,
|
||||||
|
.extent.width = info->size.width,
|
||||||
|
.extent.height = info->size.height,
|
||||||
|
.extent.depth = 1,
|
||||||
|
.mipLevels = 1,
|
||||||
|
.arrayLayers = 1,
|
||||||
|
.samples = VK_SAMPLE_COUNT_1_BIT,
|
||||||
|
.tiling = VK_IMAGE_TILING_LINEAR,
|
||||||
|
.usage = info->usage,
|
||||||
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
||||||
|
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
|
||||||
|
};
|
||||||
|
|
||||||
|
VK_CHECK_RESULT(vkCreateImage(s->device,
|
||||||
|
&imageCreateInfo, NULL, &vk_buf->image));
|
||||||
|
|
||||||
|
VkMemoryRequirements memoryRequirements;
|
||||||
|
vkGetImageMemoryRequirements(s->device,
|
||||||
|
vk_buf->image, &memoryRequirements);
|
||||||
|
|
||||||
|
VkMemoryAllocateInfo allocateInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
|
||||||
|
.allocationSize = memoryRequirements.size,
|
||||||
|
.memoryTypeIndex = vulkan_memoryType_find(s,
|
||||||
|
memoryRequirements.memoryTypeBits,
|
||||||
|
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
|
||||||
|
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT),
|
||||||
|
};
|
||||||
|
|
||||||
|
vk_buf->fd = -1;
|
||||||
|
spa_log_info(s->log, "import MemPtr");
|
||||||
|
|
||||||
|
VK_CHECK_RESULT(vkAllocateMemory(s->device,
|
||||||
|
&allocateInfo, NULL, &vk_buf->memory));
|
||||||
|
VK_CHECK_RESULT(vkBindImageMemory(s->device,
|
||||||
|
vk_buf->image, vk_buf->memory, 0));
|
||||||
|
|
||||||
|
VkImageViewCreateInfo viewInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
||||||
|
.image = vk_buf->image,
|
||||||
|
.viewType = VK_IMAGE_VIEW_TYPE_2D,
|
||||||
|
.format = info->format,
|
||||||
|
.components.r = VK_COMPONENT_SWIZZLE_R,
|
||||||
|
.components.g = VK_COMPONENT_SWIZZLE_G,
|
||||||
|
.components.b = VK_COMPONENT_SWIZZLE_B,
|
||||||
|
.components.a = VK_COMPONENT_SWIZZLE_A,
|
||||||
|
.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
|
.subresourceRange.levelCount = 1,
|
||||||
|
.subresourceRange.layerCount = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
VK_CHECK_RESULT(vkCreateImageView(s->device,
|
||||||
|
&viewInfo, NULL, &vk_buf->view));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ struct dmabuf_fixation_info {
|
||||||
VkImageUsageFlags usage;
|
VkImageUsageFlags usage;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct external_dmabuf_info {
|
struct external_buffer_info {
|
||||||
VkFormat format;
|
VkFormat format;
|
||||||
uint64_t modifier;
|
uint64_t modifier;
|
||||||
struct spa_rectangle size;
|
struct spa_rectangle size;
|
||||||
|
|
@ -66,8 +66,9 @@ int vulkan_sync_foreign_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_b
|
||||||
bool vulkan_sync_export_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd);
|
bool vulkan_sync_export_dmabuf(struct vulkan_base *s, struct vulkan_buffer *vk_buf, int sync_file_fd);
|
||||||
|
|
||||||
int vulkan_fixate_modifier(struct vulkan_base *s, struct dmabuf_fixation_info *info, uint64_t *modifier);
|
int vulkan_fixate_modifier(struct vulkan_base *s, struct dmabuf_fixation_info *info, uint64_t *modifier);
|
||||||
int vulkan_create_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf);
|
int vulkan_create_dmabuf(struct vulkan_base *s, struct external_buffer_info *info, struct vulkan_buffer *vk_buf);
|
||||||
int vulkan_import_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf);
|
int vulkan_import_dmabuf(struct vulkan_base *s, struct external_buffer_info *info, struct vulkan_buffer *vk_buf);
|
||||||
|
int vulkan_import_memptr(struct vulkan_base *s, struct external_buffer_info *info, struct vulkan_buffer *vk_buf);
|
||||||
|
|
||||||
int vulkan_commandPool_create(struct vulkan_base *s, VkCommandPool *commandPool);
|
int vulkan_commandPool_create(struct vulkan_base *s, VkCommandPool *commandPool);
|
||||||
int vulkan_commandBuffer_create(struct vulkan_base *s, VkCommandPool commandPool, VkCommandBuffer *commandBuffer);
|
int vulkan_commandBuffer_create(struct vulkan_base *s, VkCommandPool commandPool, VkCommandBuffer *commandBuffer);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue