[FFmpeg-devel] [PATCH 2/2] hwcontext_vulkan: expose the enabled device features

Mark Thompson sw at jkqxz.net
Thu May 21 00:56:46 EEST 2020


On 19/05/2020 21:56, Lynne wrote:
> May 19, 2020, 20:57 by sw at jkqxz.net:
> 
>> 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".
>>
> 
> Fixed.
> 
> 
> 
>>> 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.
>>
> 
> vkGetPhysicalDeviceFeatures gets the list of features the device supports.
> You have to manually put the ones you enable in the VkDeviceCreateInfo struct.
> Even after you do that, vkGetPhysicalDeviceFeatures still gives you the features the device
> supports, not what you've enabled. There's no way to get any enabled features or extensions
> for a device or an instance after its created, but only what's supported.

Ok.  (Sorry, I misread the order of these - I thought you were copying out after vkCreateDevice() rather than setting before.)

>>> +
>>>  /* 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?
>>
> 
> The API user can set it to whatever they have enabled in their VkDeviceCreateInfo struct.
> They don't need to have the same extensions enabled. We don't (and won't) depend on any
> extensions, but optionally use them if they're enabled.
> Not sure how to make this clearer.

Something like:

This structure should be set to the set of features that present and enabled during
device creation - that is, it should be a copy of the pEnabledFeatures field passed in
VkDeviceCreateInfo to vkCreateDevice().  When a device is created by FFmpeg, it will
default to enabling all that are present of the shaderImageGatherExtended,
fragmentStoresAndAtomics, shaderInt64 and vertexPipelineStoresAndAtomics features.

> @@ -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,
> +        .pNext                = &hwctx->device_features,
>          .pQueueCreateInfos    = queue_create_info,
>          .queueCreateInfoCount = 0,
>      };

"Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of ... [big list which does not include VkPhysicalDeviceFeatures]."  Was that meant to be VkPhysicalDeviceFeatures2?

- Mark


More information about the ffmpeg-devel mailing list