Message ID | tencent_434FAE5542A75738DF160FCD51201BCD8907@qq.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] hwcontext_vulkan: use VkPhysicalDeviceTimelineSemaphoreFeatures to check for timeline semaphore supporting | expand |
Context | Check | Description |
---|---|---|
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
andriy/make_ppc | success | Make finished |
andriy/make_fate_ppc | success | Make fate finished |
andriy/make_armv7_RPi4 | success | Make finished |
andriy/make_fate_armv7_RPi4 | success | Make fate finished |
andriy/make_aarch64_jetson | success | Make finished |
andriy/make_fate_aarch64_jetson | success | Make fate finished |
27 Jan 2022, 04:39 by quinkblack@foxmail.com: > VkPhysicalDeviceVulkan12Features isn't implemented on MoltenVK yet. > VkPhysicalDeviceTimelineSemaphoreFeatures is less versatile but > simple. None of device_features_1_1 nor device_features_1_2 has real > usage yet, keep the code for future. > --- > libavutil/hwcontext_vulkan.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c > index ae19fc2ab6..2e219511c9 100644 > --- a/libavutil/hwcontext_vulkan.c > +++ b/libavutil/hwcontext_vulkan.c > @@ -1321,8 +1321,16 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, > VulkanDevicePriv *p = ctx->internal->priv; > FFVulkanFunctions *vk = &p->vkfn; > AVVulkanDeviceContext *hwctx = ctx->hwctx; > + /* VkPhysicalDeviceVulkan12Features has a timelineSemaphore field, but > + * MoltenVK doesn't implement VkPhysicalDeviceVulkan12Features yet, so we > + * use VkPhysicalDeviceTimelineSemaphoreFeatures directly. > + */ > + VkPhysicalDeviceTimelineSemaphoreFeatures timeline_features = { > + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, > + }; > VkPhysicalDeviceVulkan12Features dev_features_1_2 = { > .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, > + .pNext = &timeline_features, > }; > VkPhysicalDeviceVulkan11Features dev_features_1_1 = { > .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, > @@ -1366,7 +1374,7 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, > #undef COPY_FEATURE > > /* We require timeline semaphores */ > - if (!dev_features_1_2.timelineSemaphore) { > + if (!timeline_features.timelineSemaphore) { > av_log(ctx, AV_LOG_ERROR, "Device does not support timeline semaphores!\n"); > err = AVERROR(ENOSYS); > goto end; > I didn't have a strong opinion on this, and on my nvidia testing machine, VkPhysicalDeviceVulkan12Features.timelineSemaphore isn't set for some reason (despite alleged 1.2 compliance), so this may help there. Pushed, thanks.
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index ae19fc2ab6..2e219511c9 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -1321,8 +1321,16 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, VulkanDevicePriv *p = ctx->internal->priv; FFVulkanFunctions *vk = &p->vkfn; AVVulkanDeviceContext *hwctx = ctx->hwctx; + /* VkPhysicalDeviceVulkan12Features has a timelineSemaphore field, but + * MoltenVK doesn't implement VkPhysicalDeviceVulkan12Features yet, so we + * use VkPhysicalDeviceTimelineSemaphoreFeatures directly. + */ + VkPhysicalDeviceTimelineSemaphoreFeatures timeline_features = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, + }; VkPhysicalDeviceVulkan12Features dev_features_1_2 = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, + .pNext = &timeline_features, }; VkPhysicalDeviceVulkan11Features dev_features_1_1 = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, @@ -1366,7 +1374,7 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, #undef COPY_FEATURE /* We require timeline semaphores */ - if (!dev_features_1_2.timelineSemaphore) { + if (!timeline_features.timelineSemaphore) { av_log(ctx, AV_LOG_ERROR, "Device does not support timeline semaphores!\n"); err = AVERROR(ENOSYS); goto end;