diff --git a/multimedia/intel-media-sdk/Makefile b/multimedia/intel-media-sdk/Makefile index 1d8ff951b217..16f2f98d8cc3 100644 --- a/multimedia/intel-media-sdk/Makefile +++ b/multimedia/intel-media-sdk/Makefile @@ -1,57 +1,58 @@ PORTNAME= intel-media-sdk DISTVERSIONPREFIX= intel-mediasdk- DISTVERSION= 21.4.1 +PORTREVISION= 1 CATEGORIES= multimedia MAINTAINER= jbeich@FreeBSD.org COMMENT= Hardware video decoding/encoding/filtering on Intel GPUs LICENSE= MIT LICENSE_FILE= ${WRKSRC}/LICENSE ONLY_FOR_ARCHS= amd64 i386 ONLY_FOR_ARCHS_REASON= only Intel GPUs on x86 are supported LIB_DEPENDS= libva.so:multimedia/libva RUN_DEPENDS= cmrtlib>0:multimedia/cmrtlib TEST_DEPENDS= googletest>0:devel/googletest USES= cmake:testing compiler:c++11-lib localbase:ldflags pkgconfig USE_GITHUB= yes USE_LDCONFIG= yes GH_ACCOUNT= Intel-Media-SDK GH_PROJECT= MediaSDK CMAKE_ON= BUILD_TOOLS CMAKE_TESTING_ON= BUILD_TESTS USE_SYSTEM_GTEST PLIST_SUB= ARCH_SUFX=${ARCH:S/i386/32/:S/amd//:S/x86_//} # https://github.com/Intel-Media-SDK/MediaSDK/issues/1844 LLD_UNSAFE= yes OPTIONS_DEFINE= OPENCL WAYLAND X11 OPTIONS_DEFAULT=OPENCL WAYLAND X11 OPTIONS_SUB= yes OPENCL_BUILD_DEPENDS= ${LOCALBASE}/include/CL/opencl.h:devel/opencl OPENCL_LIB_DEPENDS= libOpenCL.so:devel/ocl-icd OPENCL_CMAKE_BOOL= ENABLE_OPENCL X11_BUILD_DEPENDS= ${LOCALBASE}/include/xcb/dri3.h:x11/libxcb X11_LIB_DEPENDS= libva-x11.so:multimedia/libva X11_CMAKE_BOOL= ENABLE_X11 ENABLE_X11_DRI3 WAYLAND_LIB_DEPENDS= libdrm_intel.so:graphics/libdrm \ libwayland-client.so:graphics/wayland WAYLAND_CMAKE_BOOL= ENABLE_WAYLAND post-patch: # Pick git commit from port and use reproducible time @${REINPLACE_CMD} -e "/COMMAND/s/date/& -r `${AWK} '/TIMESTAMP/ \ { print \$$3 }' ${DISTINFO_FILE}`/" \ -e '/set( *git_commit/s/"[^"]*"/"${DISTVERSIONFULL}"/' \ ${WRKSRC}/builder/FindFunctions.cmake \ ${WRKSRC}/builder/FindGlobals.cmake # Don't assume GCC and glibc libraries are available @${REINPLACE_CMD} -e 's/ -lstdc++ -ldl//' \ ${WRKSRC}/api/mfx_dispatch/linux/pkg-config*.cmake .include diff --git a/multimedia/intel-media-sdk/files/patch-drm-to-pciid b/multimedia/intel-media-sdk/files/patch-drm-to-pciid new file mode 100644 index 000000000000..0a89fcec1c7c --- /dev/null +++ b/multimedia/intel-media-sdk/files/patch-drm-to-pciid @@ -0,0 +1,86 @@ +/sys/class/drm/renderD*/device/device is Linux-only, so use a BSD extension +to get vendor/device identifiers from rendor nodes. Based on libdrm code. + +According to https://github.com/intel/libva/issues/540 some nodes maybe +missing, so unlike Linux keep searching in case iGPU is older than dGPU. +mfxloader.cpp later uses the newest GPU to decide the default. + +$ ffmpeg -hide_banner -init_hw_device qsv=auto -i foo.y4m -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -y foo.mkv +[AVHWDeviceContext @ 0x8062d0140] Error initializing an MFX session: -3. +Device creation failed: -1313558101. +Failed to set value 'qsv=auto' for option 'init_hw_device': Unknown error occurred +Error parsing global options: Unknown error occurred + +--- api/mfx_dispatch/linux/device_ids.h.orig 2021-10-26 06:00:35 UTC ++++ api/mfx_dispatch/linux/device_ids.h +@@ -404,7 +404,62 @@ static inline eMFXHWType get_platform(int device_id) { + return MFX_HW_UNKNOWN; + } + ++#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) ++#if defined(__FreeBSD__) && __FreeBSD__ < 13 ++#include ++#else ++#include ++#include ++#include ++#endif // defined(__FreeBSD__) && __FreeBSD__ < 13 ++ ++struct drm_pciinfo { ++ uint16_t domain; ++ uint8_t bus; ++ uint8_t dev; ++ uint8_t func; ++ uint16_t vendor_id; ++ uint16_t device_id; ++ uint16_t subvendor_id; ++ uint16_t subdevice_id; ++ uint8_t revision_id; ++}; ++ ++#define DRM_IOCTL_BASE 'd' ++#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type) ++#define DRM_IOCTL_GET_PCIINFO DRM_IOR(0x15, struct drm_pciinfo) ++#endif ++ + std::vector get_devices() { ++#ifdef DRM_IOCTL_GET_PCIINFO ++ std::vector result; ++ for (int i = 0; i < 64; ++i) { ++#if defined(__FreeBSD__) && __FreeBSD__ < 13 ++ std::string mib = "dev.drm." + std::to_string(128 + i) + ".PCI_ID"; ++ char pci_id[20]; ++ size_t len = sizeof(pci_id); ++ if (sysctlbyname(mib.c_str(), pci_id, &len, NULL, 0)) continue; ++ Device device; ++ sscanf(pci_id, "%x:%x", &device.vendor_id, &device.device_id); ++#else ++ std::string path = "/dev/dri/renderD" + std::to_string(128 + i); ++ int fd = open(path.c_str(), O_RDONLY); ++ if (fd == -1) continue; ++ struct drm_pciinfo pinfo; ++ if (ioctl(fd, DRM_IOCTL_GET_PCIINFO, &pinfo)) { ++ close(fd); ++ continue; ++ } ++ Device device = { .vendor_id = pinfo.vendor_id, .device_id = pinfo.device_id }; ++ close(fd); ++#endif // defined(__FreeBSD__) && __FreeBSD__ < 13 ++ if (device.vendor_id != 0x8086) { // Filter out non-Intel devices ++ continue; ++ } ++ device.platform = get_platform(device.device_id); ++ result.emplace_back(device); ++ } ++#else + const char *dir = "/sys/class/drm"; + const char *device_id_file = "/device/device"; + const char *vendor_id_file = "/device/vendor"; +@@ -431,6 +486,7 @@ std::vector get_devices() { + device.platform = get_platform(device.device_id); + result.emplace_back(device); + } ++#endif + std::sort(result.begin(), result.end(), [](const Device &a, const Device &b) { + return a.platform < b.platform; + }); diff --git a/multimedia/intel-media-sdk/files/patch-msdk-default b/multimedia/intel-media-sdk/files/patch-msdk-default deleted file mode 100644 index 503fcbbf792f..000000000000 --- a/multimedia/intel-media-sdk/files/patch-msdk-default +++ /dev/null @@ -1,28 +0,0 @@ -/sys/class/drm/renderD*/device/device is Linux-only, so default to -INTEL_MEDIA_RUNTIME=MSDK on other systems. - -$ ffmpeg -hide_banner -init_hw_device qsv=auto -i foo.y4m -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -y foo.mkv -[AVHWDeviceContext @ 0x8062d0140] Error initializing an MFX session: -3. -Device creation failed: -1313558101. -Failed to set value 'qsv=auto' for option 'init_hw_device': Unknown error occurred -Error parsing global options: Unknown error occurred - ---- api/mfx_dispatch/linux/mfxloader.cpp.orig 2021-09-29 15:58:50 UTC -+++ api/mfx_dispatch/linux/mfxloader.cpp -@@ -181,11 +181,16 @@ mfxStatus LoaderCtx::Init(mfxInitParam& par) - return MFX_ERR_UNSUPPORTED; - } - -+#ifdef __linux__ - eMFXHWType platform = MFX_HW_UNKNOWN; - auto devices = get_devices(); - if (devices.size()) { - platform = devices[devices.size() - 1].platform; - } -+#else -+ // Assume a legacy generation not supported by oneVPL-intel-gpu -+ eMFXHWType platform = MFX_HW_SKL; -+#endif - - std::vector libs; -