May 10, 2020, 14:33 by [email protected]:
> On 10/05/2020 11:54, Lynne wrote:
>
>> */
>> VkInstance inst;
>> + /**
>> + * Enabled instance extensions. By default, VK_KHR_surface is enabled
>> if found.
>> + */
>>
>
> Clarify how this should be set by the user if they are supplying the
> instance? (From code, looks like it's not used.)
>
Done.
>> + const char * const *enabled_inst_extensions;
>> + int num_enabled_inst_extensions;
>> /**
>> * Physical device
>> */
>> @@ -50,6 +55,13 @@ typedef struct AVVulkanDeviceContext {
>> * Active device
>> */
>> VkDevice act_dev;
>> + /**
>> + * Enabled device extensions. By default, VK_KHR_external_memory_fd,
>> + * VK_EXT_external_memory_dma_buf, VK_EXT_image_drm_format_modifier and
>> + * VK_KHR_external_semaphore_fd are enabled if found.
>> + */
>>
>
> Clarify how this should be set by the user if they are supplying the device?
> (From code, looks like it's required.)
>
Done (it isn't required, and can be NULL).
>> + const char * const *enabled_dev_extensions;
>> + int num_enabled_dev_extensions;
>> /**
>> * Queue family index for graphics
>> * @note av_hwdevice_create() will set all 3 queue indices if unset
>> --
>> 2.26.2
>>
>
> I think you need to put the new fields at the end to avoid the worst ABI
> break (upgrade libavutil and crash trying to use the device fields because
> they've moved).
>
> The API change with the new field being required is ugly given that it's
> months after the usual cutoff, but the effect hasn't changed (they wouldn't
> have had any extensions) so it's probably ok. Needs a notice in APIchanges,
> though.
>
Done, with a minor lavu bump and an APIchanges notice. Looks tidier with the
fields at the bottom anyway.
Patch attached.
>From 6ecc3547bcfcc450c8ffe8d93a3040fd863f6288 Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Sun, 10 May 2020 11:47:50 +0100
Subject: [PATCH 2/3] hwcontext_vulkan: expose enabled device and instance
extensions
This solves a huge oversight - it lets users reliably use their own
AVVulkanDeviceContext. Otherwise, the extensions supplied and enabled
are not discoverable by anything outside of hwcontext_vulkan.
---
doc/APIchanges | 4 ++++
libavutil/hwcontext_vulkan.c | 40 ++++++++++++++++++++++++++++--------
libavutil/hwcontext_vulkan.h | 21 ++++++++++++++++++-
libavutil/version.h | 2 +-
4 files changed, 56 insertions(+), 11 deletions(-)
diff --git a/doc/APIchanges b/doc/APIchanges
index b3e7e89412..75cfdb08b0 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,10 @@ libavutil: 2017-10-21
API changes, most recent first:
+2020-05-10 - xxxxxxxxxx - lavu 56.44.100 - hwcontext_vulkan.h
+ Add enabled_inst_extensions, num_enabled_inst_extensions, enabled_dev_extensions
+ and num_enabled_dev_extensions fields to AVVulkanDeviceContext
+
2020-04-22 - 0e1db79e37 - lavc 58.81.100 - packet.h
- lavu 56.43.100 - dovi_meta.h
Add AV_PKT_DATA_DOVI_CONF and AVDOVIDecoderConfigurationRecord.
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index c853e2f502..fad8c67818 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -417,15 +417,13 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
/* Try to create the instance */
ret = vkCreateInstance(&inst_props, hwctx->alloc, &hwctx->inst);
- /* Free used memory */
- for (int i = 0; i < inst_props.enabledExtensionCount; i++)
- av_free((void *)inst_props.ppEnabledExtensionNames[i]);
- av_free((void *)inst_props.ppEnabledExtensionNames);
-
/* Check for errors */
if (ret != VK_SUCCESS) {
av_log(ctx, AV_LOG_ERROR, "Instance creation failure: %s\n",
vk_ret2str(ret));
+ for (int i = 0; i < inst_props.enabledExtensionCount; i++)
+ av_free((void *)inst_props.ppEnabledExtensionNames[i]);
+ av_free((void *)inst_props.ppEnabledExtensionNames);
return AVERROR_EXTERNAL;
}
@@ -448,6 +446,9 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
hwctx->alloc, &p->debug_ctx);
}
+ hwctx->enabled_inst_extensions = inst_props.ppEnabledExtensionNames;
+ hwctx->num_enabled_inst_extensions = inst_props.enabledExtensionCount;
+
return 0;
}
@@ -753,6 +754,14 @@ static void vulkan_device_free(AVHWDeviceContext *ctx)
}
vkDestroyInstance(hwctx->inst, hwctx->alloc);
+
+ for (int i = 0; i < hwctx->num_enabled_inst_extensions; i++)
+ av_free((void *)hwctx->enabled_inst_extensions[i]);
+ av_free((void *)hwctx->enabled_inst_extensions);
+
+ for (int i = 0; i < hwctx->num_enabled_dev_extensions; i++)
+ av_free((void *)hwctx->enabled_dev_extensions[i]);
+ av_free((void *)hwctx->enabled_dev_extensions);
}
static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
@@ -813,13 +822,12 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
ret = vkCreateDevice(hwctx->phys_dev, &dev_info, hwctx->alloc,
&hwctx->act_dev);
- for (int i = 0; i < dev_info.enabledExtensionCount; i++)
- av_free((void *)dev_info.ppEnabledExtensionNames[i]);
- av_free((void *)dev_info.ppEnabledExtensionNames);
-
if (ret != VK_SUCCESS) {
av_log(ctx, AV_LOG_ERROR, "Device creation failure: %s\n",
vk_ret2str(ret));
+ for (int i = 0; i < dev_info.enabledExtensionCount; i++)
+ av_free((void *)dev_info.ppEnabledExtensionNames[i]);
+ av_free((void *)dev_info.ppEnabledExtensionNames);
err = AVERROR_EXTERNAL;
goto end;
}
@@ -829,6 +837,9 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
if (opt_d)
p->use_linear_images = strtol(opt_d->value, NULL, 10);
+ hwctx->enabled_dev_extensions = dev_info.ppEnabledExtensionNames;
+ hwctx->num_enabled_dev_extensions = dev_info.enabledExtensionCount;
+
end:
return err;
}
@@ -840,6 +851,17 @@ static int vulkan_device_init(AVHWDeviceContext *ctx)
AVVulkanDeviceContext *hwctx = ctx->hwctx;
VulkanDevicePriv *p = ctx->internal->priv;
+ /* Set device extension flags */
+ for (int i = 0; i < hwctx->num_enabled_dev_extensions; i++) {
+ for (int j = 0; j < FF_ARRAY_ELEMS(optional_device_exts); j++) {
+ if (!strcmp(hwctx->enabled_dev_extensions[i],
+ optional_device_exts[j].name)) {
+ p->extensions |= optional_device_exts[j].flag;
+ break;
+ }
+ }
+ }
+
vkGetPhysicalDeviceQueueFamilyProperties(hwctx->phys_dev, &queue_num, NULL);
if (!queue_num) {
av_log(ctx, AV_LOG_ERROR, "Failed to get queues!\n");
diff --git a/libavutil/hwcontext_vulkan.h b/libavutil/hwcontext_vulkan.h
index ebc28916f3..909f88a7e4 100644
--- a/libavutil/hwcontext_vulkan.h
+++ b/libavutil/hwcontext_vulkan.h
@@ -39,7 +39,7 @@ typedef struct AVVulkanDeviceContext {
*/
const VkAllocationCallbacks *alloc;
/**
- * Instance
+ * Vulkan instance. Must be at least version 1.1.
*/
VkInstance inst;
/**
@@ -65,6 +65,25 @@ typedef struct AVVulkanDeviceContext {
* Queue family index for compute ops
*/
int queue_family_comp_index;
+ /**
+ * Enabled instance extensions. By default, VK_KHR_surface is enabled if found.
+ * If supplying your own device context, set this to an array of strings, with
+ * each entry containing the specified Vulkan extension string to enable.
+ * Duplicates are possible and accepted.
+ * If no extensions are enabled, set these fields to NULL, and 0 respectively.
+ */
+ const char * const *enabled_inst_extensions;
+ int num_enabled_inst_extensions;
+ /**
+ * Enabled device extensions. By default, VK_KHR_external_memory_fd,
+ * VK_EXT_external_memory_dma_buf, VK_EXT_image_drm_format_modifier and
+ * VK_KHR_external_semaphore_fd are enabled if found.
+ * If supplying your own device context, these fields takes the same format as
+ * the above fields, with the same conditions that duplicates are possible
+ * and accepted, and that NULL and 0 respectively means no extensions are enabled.
+ */
+ const char * const *enabled_dev_extensions;
+ int num_enabled_dev_extensions;
} AVVulkanDeviceContext;
/**
diff --git a/libavutil/version.h b/libavutil/version.h
index ea9363e8e9..48d8a38c42 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 56
-#define LIBAVUTIL_VERSION_MINOR 43
+#define LIBAVUTIL_VERSION_MINOR 44
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
--
2.26.2
_______________________________________________
ffmpeg-devel mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".