aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLynne <dev@lynne.ee>2024-10-03 06:44:43 +0200
committerLynne <dev@lynne.ee>2024-10-04 10:10:43 +0200
commite3676d96cbafa4e859b364f0fb64651cd9f20270 (patch)
treefbd20858c1701111211bff747b3ea944adf29c66
parent535e5eb7f3ef01841d76cfec9d9d00b5b34b6f76 (diff)
downloadffmpeg-e3676d96cbafa4e859b364f0fb64651cd9f20270.tar.gz
hwcontext_vulkan: move device feature struct setup to a new function
-rw-r--r--libavutil/hwcontext_vulkan.c335
-rw-r--r--libavutil/vulkan_functions.h1
2 files changed, 156 insertions, 180 deletions
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 02ee7f428c..870e988578 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -72,6 +72,28 @@
#define CHECK_CU(x) FF_CUDA_CHECK_DL(cuda_cu, cu, x)
#endif
+typedef struct VulkanDeviceFeatures {
+ VkPhysicalDeviceFeatures2 device;
+
+ VkPhysicalDeviceVulkan11Features vulkan_1_1;
+ VkPhysicalDeviceVulkan12Features vulkan_1_2;
+ VkPhysicalDeviceVulkan13Features vulkan_1_3;
+ VkPhysicalDeviceTimelineSemaphoreFeatures timeline_semaphore;
+
+ VkPhysicalDeviceVideoMaintenance1FeaturesKHR video_maintenance_1;
+
+ VkPhysicalDeviceShaderObjectFeaturesEXT shader_object;
+ VkPhysicalDeviceCooperativeMatrixFeaturesKHR cooperative_matrix;
+ VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptor_buffer;
+ VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float;
+
+ VkPhysicalDeviceOpticalFlowFeaturesNV optical_flow;
+
+#ifdef VK_KHR_shader_relaxed_extended_instruction
+ VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR relaxed_extended_instruction;
+#endif
+} VulkanDeviceFeatures;
+
typedef struct VulkanDevicePriv {
/**
* The public AVVulkanDeviceContext. See hwcontext_vulkan.h for it.
@@ -90,19 +112,8 @@ typedef struct VulkanDevicePriv {
VkPhysicalDeviceMemoryProperties mprops;
VkPhysicalDeviceExternalMemoryHostPropertiesEXT hprops;
- /* Features */
- VkPhysicalDeviceVulkan11Features device_features_1_1;
- VkPhysicalDeviceVulkan12Features device_features_1_2;
- VkPhysicalDeviceVulkan13Features device_features_1_3;
- VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features;
- VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_features;
- VkPhysicalDeviceCooperativeMatrixFeaturesKHR coop_matrix_features;
- VkPhysicalDeviceOpticalFlowFeaturesNV optical_flow_features;
- VkPhysicalDeviceShaderObjectFeaturesEXT shader_object_features;
- VkPhysicalDeviceVideoMaintenance1FeaturesKHR video_maint_1_features;
-#ifdef VK_KHR_shader_relaxed_extended_instruction
- VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR relaxed_extended_instr_features;
-#endif
+ /* Enabled features */
+ VulkanDeviceFeatures feats;
/* Queues */
pthread_mutex_t **qf_mutex;
@@ -164,6 +175,118 @@ typedef struct AVVkFrameInternal {
#endif
} AVVkFrameInternal;
+/* Initialize all structs in VulkanDeviceFeatures */
+static void device_features_init(AVHWDeviceContext *ctx, VulkanDeviceFeatures *feats)
+{
+ VulkanDevicePriv *p = ctx->hwctx;
+
+#define OPT_CHAIN(STRUCT_P, EXT_FLAG, TYPE) \
+ do { \
+ if ((EXT_FLAG == FF_VK_EXT_NO_FLAG) || \
+ (p->vkctx.extensions & EXT_FLAG)) { \
+ (STRUCT_P)->sType = TYPE; \
+ ff_vk_link_struct(&feats->device, STRUCT_P); \
+ } \
+ } while (0)
+
+ feats->device = (VkPhysicalDeviceFeatures2) {
+ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
+ };
+
+ OPT_CHAIN(&feats->vulkan_1_1, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES);
+ OPT_CHAIN(&feats->vulkan_1_2, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
+ OPT_CHAIN(&feats->vulkan_1_3, FF_VK_EXT_NO_FLAG,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES);
+
+ OPT_CHAIN(&feats->timeline_semaphore, FF_VK_EXT_PORTABILITY_SUBSET,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES);
+
+ OPT_CHAIN(&feats->video_maintenance_1, FF_VK_EXT_VIDEO_MAINTENANCE_1,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR);
+
+ OPT_CHAIN(&feats->shader_object, FF_VK_EXT_SHADER_OBJECT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT);
+ OPT_CHAIN(&feats->cooperative_matrix, FF_VK_EXT_COOP_MATRIX,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR);
+ OPT_CHAIN(&feats->descriptor_buffer, FF_VK_EXT_DESCRIPTOR_BUFFER,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT);
+ OPT_CHAIN(&feats->atomic_float, FF_VK_EXT_ATOMIC_FLOAT,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
+
+#ifdef VK_KHR_shader_relaxed_extended_instruction
+ OPT_CHAIN(&feats->relaxed_extended_instruction, FF_VK_EXT_RELAXED_EXTENDED_INSTR,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR);
+#endif
+
+ OPT_CHAIN(&feats->optical_flow, FF_VK_EXT_OPTICAL_FLOW,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV);
+#undef OPT_CHAIN
+}
+
+/* Copy all needed device features */
+static void device_features_copy_needed(VulkanDeviceFeatures *dst, VulkanDeviceFeatures *src)
+{
+#define COPY_VAL(VAL) \
+ do { \
+ dst->VAL = src->VAL; \
+ } while (0) \
+
+ COPY_VAL(device.features.shaderImageGatherExtended);
+ COPY_VAL(device.features.shaderStorageImageReadWithoutFormat);
+ COPY_VAL(device.features.shaderStorageImageWriteWithoutFormat);
+ COPY_VAL(device.features.fragmentStoresAndAtomics);
+ COPY_VAL(device.features.vertexPipelineStoresAndAtomics);
+ COPY_VAL(device.features.shaderInt64);
+ COPY_VAL(device.features.shaderInt16);
+ COPY_VAL(device.features.shaderFloat64);
+
+ COPY_VAL(vulkan_1_1.samplerYcbcrConversion);
+ COPY_VAL(vulkan_1_1.storagePushConstant16);
+ COPY_VAL(vulkan_1_1.storageBuffer16BitAccess);
+ COPY_VAL(vulkan_1_1.uniformAndStorageBuffer16BitAccess);
+
+ COPY_VAL(vulkan_1_2.timelineSemaphore);
+ COPY_VAL(vulkan_1_2.scalarBlockLayout);
+ COPY_VAL(vulkan_1_2.bufferDeviceAddress);
+ COPY_VAL(vulkan_1_2.hostQueryReset);
+ COPY_VAL(vulkan_1_2.storagePushConstant8);
+ COPY_VAL(vulkan_1_2.shaderInt8);
+ COPY_VAL(vulkan_1_2.storageBuffer8BitAccess);
+ COPY_VAL(vulkan_1_2.uniformAndStorageBuffer8BitAccess);
+ COPY_VAL(vulkan_1_2.shaderFloat16);
+ COPY_VAL(vulkan_1_2.shaderSharedInt64Atomics);
+ COPY_VAL(vulkan_1_2.vulkanMemoryModel);
+ COPY_VAL(vulkan_1_2.vulkanMemoryModelDeviceScope);
+ COPY_VAL(vulkan_1_2.hostQueryReset);
+
+ COPY_VAL(vulkan_1_3.dynamicRendering);
+ COPY_VAL(vulkan_1_3.maintenance4);
+ COPY_VAL(vulkan_1_3.synchronization2);
+ COPY_VAL(vulkan_1_3.computeFullSubgroups);
+ COPY_VAL(vulkan_1_3.shaderZeroInitializeWorkgroupMemory);
+ COPY_VAL(vulkan_1_3.dynamicRendering);
+
+ COPY_VAL(timeline_semaphore.timelineSemaphore);
+
+ COPY_VAL(video_maintenance_1.videoMaintenance1);
+
+ COPY_VAL(shader_object.shaderObject);
+
+ COPY_VAL(cooperative_matrix.cooperativeMatrix);
+
+ COPY_VAL(descriptor_buffer.descriptorBuffer);
+ COPY_VAL(descriptor_buffer.descriptorBufferPushDescriptors);
+
+ COPY_VAL(atomic_float.shaderBufferFloat32Atomics);
+ COPY_VAL(atomic_float.shaderBufferFloat32AtomicAdd);
+ COPY_VAL(relaxed_extended_instruction.shaderRelaxedExtendedInstruction);
+
+ COPY_VAL(optical_flow.opticalFlow);
+#undef COPY_VAL
+}
+
#define ASPECT_2PLANE (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT)
#define ASPECT_3PLANE (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT)
@@ -424,9 +547,9 @@ static const VulkanOptExtension optional_instance_exts[] = {
static const VulkanOptExtension optional_device_exts[] = {
/* Misc or required by other extensions */
- { VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, FF_VK_EXT_NO_FLAG },
+ { VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, FF_VK_EXT_PORTABILITY_SUBSET },
{ VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, FF_VK_EXT_PUSH_DESCRIPTOR },
- { VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, FF_VK_EXT_DESCRIPTOR_BUFFER, },
+ { VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, FF_VK_EXT_DESCRIPTOR_BUFFER },
{ VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME, FF_VK_EXT_DEVICE_DRM },
{ VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, FF_VK_EXT_ATOMIC_FLOAT },
{ VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME, FF_VK_EXT_COOP_MATRIX },
@@ -1435,146 +1558,20 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
AVVulkanDeviceContext *hwctx = &p->p;
FFVulkanFunctions *vk = &p->vkctx.vkfn;
enum FFVulkanDebugMode debug_mode = FF_VULKAN_DEBUG_NONE;
-
- /*
- * 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,
- };
-#ifdef VK_KHR_shader_relaxed_extended_instruction
- VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR relaxed_extended_instr_features = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR,
- .pNext = &timeline_features,
- };
-#endif
- VkPhysicalDeviceVideoMaintenance1FeaturesKHR video_maint_1_features = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR,
-#ifdef VK_KHR_shader_relaxed_extended_instruction
- .pNext = &relaxed_extended_instr_features,
-#else
- .pNext = &timeline_features,
-#endif
- };
- VkPhysicalDeviceShaderObjectFeaturesEXT shader_object_features = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT,
- .pNext = &video_maint_1_features,
- };
- VkPhysicalDeviceOpticalFlowFeaturesNV optical_flow_features = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV,
- .pNext = &shader_object_features,
- };
- VkPhysicalDeviceCooperativeMatrixFeaturesKHR coop_matrix_features = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR,
- .pNext = &optical_flow_features,
- };
- VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float_features = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT,
- .pNext = &coop_matrix_features,
- };
- VkPhysicalDeviceDescriptorBufferFeaturesEXT desc_buf_features = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT,
- .pNext = &atomic_float_features,
- };
- VkPhysicalDeviceVulkan13Features dev_features_1_3 = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,
- .pNext = &desc_buf_features,
- };
- VkPhysicalDeviceVulkan12Features dev_features_1_2 = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
- .pNext = &dev_features_1_3,
- };
- VkPhysicalDeviceVulkan11Features dev_features_1_1 = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES,
- .pNext = &dev_features_1_2,
- };
- VkPhysicalDeviceFeatures2 dev_features = {
- .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
- .pNext = &dev_features_1_1,
- };
-
+ VulkanDeviceFeatures supported_feats = { 0 };
VkDeviceCreateInfo dev_info = {
.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
};
- ctx->free = vulkan_device_free;
-
/* Create an instance if not given one */
if ((err = create_instance(ctx, opts, &debug_mode)))
goto end;
- /* Find a device (if not given one) */
+ /* Find a physical device (if not given one) */
if ((err = find_device(ctx, dev_select)))
goto end;
- vk->GetPhysicalDeviceFeatures2(hwctx->phys_dev, &dev_features);
-
- /* Try to keep in sync with libplacebo */
-#define COPY_FEATURE(DST, NAME) (DST).features.NAME = dev_features.features.NAME;
- COPY_FEATURE(hwctx->device_features, shaderImageGatherExtended)
- COPY_FEATURE(hwctx->device_features, shaderStorageImageReadWithoutFormat)
- COPY_FEATURE(hwctx->device_features, shaderStorageImageWriteWithoutFormat)
- COPY_FEATURE(hwctx->device_features, fragmentStoresAndAtomics)
- COPY_FEATURE(hwctx->device_features, vertexPipelineStoresAndAtomics)
- COPY_FEATURE(hwctx->device_features, shaderInt64)
- COPY_FEATURE(hwctx->device_features, shaderInt16)
- COPY_FEATURE(hwctx->device_features, shaderFloat64)
-#undef COPY_FEATURE
-
- /* We require timeline semaphores */
- if (!timeline_features.timelineSemaphore) {
- av_log(ctx, AV_LOG_ERROR, "Device does not support timeline semaphores!\n");
- err = AVERROR(ENOSYS);
- goto end;
- }
-
- p->device_features_1_1.samplerYcbcrConversion = dev_features_1_1.samplerYcbcrConversion;
- p->device_features_1_1.storagePushConstant16 = dev_features_1_1.storagePushConstant16;
- p->device_features_1_1.storageBuffer16BitAccess = dev_features_1_1.storageBuffer16BitAccess;
- p->device_features_1_1.uniformAndStorageBuffer16BitAccess = dev_features_1_1.uniformAndStorageBuffer16BitAccess;
-
- p->device_features_1_2.timelineSemaphore = 1;
- p->device_features_1_2.scalarBlockLayout = dev_features_1_2.scalarBlockLayout;
- p->device_features_1_2.bufferDeviceAddress = dev_features_1_2.bufferDeviceAddress;
- p->device_features_1_2.hostQueryReset = dev_features_1_2.hostQueryReset;
- p->device_features_1_2.storagePushConstant8 = dev_features_1_2.storagePushConstant8;
- p->device_features_1_2.shaderInt8 = dev_features_1_2.shaderInt8;
- p->device_features_1_2.storageBuffer8BitAccess = dev_features_1_2.storageBuffer8BitAccess;
- p->device_features_1_2.uniformAndStorageBuffer8BitAccess = dev_features_1_2.uniformAndStorageBuffer8BitAccess;
- p->device_features_1_2.shaderFloat16 = dev_features_1_2.shaderFloat16;
- p->device_features_1_2.shaderSharedInt64Atomics = dev_features_1_2.shaderSharedInt64Atomics;
- p->device_features_1_2.vulkanMemoryModel = dev_features_1_2.vulkanMemoryModel;
- p->device_features_1_2.vulkanMemoryModelDeviceScope = dev_features_1_2.vulkanMemoryModelDeviceScope;
- p->device_features_1_2.hostQueryReset = dev_features_1_2.hostQueryReset;
-
- p->device_features_1_3.dynamicRendering = dev_features_1_3.dynamicRendering;
- p->device_features_1_3.maintenance4 = dev_features_1_3.maintenance4;
- p->device_features_1_3.synchronization2 = dev_features_1_3.synchronization2;
- p->device_features_1_3.computeFullSubgroups = dev_features_1_3.computeFullSubgroups;
- p->device_features_1_3.shaderZeroInitializeWorkgroupMemory = dev_features_1_3.shaderZeroInitializeWorkgroupMemory;
- p->device_features_1_3.dynamicRendering = dev_features_1_3.dynamicRendering;
-
- p->video_maint_1_features.videoMaintenance1 = video_maint_1_features.videoMaintenance1;
-
- p->desc_buf_features.descriptorBuffer = desc_buf_features.descriptorBuffer;
- p->desc_buf_features.descriptorBufferPushDescriptors = desc_buf_features.descriptorBufferPushDescriptors;
-
- p->atomic_float_features.shaderBufferFloat32Atomics = atomic_float_features.shaderBufferFloat32Atomics;
- p->atomic_float_features.shaderBufferFloat32AtomicAdd = atomic_float_features.shaderBufferFloat32AtomicAdd;
-
- p->coop_matrix_features.cooperativeMatrix = coop_matrix_features.cooperativeMatrix;
-
- p->optical_flow_features.opticalFlow = optical_flow_features.opticalFlow;
-
- p->shader_object_features.shaderObject = shader_object_features.shaderObject;
-
-#ifdef VK_KHR_shader_relaxed_extended_instruction
- p->relaxed_extended_instr_features.shaderRelaxedExtendedInstruction = relaxed_extended_instr_features.shaderRelaxedExtendedInstruction;
-#endif
-
- /* Find and enable extensions */
+ /* Find and enable extensions for the physical device */
if ((err = check_extensions(ctx, 1, opts, &dev_info.ppEnabledExtensionNames,
&dev_info.enabledExtensionCount, debug_mode))) {
for (int i = 0; i < dev_info.queueCreateInfoCount; i++)
@@ -1583,45 +1580,21 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
goto end;
}
- /* Setup enabled device features */
- hwctx->device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
- hwctx->device_features.pNext = &p->device_features_1_1;
- p->device_features_1_1.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
- p->device_features_1_1.pNext = &p->device_features_1_2;
- p->device_features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
- p->device_features_1_2.pNext = &p->device_features_1_3;
- p->device_features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
- p->device_features_1_3.pNext = NULL;
-
-#define OPT_CHAIN(EXT_FLAG, STRUCT_P, TYPE) \
- do { \
- if (p->vkctx.extensions & EXT_FLAG) { \
- (STRUCT_P)->sType = TYPE; \
- ff_vk_link_struct(hwctx->device_features.pNext, STRUCT_P); \
- } \
- } while (0)
-
- OPT_CHAIN(FF_VK_EXT_DESCRIPTOR_BUFFER, &p->desc_buf_features,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT);
- OPT_CHAIN(FF_VK_EXT_ATOMIC_FLOAT, &p->atomic_float_features,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
- OPT_CHAIN(FF_VK_EXT_COOP_MATRIX, &p->coop_matrix_features,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR);
- OPT_CHAIN(FF_VK_EXT_SHADER_OBJECT, &p->shader_object_features,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT);
- OPT_CHAIN(FF_VK_EXT_OPTICAL_FLOW, &p->optical_flow_features,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV);
- OPT_CHAIN(FF_VK_EXT_VIDEO_MAINTENANCE_1, &p->video_maint_1_features,
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR);
-#undef OPT_CHAIN
+ /* Get all supported features for the physical device */
+ device_features_init(ctx, &supported_feats);
+ vk->GetPhysicalDeviceFeatures2(hwctx->phys_dev, &supported_feats.device);
- /* Add the enabled features into the pnext chain of device creation */
- dev_info.pNext = &hwctx->device_features;
+ /* Copy all needed features from those supported and activate them */
+ device_features_init(ctx, &p->feats);
+ device_features_copy_needed(&p->feats, &supported_feats);
+ dev_info.pNext = p->feats.device.pNext;
+ dev_info.pEnabledFeatures = &p->feats.device.features;
/* Setup enabled queue families */
if ((err = setup_queue_families(ctx, &dev_info)))
goto end;
+ /* Finally create the device */
ret = vk->CreateDevice(hwctx->phys_dev, &dev_info, hwctx->alloc,
&hwctx->act_dev);
@@ -1644,9 +1617,7 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
if (opt_d)
p->use_linear_images = strtol(opt_d->value, NULL, 10);
- /*
- * The disable_multiplane argument takes precedent over the option.
- */
+ /* The disable_multiplane argument takes precedent over the option */
p->disable_multiplane = disable_multiplane;
if (!p->disable_multiplane) {
opt_d = av_dict_get(opts, "disable_multiplane", NULL, 0);
@@ -1654,9 +1625,13 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
p->disable_multiplane = strtol(opt_d->value, NULL, 10);
}
+ /* Set the list of all active extensions */
hwctx->enabled_dev_extensions = dev_info.ppEnabledExtensionNames;
hwctx->nb_enabled_dev_extensions = dev_info.enabledExtensionCount;
+ /* The extension lists need to be freed */
+ ctx->free = vulkan_device_free;
+
end:
return err;
}
diff --git a/libavutil/vulkan_functions.h b/libavutil/vulkan_functions.h
index 7a5385381b..b1ae4d181e 100644
--- a/libavutil/vulkan_functions.h
+++ b/libavutil/vulkan_functions.h
@@ -62,6 +62,7 @@ typedef uint64_t FFVulkanExtensions;
#define FF_VK_EXT_VIDEO_ENCODE_H264 (1ULL << 51) /* VK_KHR_video_encode_h264 */
#define FF_VK_EXT_VIDEO_ENCODE_H265 (1ULL << 52) /* VK_KHR_video_encode_h265 */
+#define FF_VK_EXT_PORTABILITY_SUBSET (1ULL << 62)
#define FF_VK_EXT_NO_FLAG (1ULL << 63)
/* Macro containing every function that we utilize in our codebase */