[FFmpeg-devel] [PATCH 2/2] hwcontext_vulkan: expose the enabled device features
Mark Thompson
sw at jkqxz.net
Tue May 19 22:57:16 EEST 2020
On 13/05/2020 16:53, Lynne wrote:
> With this, the puzze of making libplacebo, ffmpeg and any other Vulkan
> API users interoperable is complete.
> Users of both libraries can initialize one another's contexts without having
> to create a new one.
> > From 28264793295b0d7861527f40fa7c7041a3b34907 Mon Sep 17 00:00:00 2001
> From: Lynne <dev at lynne.ee>
> Date: Wed, 13 May 2020 16:39:00 +0100
> Subject: [PATCH 2/2] hwcontext_vulkan: expose the enabled device features
>
> With this, the puzze of making libplacebo, ffmpeg and any other Vulkan
The "puzze".
> API users interoperable is complete.
> Users of both libraries can initialize one another's contexts without having
> to create a new one.
> ---
> libavutil/hwcontext_vulkan.c | 11 +++++++++++
> libavutil/hwcontext_vulkan.h | 7 +++++++
> 2 files changed, 18 insertions(+)
>
> diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
> index 82ceb7013a..d05dd2cf5d 100644
> --- a/libavutil/hwcontext_vulkan.c
> +++ b/libavutil/hwcontext_vulkan.c
> @@ -807,6 +807,7 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
> AVDictionaryEntry *opt_d;
> VulkanDevicePriv *p = ctx->internal->priv;
> AVVulkanDeviceContext *hwctx = ctx->hwctx;
> + VkPhysicalDeviceFeatures dev_features = { 0 };
> VkDeviceQueueCreateInfo queue_create_info[3] = {
> { .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, },
> { .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, },
> @@ -815,6 +816,7 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
>
> VkDeviceCreateInfo dev_info = {
> .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
> + .pEnabledFeatures = &hwctx->device_features,
> .pQueueCreateInfos = queue_create_info,
> .queueCreateInfoCount = 0,
> };
> @@ -839,6 +841,15 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
> av_log(ctx, AV_LOG_VERBOSE, " minMemoryMapAlignment: %li\n",
> p->props.limits.minMemoryMapAlignment);
>
> + vkGetPhysicalDeviceFeatures(hwctx->phys_dev, &dev_features);
> +#define COPY_FEATURE(DST, NAME) (DST).NAME = dev_features.NAME;
> + COPY_FEATURE(hwctx->device_features, shaderImageGatherExtended)
> + COPY_FEATURE(hwctx->device_features, shaderStorageImageExtendedFormats)
> + COPY_FEATURE(hwctx->device_features, fragmentStoresAndAtomics)
> + COPY_FEATURE(hwctx->device_features, vertexPipelineStoresAndAtomics)
> + COPY_FEATURE(hwctx->device_features, shaderInt64)
> +#undef COPY_FEATURE
Forgive me if I'm being stupid here, but why can't the user run exactly the same code to find the features themselves? They do have hwctx->phys_dev.
> +
> /* Search queue family */
> if ((err = search_queue_families(ctx, &dev_info)))
> goto end;
> diff --git a/libavutil/hwcontext_vulkan.h b/libavutil/hwcontext_vulkan.h
> index 9fbe8b9dcb..b73097d514 100644
> --- a/libavutil/hwcontext_vulkan.h
> +++ b/libavutil/hwcontext_vulkan.h
> @@ -94,6 +94,13 @@ typedef struct AVVulkanDeviceContext {
> */
> const char * const *enabled_dev_extensions;
> int nb_enabled_dev_extensions;
> + /**
> + * This structure lists all device features that are present and enabled
> + * during device creation. By default, if present, shaderImageGatherExtended,
> + * shaderStorageImageExtendedFormats, fragmentStoresAndAtomics, shaderInt64,
> + * and vertexPipelineStoresAndAtomics are enabled.
And what should an API user set it to? Do they need to enable that same set of features?
> + */
> + VkPhysicalDeviceFeatures device_features;
> } AVVulkanDeviceContext;
>
> /**
> --
> 2.26.2
- Mark
More information about the ffmpeg-devel
mailing list