diff mbox series

[FFmpeg-devel] avutil/hwcontext_vulkan: fix run on macOS

Message ID tencent_E37C7AAC8A39CDC271B63069AE01F9692A0A@qq.com
State New
Headers show
Series [FFmpeg-devel] avutil/hwcontext_vulkan: fix run on macOS | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Zhao Zhili Oct. 30, 2023, 8:17 a.m. UTC
From: Zhao Zhili <zhilizhao@tencent.com>

VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME is required on macOS,
and VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR flag should
be set.
---
 libavutil/hwcontext_vulkan.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

Comments

Zhao Zhili Nov. 7, 2023, 11:24 a.m. UTC | #1
Ping.

> 在 2023年10月30日,下午4:17,Zhao Zhili <quinkblack@foxmail.com> 写道:
> 
> From: Zhao Zhili <zhilizhao@tencent.com>
> 
> VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME is required on macOS,
> and VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR flag should
> be set.
> ---
> libavutil/hwcontext_vulkan.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
> index 8481427b42..9fbf61ee70 100644
> --- a/libavutil/hwcontext_vulkan.c
> +++ b/libavutil/hwcontext_vulkan.c
> @@ -405,7 +405,6 @@ typedef struct VulkanOptExtension {
> } VulkanOptExtension;
> 
> static const VulkanOptExtension optional_instance_exts[] = {
> -    /* Pointless, here avoid zero-sized structs */
>     { VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,          FF_VK_EXT_NO_FLAG                },
> };
> 
> @@ -784,6 +783,14 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
>         inst_props.pNext = &validation_features;
>     }
> 
> +    for (int i = 0; i < inst_props.enabledExtensionCount; i++) {
> +        if (!strcmp(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,
> +                    inst_props.ppEnabledExtensionNames[i])) {
> +            inst_props.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
> +            break;
> +        }
> +    }
> +
>     /* Try to create the instance */
>     ret = vk->CreateInstance(&inst_props, hwctx->alloc, &hwctx->inst);
> 
> --
> 2.42.0
>
Lynne Nov. 7, 2023, 11:42 a.m. UTC | #2
Nov 7, 2023, 12:25 by quinkblack@foxmail.com:

> Ping.
>
>> 在 2023年10月30日,下午4:17,Zhao Zhili <quinkblack@foxmail.com> 写道:
>>
>> From: Zhao Zhili <zhilizhao@tencent.com>
>>
>> VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME is required on macOS,
>> and VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR flag should
>> be set.
>> ---
>> libavutil/hwcontext_vulkan.c | 9 ++++++++-
>> 1 file changed, 8 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
>> index 8481427b42..9fbf61ee70 100644
>> --- a/libavutil/hwcontext_vulkan.c
>> +++ b/libavutil/hwcontext_vulkan.c
>> @@ -405,7 +405,6 @@ typedef struct VulkanOptExtension {
>> } VulkanOptExtension;
>>
>> static const VulkanOptExtension optional_instance_exts[] = {
>> -    /* Pointless, here avoid zero-sized structs */
>>  { VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,          FF_VK_EXT_NO_FLAG                },
>> };
>>
>> @@ -784,6 +783,14 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
>>  inst_props.pNext = &validation_features;
>>  }
>>
>> +    for (int i = 0; i < inst_props.enabledExtensionCount; i++) {
>> +        if (!strcmp(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,
>> +                    inst_props.ppEnabledExtensionNames[i])) {
>> +            inst_props.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
>> +            break;
>> +        }
>> +    }
>> +
>>  /* Try to create the instance */
>>  ret = vk->CreateInstance(&inst_props, hwctx->alloc, &hwctx->inst);
>>

Pong. It is a bit incorrect - from memory,
VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR requires that
only Vulkan 1.1 features are enabled, while we require 1.3.
But if it works, sure. Could you ifdef it out everywhere outside of OSX?
Marvin Scholz Nov. 7, 2023, 12:46 p.m. UTC | #3
On 7 Nov 2023, at 12:42, Lynne wrote:

> Nov 7, 2023, 12:25 by quinkblack@foxmail.com:
>
>> Ping.
>>
>>> 在 2023年10月30日,下午4:17,Zhao Zhili <quinkblack@foxmail.com> 写道:
>>>
>>> From: Zhao Zhili <zhilizhao@tencent.com>
>>>
>>> VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME is required on macOS,
>>> and VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR flag should
>>> be set.
>>> ---
>>> libavutil/hwcontext_vulkan.c | 9 ++++++++-
>>> 1 file changed, 8 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
>>> index 8481427b42..9fbf61ee70 100644
>>> --- a/libavutil/hwcontext_vulkan.c
>>> +++ b/libavutil/hwcontext_vulkan.c
>>> @@ -405,7 +405,6 @@ typedef struct VulkanOptExtension {
>>> } VulkanOptExtension;
>>>
>>> static const VulkanOptExtension optional_instance_exts[] = {
>>> -    /* Pointless, here avoid zero-sized structs */
>>>  { VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,          FF_VK_EXT_NO_FLAG                },
>>> };
>>>
>>> @@ -784,6 +783,14 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
>>>  inst_props.pNext = &validation_features;
>>>  }
>>>
>>> +    for (int i = 0; i < inst_props.enabledExtensionCount; i++) {
>>> +        if (!strcmp(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,
>>> +                    inst_props.ppEnabledExtensionNames[i])) {
>>> +            inst_props.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
>>> +            break;
>>> +        }
>>> +    }
>>> +
>>>  /* Try to create the instance */
>>>  ret = vk->CreateInstance(&inst_props, hwctx->alloc, &hwctx->inst);
>>>
>
> Pong. It is a bit incorrect - from memory,
> VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR requires that
> only Vulkan 1.1 features are enabled, while we require 1.3.
> But if it works, sure. Could you ifdef it out everywhere outside of OSX?

I wonder, how is this working given that MoltenVK does not provide Vulkan 1.3
but only 1.2?

> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Zhao Zhili Nov. 7, 2023, 2:01 p.m. UTC | #4
> On Nov 7, 2023, at 20:46, epirat07@gmail.com wrote:
> 
> 
> 
> On 7 Nov 2023, at 12:42, Lynne wrote:
> 
>> Nov 7, 2023, 12:25 by quinkblack@foxmail.com:
>> 
>>> Ping.
>>> 
>>>> 在 2023年10月30日,下午4:17,Zhao Zhili <quinkblack@foxmail.com> 写道:
>>>> 
>>>> From: Zhao Zhili <zhilizhao@tencent.com>
>>>> 
>>>> VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME is required on macOS,
>>>> and VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR flag should
>>>> be set.
>>>> ---
>>>> libavutil/hwcontext_vulkan.c | 9 ++++++++-
>>>> 1 file changed, 8 insertions(+), 1 deletion(-)
>>>> 
>>>> diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
>>>> index 8481427b42..9fbf61ee70 100644
>>>> --- a/libavutil/hwcontext_vulkan.c
>>>> +++ b/libavutil/hwcontext_vulkan.c
>>>> @@ -405,7 +405,6 @@ typedef struct VulkanOptExtension {
>>>> } VulkanOptExtension;
>>>> 
>>>> static const VulkanOptExtension optional_instance_exts[] = {
>>>> -    /* Pointless, here avoid zero-sized structs */
>>>> { VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,          FF_VK_EXT_NO_FLAG                },
>>>> };
>>>> 
>>>> @@ -784,6 +783,14 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
>>>> inst_props.pNext = &validation_features;
>>>> }
>>>> 
>>>> +    for (int i = 0; i < inst_props.enabledExtensionCount; i++) {
>>>> +        if (!strcmp(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,
>>>> +                    inst_props.ppEnabledExtensionNames[i])) {
>>>> +            inst_props.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
>>>> +            break;
>>>> +        }
>>>> +    }
>>>> +
>>>> /* Try to create the instance */
>>>> ret = vk->CreateInstance(&inst_props, hwctx->alloc, &hwctx->inst);
>>>> 
>> 
>> Pong. It is a bit incorrect - from memory,
>> VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR requires that
>> only Vulkan 1.1 features are enabled, while we require 1.3.
>> But if it works, sure. Could you ifdef it out everywhere outside of OSX?
> 
> I wonder, how is this working given that MoltenVK does not provide Vulkan 1.3
> but only 1.2?

I haven't checked the details. It looks like all hwcontext required features are available in
MoltenVK, although it doesn’t provide full 1.3 implementation.

libplacebo does the same 
https://github.com/haasn/libplacebo/pull/129/files

Progress of MoltenVK to support 1.3
https://github.com/KhronosGroup/MoltenVK/issues/1930

> 
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org>
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> 
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request@ffmpeg.org <mailto:ffmpeg-devel-request@ffmpeg.org> with subject "unsubscribe".
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org>
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org <mailto:ffmpeg-devel-request@ffmpeg.org> with subject "unsubscribe".
diff mbox series

Patch

diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 8481427b42..9fbf61ee70 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -405,7 +405,6 @@  typedef struct VulkanOptExtension {
 } VulkanOptExtension;
 
 static const VulkanOptExtension optional_instance_exts[] = {
-    /* Pointless, here avoid zero-sized structs */
     { VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,          FF_VK_EXT_NO_FLAG                },
 };
 
@@ -784,6 +783,14 @@  static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
         inst_props.pNext = &validation_features;
     }
 
+    for (int i = 0; i < inst_props.enabledExtensionCount; i++) {
+        if (!strcmp(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,
+                    inst_props.ppEnabledExtensionNames[i])) {
+            inst_props.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
+            break;
+        }
+    }
+
     /* Try to create the instance */
     ret = vk->CreateInstance(&inst_props, hwctx->alloc, &hwctx->inst);