Message ID | 20240318072659.3641656-1-haihao.xiang@intel.com |
---|---|
State | Accepted |
Commit | d296c8689d487e422aeacbb92292b78dac84ff17 |
Headers | show |
Series | [FFmpeg-devel] lavu/hwcontext_vulkan: check PCI ID if possible | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
Mar 18, 2024, 08:27 by haihao.xiang-at-intel.com@ffmpeg.org: > From: Haihao Xiang <haihao.xiang@intel.com> > > Otherwise the derived device and the source device might have different > PCI ID in a multiple-device system. > > Signed-off-by: Haihao Xiang <haihao.xiang@intel.com> > --- > libavutil/hwcontext_vulkan.c | 30 +++++++++++++++++++++++------- > 1 file changed, 23 insertions(+), 7 deletions(-) > > diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c > index 855f099e26..91b9f96ccf 100644 > --- a/libavutil/hwcontext_vulkan.c > +++ b/libavutil/hwcontext_vulkan.c > @@ -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; > LGTM Thanks
On Ma, 2024-03-18 at 18:41 +0100, Lynne wrote: > Mar 18, 2024, 08:27 by haihao.xiang-at-intel.com@ffmpeg.org: > > > From: Haihao Xiang <haihao.xiang@intel.com> > > > > Otherwise the derived device and the source device might have different > > PCI ID in a multiple-device system. > > > > Signed-off-by: Haihao Xiang <haihao.xiang@intel.com> > > --- > > libavutil/hwcontext_vulkan.c | 30 +++++++++++++++++++++++------- > > 1 file changed, 23 insertions(+), 7 deletions(-) > > > > diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c > > index 855f099e26..91b9f96ccf 100644 > > --- a/libavutil/hwcontext_vulkan.c > > +++ b/libavutil/hwcontext_vulkan.c > > @@ -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; > > > > LGTM Thanks for reviewing the patch, pushed. BRs Haihao
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index 855f099e26..91b9f96ccf 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -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); }