Commit d296c868 authored by Haihao Xiang's avatar Haihao Xiang

lavu/hwcontext_vulkan: check PCI ID if possible

Otherwise the derived device and the source device might have different
PCI ID in a multiple-device system.
Reviewed-by: 's avatarLynne <dev@lynne.ee>
Signed-off-by: 's avatarHaihao Xiang <haihao.xiang@intel.com>
parent 39087e73
......@@ -1597,15 +1597,31 @@ static int vulkan_device_derive(AVHWDeviceContext *ctx,
#if CONFIG_VAAPI
case AV_HWDEVICE_TYPE_VAAPI: {
AVVAAPIDeviceContext *src_hwctx = src_ctx->hwctx;
VADisplay dpy = src_hwctx->display;
#if VA_CHECK_VERSION(1, 15, 0)
VAStatus vas;
VADisplayAttribute attr = {
.type = VADisplayPCIID,
};
#endif
const char *vendor;
const char *vendor = vaQueryVendorString(src_hwctx->display);
if (!vendor) {
av_log(ctx, AV_LOG_ERROR, "Unable to get device info from VAAPI!\n");
return AVERROR_EXTERNAL;
}
#if VA_CHECK_VERSION(1, 15, 0)
vas = vaGetDisplayAttributes(dpy, &attr, 1);
if (vas == VA_STATUS_SUCCESS && attr.flags != VA_DISPLAY_ATTRIB_NOT_SUPPORTED)
dev_select.pci_device = (attr.value & 0xFFFF);
#endif
if (!dev_select.pci_device) {
vendor = vaQueryVendorString(dpy);
if (!vendor) {
av_log(ctx, AV_LOG_ERROR, "Unable to get device info from VAAPI!\n");
return AVERROR_EXTERNAL;
}
if (strstr(vendor, "AMD"))
dev_select.vendor_id = 0x1002;
if (strstr(vendor, "AMD"))
dev_select.vendor_id = 0x1002;
}
return vulkan_device_create_internal(ctx, &dev_select, 0, opts, flags);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment