1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

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.
Also clarifies that any user-supplied VkInstance must be at least 1.1.
This commit is contained in:
Lynne 2020-05-10 11:47:50 +01:00
parent 3c5e5a5095
commit dccd07f66d
No known key found for this signature in database
GPG Key ID: A2FEA5F03F034464
4 changed files with 56 additions and 11 deletions

View File

@ -15,6 +15,10 @@ libavutil: 2017-10-21
API changes, most recent first: 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 2020-04-22 - 0e1db79e37 - lavc 58.81.100 - packet.h
- lavu 56.43.100 - dovi_meta.h - lavu 56.43.100 - dovi_meta.h
Add AV_PKT_DATA_DOVI_CONF and AVDOVIDecoderConfigurationRecord. Add AV_PKT_DATA_DOVI_CONF and AVDOVIDecoderConfigurationRecord.

View File

@ -445,15 +445,13 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
/* Try to create the instance */ /* Try to create the instance */
ret = vkCreateInstance(&inst_props, hwctx->alloc, &hwctx->inst); 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 */ /* Check for errors */
if (ret != VK_SUCCESS) { if (ret != VK_SUCCESS) {
av_log(ctx, AV_LOG_ERROR, "Instance creation failure: %s\n", av_log(ctx, AV_LOG_ERROR, "Instance creation failure: %s\n",
vk_ret2str(ret)); 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; return AVERROR_EXTERNAL;
} }
@ -476,6 +474,9 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
hwctx->alloc, &p->debug_ctx); hwctx->alloc, &p->debug_ctx);
} }
hwctx->enabled_inst_extensions = inst_props.ppEnabledExtensionNames;
hwctx->nb_enabled_inst_extensions = inst_props.enabledExtensionCount;
return 0; return 0;
} }
@ -781,6 +782,14 @@ static void vulkan_device_free(AVHWDeviceContext *ctx)
} }
vkDestroyInstance(hwctx->inst, hwctx->alloc); vkDestroyInstance(hwctx->inst, hwctx->alloc);
for (int i = 0; i < hwctx->nb_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->nb_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, static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
@ -841,13 +850,12 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
ret = vkCreateDevice(hwctx->phys_dev, &dev_info, hwctx->alloc, ret = vkCreateDevice(hwctx->phys_dev, &dev_info, hwctx->alloc,
&hwctx->act_dev); &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) { if (ret != VK_SUCCESS) {
av_log(ctx, AV_LOG_ERROR, "Device creation failure: %s\n", av_log(ctx, AV_LOG_ERROR, "Device creation failure: %s\n",
vk_ret2str(ret)); 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; err = AVERROR_EXTERNAL;
goto end; goto end;
} }
@ -857,6 +865,9 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
if (opt_d) if (opt_d)
p->use_linear_images = strtol(opt_d->value, NULL, 10); p->use_linear_images = strtol(opt_d->value, NULL, 10);
hwctx->enabled_dev_extensions = dev_info.ppEnabledExtensionNames;
hwctx->nb_enabled_dev_extensions = dev_info.enabledExtensionCount;
end: end:
return err; return err;
} }
@ -868,6 +879,17 @@ static int vulkan_device_init(AVHWDeviceContext *ctx)
AVVulkanDeviceContext *hwctx = ctx->hwctx; AVVulkanDeviceContext *hwctx = ctx->hwctx;
VulkanDevicePriv *p = ctx->internal->priv; VulkanDevicePriv *p = ctx->internal->priv;
/* Set device extension flags */
for (int i = 0; i < hwctx->nb_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); vkGetPhysicalDeviceQueueFamilyProperties(hwctx->phys_dev, &queue_num, NULL);
if (!queue_num) { if (!queue_num) {
av_log(ctx, AV_LOG_ERROR, "Failed to get queues!\n"); av_log(ctx, AV_LOG_ERROR, "Failed to get queues!\n");

View File

@ -39,7 +39,7 @@ typedef struct AVVulkanDeviceContext {
*/ */
const VkAllocationCallbacks *alloc; const VkAllocationCallbacks *alloc;
/** /**
* Instance * Vulkan instance. Must be at least version 1.1.
*/ */
VkInstance inst; VkInstance inst;
/** /**
@ -65,6 +65,25 @@ typedef struct AVVulkanDeviceContext {
* Queue family index for compute ops * Queue family index for compute ops
*/ */
int queue_family_comp_index; 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 nb_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 nb_enabled_dev_extensions;
} AVVulkanDeviceContext; } AVVulkanDeviceContext;
/** /**

View File

@ -79,7 +79,7 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 56 #define LIBAVUTIL_VERSION_MAJOR 56
#define LIBAVUTIL_VERSION_MINOR 43 #define LIBAVUTIL_VERSION_MINOR 44
#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \