From 402ed65a797e000d2d59c099ec8dc586bc488e88 Mon Sep 17 00:00:00 2001 From: columbarius Date: Thu, 10 Aug 2023 02:59:36 +0200 Subject: [PATCH] vulkan: Add {spa_,}vulkan_fixate_modifier --- spa/plugins/vulkan/vulkan-compute-utils.c | 19 +++++++++++++++++++ spa/plugins/vulkan/vulkan-compute-utils.h | 2 ++ spa/plugins/vulkan/vulkan-utils.c | 21 +++++++++++++++++++++ spa/plugins/vulkan/vulkan-utils.h | 9 +++++++++ 4 files changed, 51 insertions(+) diff --git a/spa/plugins/vulkan/vulkan-compute-utils.c b/spa/plugins/vulkan/vulkan-compute-utils.c index 0796b697d..f3d514aa7 100644 --- a/spa/plugins/vulkan/vulkan-compute-utils.c +++ b/spa/plugins/vulkan/vulkan-compute-utils.c @@ -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) { diff --git a/spa/plugins/vulkan/vulkan-compute-utils.h b/spa/plugins/vulkan/vulkan-compute-utils.h index e1510b4b0..7be7bad88 100644 --- a/spa/plugins/vulkan/vulkan-compute-utils.h +++ b/spa/plugins/vulkan/vulkan-compute-utils.h @@ -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); diff --git a/spa/plugins/vulkan/vulkan-utils.c b/spa/plugins/vulkan/vulkan-utils.c index fea1b9b39..03340a2b8 100644 --- a/spa/plugins/vulkan/vulkan-utils.c +++ b/spa/plugins/vulkan/vulkan-utils.c @@ -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); diff --git a/spa/plugins/vulkan/vulkan-utils.h b/spa/plugins/vulkan/vulkan-utils.h index 25457d552..0576debc3 100644 --- a/spa/plugins/vulkan/vulkan-utils.h +++ b/spa/plugins/vulkan/vulkan-utils.h @@ -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);