Allows for it to be reused. --- libavutil/hwcontext_vulkan.c | 42 ++++++------------------------------ libavutil/vulkan.c | 34 +++++++++++++++++++++++++++++ libavutil/vulkan.h | 6 ++++++ 3 files changed, 46 insertions(+), 36 deletions(-)
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index d7822d4629..e9fa734518 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -437,40 +437,6 @@ static const struct FFVkFormatEntry *vk_find_format_entry(enum AVPixelFormat p) return NULL; } -/* Malitia pura, Khronos */ -#define FN_MAP_TO(dst_t, dst_name, src_t, src_name) \ - static av_unused dst_t map_ ##src_name## _to_ ##dst_name(src_t src) \ - { \ - dst_t dst = 0x0; \ - MAP_TO(VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT, \ - VK_IMAGE_USAGE_SAMPLED_BIT); \ - MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT, \ - VK_IMAGE_USAGE_TRANSFER_SRC_BIT); \ - MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT, \ - VK_IMAGE_USAGE_TRANSFER_DST_BIT); \ - MAP_TO(VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT, \ - VK_IMAGE_USAGE_STORAGE_BIT); \ - MAP_TO(VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT, \ - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); \ - MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR, \ - VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR); \ - MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR, \ - VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR); \ - MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR, \ - VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR); \ - MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR, \ - VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR); \ - return dst; \ - } - -#define MAP_TO(flag1, flag2) if (src & flag2) dst |= flag1; -FN_MAP_TO(VkFormatFeatureFlagBits2, feats, VkImageUsageFlags, usage) -#undef MAP_TO -#define MAP_TO(flag1, flag2) if (src & flag1) dst |= flag2; -FN_MAP_TO(VkImageUsageFlags, usage, VkFormatFeatureFlagBits2, feats) -#undef MAP_TO -#undef FN_MAP_TO - static int vkfmt_from_pixfmt2(AVHWDeviceContext *dev_ctx, enum AVPixelFormat p, VkImageTiling tiling, VkFormat fmts[AV_NUM_DATA_POINTERS], /* Output format list */ @@ -538,7 +504,7 @@ static int vkfmt_from_pixfmt2(AVHWDeviceContext *dev_ctx, enum AVPixelFormat p, if (aspect) *aspect = vk_formats_list[i].aspect; if (supported_usage) - *supported_usage = map_feats_to_usage(feats_primary) | + *supported_usage = ff_vk_map_feats_to_usage(feats_primary) | ((need_storage && (storage_primary | storage_secondary)) ? VK_IMAGE_USAGE_STORAGE_BIT : 0); return 0; @@ -553,7 +519,7 @@ static int vkfmt_from_pixfmt2(AVHWDeviceContext *dev_ctx, enum AVPixelFormat p, if (aspect) *aspect = vk_formats_list[i].aspect; if (supported_usage) - *supported_usage = map_feats_to_usage(feats_secondary); + *supported_usage = ff_vk_map_feats_to_usage(feats_secondary); return 0; } else { return AVERROR(ENOTSUP); @@ -2681,6 +2647,10 @@ static AVBufferRef *vulkan_pool_alloc(void *opaque, size_t size) VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT); #endif + if (p->vkctx.extensions & FF_VK_EXT_EXTERNAL_DMABUF_MEMORY) + try_export_flags(hwfc, &eiinfo.handleTypes, &e, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT); + for (int i = 0; i < av_pix_fmt_count_planes(hwfc->sw_format); i++) { eminfo[i].sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO; eminfo[i].pNext = hwctx->alloc_pnext[i]; diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c index 8b02abecf1..8ab977c734 100644 --- a/libavutil/vulkan.c +++ b/libavutil/vulkan.c @@ -84,6 +84,40 @@ const char *ff_vk_ret2str(VkResult res) #undef CASE } +/* Malitia pura, Khronos */ +#define FN_MAP_TO(dst_t, dst_name, src_t, src_name) \ + dst_t ff_vk_map_ ##src_name## _to_ ##dst_name(src_t src) \ + { \ + dst_t dst = 0x0; \ + MAP_TO(VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT, \ + VK_IMAGE_USAGE_SAMPLED_BIT); \ + MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT, \ + VK_IMAGE_USAGE_TRANSFER_SRC_BIT); \ + MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT, \ + VK_IMAGE_USAGE_TRANSFER_DST_BIT); \ + MAP_TO(VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT, \ + VK_IMAGE_USAGE_STORAGE_BIT); \ + MAP_TO(VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT, \ + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); \ + MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR, \ + VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR); \ + MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR, \ + VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR); \ + MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR, \ + VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR); \ + MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR, \ + VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR); \ + return dst; \ + } + +#define MAP_TO(flag1, flag2) if (src & flag2) dst |= flag1; +FN_MAP_TO(VkFormatFeatureFlagBits2, feats, VkImageUsageFlags, usage) +#undef MAP_TO +#define MAP_TO(flag1, flag2) if (src & flag1) dst |= flag2; +FN_MAP_TO(VkImageUsageFlags, usage, VkFormatFeatureFlagBits2, feats) +#undef MAP_TO +#undef FN_MAP_TO + static void load_enabled_qfs(FFVulkanContext *s) { s->nb_qfs = 0; diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h index 2fb7f7c2de..49f015ae9d 100644 --- a/libavutil/vulkan.h +++ b/libavutil/vulkan.h @@ -364,6 +364,12 @@ int ff_vk_init(FFVulkanContext *s, void *log_parent, */ const char *ff_vk_ret2str(VkResult res); +/** + * Map between usage and features. + */ +VkImageUsageFlags ff_vk_map_feats_to_usage(VkFormatFeatureFlagBits2 feats); +VkFormatFeatureFlagBits2 ff_vk_map_usage_to_feats(VkImageUsageFlags usage); + /** * Returns 1 if pixfmt is a usable RGB format. */ -- 2.49.0.395.g12beb8f557c _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".