vulkan: Add {spa_,}vulkan_fixate_modifier

This commit is contained in:
columbarius 2023-08-10 02:59:36 +02:00 committed by Wim Taymans
parent 35b080ec61
commit 402ed65a79
4 changed files with 51 additions and 0 deletions

View file

@ -325,6 +325,25 @@ static void clear_streams(struct vulkan_compute_state *s)
}
}
int spa_vulkan_fixate_modifier(struct vulkan_compute_state *s, struct vulkan_stream *p, struct spa_video_info_dsp *dsp_info,
uint32_t modifierCount, uint64_t *modifiers, uint64_t *modifier)
{
VkFormat format = vulkan_id_to_vkformat(dsp_info->format);
if (format == VK_FORMAT_UNDEFINED) {
return -1;
}
struct dmabuf_fixation_info fixation_info = {
.format = format,
.modifierCount = modifierCount,
.modifiers = modifiers,
.size.width = s->constants.width,
.size.height = s->constants.height,
.usage = VK_IMAGE_USAGE_STORAGE_BIT,
};
return vulkan_fixate_modifier(&s->base, &fixation_info, modifier);
}
int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream *p, uint32_t flags,
struct spa_video_info_dsp *dsp_info, uint32_t n_buffers, struct spa_buffer **buffers)
{

View file

@ -58,6 +58,8 @@ struct vulkan_compute_state {
int spa_vulkan_init_stream(struct vulkan_compute_state *s, struct vulkan_stream *stream, enum spa_direction,
struct spa_dict *props);
int spa_vulkan_fixate_modifier(struct vulkan_compute_state *s, struct vulkan_stream *p, struct spa_video_info_dsp *dsp_info,
uint32_t modifierCount, uint64_t *modifiers, uint64_t *modifier);
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,
struct spa_video_info_dsp *dsp_info, uint32_t n_buffers, struct spa_buffer **buffers);

View file

@ -475,6 +475,27 @@ static int allocate_dmabuf(struct vulkan_base *s, VkFormat format, uint32_t modi
return 0;
}
int vulkan_fixate_modifier(struct vulkan_base *s, struct dmabuf_fixation_info *info, uint64_t *modifier)
{
VULKAN_INSTANCE_FUNCTION(vkGetImageDrmFormatModifierPropertiesEXT);
struct vulkan_buffer vk_buf;
vk_buf.fd = -1;
vk_buf.view = VK_NULL_HANDLE;
VK_CHECK_RESULT(allocate_dmabuf(s, info->format, info->modifierCount, info->modifiers, info->usage, &info->size, &vk_buf));
VkImageDrmFormatModifierPropertiesEXT mod_prop = {
.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
};
VK_CHECK_RESULT(vkGetImageDrmFormatModifierPropertiesEXT(s->device, vk_buf.image, &mod_prop));
*modifier = mod_prop.drmFormatModifier;
vulkan_buffer_clear(s, &vk_buf);
return 0;
}
int vulkan_create_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf)
{
VULKAN_INSTANCE_FUNCTION(vkGetMemoryFdKHR);

View file

@ -36,6 +36,14 @@
return _res; \
}
struct dmabuf_fixation_info {
VkFormat format;
uint64_t modifierCount;
uint64_t *modifiers;
struct spa_rectangle size;
VkImageUsageFlags usage;
};
struct external_dmabuf_info {
VkFormat format;
uint64_t modifier;
@ -44,6 +52,7 @@ struct external_dmabuf_info {
struct spa_buffer *spa_buf;
};
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_import_dmabuf(struct vulkan_base *s, struct external_dmabuf_info *info, struct vulkan_buffer *vk_buf);