aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Langdale <philipl@overt.org>2023-06-02 16:24:46 -0700
committerPhilip Langdale <philipl@overt.org>2023-06-03 16:29:38 -0700
commit378fb4028294bcf27df09d145a1f6ab1d014924e (patch)
treea6283a9a8b2363c8b0f30acf594ebb1920a5c422
parent4ef5e7d47227fda15976bd70d17f325631730ff2 (diff)
downloadffmpeg-378fb4028294bcf27df09d145a1f6ab1d014924e.tar.gz
avutil/hwcontext_vulkan: disable multiplane when deriving from cuda
Today, cuda is not able to import multiplane images, and cuda requires images to be imported whether you trying to import to cuda or export from cuda (in the later case, the image is imported and then copied into on the cuda side). So any interop between cuda and vulkan requires that multiplane be disabled. The existing option for this is not sufficient, because when deriving devices it is not possible to specify any options. And, it is necessary to derive the Vulkan device, because any pipeline that involves uploading from cuda to vulkan and then back to cuda must use the same cuda context on both sides, and the only way to propagate the cuda context all the way through is to derive the device at each stage. ie: -vf hwupload=derive_device=vulkan,<filters>,hwupload=derive_device=cuda
-rw-r--r--libavutil/hwcontext_vulkan.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index e8241638d9..ec084d94d7 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -1180,6 +1180,7 @@ static void vulkan_device_free(AVHWDeviceContext *ctx)
static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
VulkanDeviceSelection *dev_select,
+ int disable_multiplane,
AVDictionary *opts, int flags)
{
int err = 0;
@@ -1335,9 +1336,15 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
if (opt_d)
p->use_linear_images = strtol(opt_d->value, NULL, 10);
- opt_d = av_dict_get(opts, "disable_multiplane", NULL, 0);
- if (opt_d)
- p->disable_multiplane = strtol(opt_d->value, NULL, 10);
+ /*
+ * 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);
+ if (opt_d)
+ p->disable_multiplane = strtol(opt_d->value, NULL, 10);
+ }
hwctx->enabled_dev_extensions = dev_info.ppEnabledExtensionNames;
hwctx->nb_enabled_dev_extensions = dev_info.enabledExtensionCount;
@@ -1511,7 +1518,7 @@ static int vulkan_device_create(AVHWDeviceContext *ctx, const char *device,
}
}
- return vulkan_device_create_internal(ctx, &dev_select, opts, flags);
+ return vulkan_device_create_internal(ctx, &dev_select, 0, opts, flags);
}
static int vulkan_device_derive(AVHWDeviceContext *ctx,
@@ -1537,7 +1544,7 @@ static int vulkan_device_derive(AVHWDeviceContext *ctx,
if (strstr(vendor, "AMD"))
dev_select.vendor_id = 0x1002;
- return vulkan_device_create_internal(ctx, &dev_select, opts, flags);
+ return vulkan_device_create_internal(ctx, &dev_select, 0, opts, flags);
}
#endif
#if CONFIG_LIBDRM
@@ -1570,7 +1577,7 @@ static int vulkan_device_derive(AVHWDeviceContext *ctx,
drmFreeDevice(&drm_dev_info);
- return vulkan_device_create_internal(ctx, &dev_select, opts, flags);
+ return vulkan_device_create_internal(ctx, &dev_select, 0, opts, flags);
}
#endif
#if CONFIG_CUDA
@@ -1589,7 +1596,11 @@ static int vulkan_device_derive(AVHWDeviceContext *ctx,
dev_select.has_uuid = 1;
- return vulkan_device_create_internal(ctx, &dev_select, opts, flags);
+ /*
+ * CUDA is not able to import multiplane images, so always derive a
+ * Vulkan device with multiplane disabled.
+ */
+ return vulkan_device_create_internal(ctx, &dev_select, 1, opts, flags);
}
#endif
default: