From 4c6e2a6722de4ed923cf29bc0bf65ddd8f45a2cf Mon Sep 17 00:00:00 2001 From: Gale Date: Wed, 3 Apr 2024 14:38:44 -0700 Subject: [PATCH] obs-qsv11: Fix for QSV AV1 in multi-GPU system --- plugins/obs-qsv11/QSV_Encoder.cpp | 31 +--------------------- plugins/obs-qsv11/QSV_Encoder.h | 1 - plugins/obs-qsv11/QSV_Encoder_Internal.cpp | 6 ++--- plugins/obs-qsv11/QSV_Encoder_Internal.h | 5 +--- plugins/obs-qsv11/common_utils.cpp | 1 + plugins/obs-qsv11/common_utils.h | 3 ++- plugins/obs-qsv11/common_utils_windows.cpp | 28 +++++++++++++++++-- plugins/obs-qsv11/obs-qsv11.c | 2 +- 8 files changed, 35 insertions(+), 42 deletions(-) diff --git a/plugins/obs-qsv11/QSV_Encoder.cpp b/plugins/obs-qsv11/QSV_Encoder.cpp index 544cc7482..14ea63d93 100644 --- a/plugins/obs-qsv11/QSV_Encoder.cpp +++ b/plugins/obs-qsv11/QSV_Encoder.cpp @@ -79,30 +79,7 @@ void qsv_encoder_version(unsigned short *major, unsigned short *minor) qsv_t *qsv_encoder_open(qsv_param_t *pParams, enum qsv_codec codec) { - obs_video_info ovi; - obs_get_video_info(&ovi); - size_t adapter_idx = ovi.adapter; - - // Select current adapter - will be iGPU if exists due to adapter reordering - if (codec == QSV_CODEC_AV1 && !adapters[adapter_idx].supports_av1) { - for (size_t i = 0; i < 4; i++) { - if (adapters[i].supports_av1) { - adapter_idx = i; - break; - } - } - } else if (!adapters[adapter_idx].is_intel) { - for (size_t i = 0; i < 4; i++) { - if (adapters[i].is_intel) { - adapter_idx = i; - break; - } - } - } - - bool isDGPU = adapters[adapter_idx].is_dgpu; - - QSV_Encoder_Internal *pEncoder = new QSV_Encoder_Internal(ver, isDGPU); + QSV_Encoder_Internal *pEncoder = new QSV_Encoder_Internal(ver); mfxStatus sts = pEncoder->Open(pParams, codec); if (sts != MFX_ERR_NONE) { @@ -191,12 +168,6 @@ qsv_t *qsv_encoder_open(qsv_param_t *pParams, enum qsv_codec codec) return (qsv_t *)pEncoder; } -bool qsv_encoder_is_dgpu(qsv_t *pContext) -{ - QSV_Encoder_Internal *pEncoder = (QSV_Encoder_Internal *)pContext; - return pEncoder->IsDGPU(); -} - int qsv_encoder_headers(qsv_t *pContext, uint8_t **pSPS, uint8_t **pPPS, uint16_t *pnSPS, uint16_t *pnPPS) { diff --git a/plugins/obs-qsv11/QSV_Encoder.h b/plugins/obs-qsv11/QSV_Encoder.h index 59dc239bd..8c2b83cff 100644 --- a/plugins/obs-qsv11/QSV_Encoder.h +++ b/plugins/obs-qsv11/QSV_Encoder.h @@ -159,7 +159,6 @@ int qsv_param_default_preset(qsv_param_t *, const char *preset, int qsv_encoder_reconfig(qsv_t *, qsv_param_t *); void qsv_encoder_version(unsigned short *major, unsigned short *minor); qsv_t *qsv_encoder_open(qsv_param_t *, enum qsv_codec codec); -bool qsv_encoder_is_dgpu(qsv_t *); void qsv_encoder_add_roi(qsv_t *, const struct obs_encoder_roi *roi); void qsv_encoder_clear_roi(qsv_t *pContext); int qsv_encoder_encode(qsv_t *, uint64_t, uint8_t *, uint8_t *, uint32_t, diff --git a/plugins/obs-qsv11/QSV_Encoder_Internal.cpp b/plugins/obs-qsv11/QSV_Encoder_Internal.cpp index 2322710c4..c35e8d5b7 100644 --- a/plugins/obs-qsv11/QSV_Encoder_Internal.cpp +++ b/plugins/obs-qsv11/QSV_Encoder_Internal.cpp @@ -71,7 +71,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mfxHDL QSV_Encoder_Internal::g_DX_Handle = NULL; mfxU16 QSV_Encoder_Internal::g_numEncodersOpen = 0; -QSV_Encoder_Internal::QSV_Encoder_Internal(mfxVersion &version, bool isDGPU) +QSV_Encoder_Internal::QSV_Encoder_Internal(mfxVersion &version) : m_pmfxSurfaces(NULL), m_pmfxENC(NULL), m_nSPSBufferSize(1024), @@ -81,8 +81,8 @@ QSV_Encoder_Internal::QSV_Encoder_Internal(mfxVersion &version, bool isDGPU) m_nTaskIdx(0), m_nFirstSyncTask(0), m_outBitstream(), - m_isDGPU(isDGPU), - m_sessionData(NULL) + m_sessionData(NULL), + m_ver(version) { mfxVariant tempImpl; mfxStatus sts; diff --git a/plugins/obs-qsv11/QSV_Encoder_Internal.h b/plugins/obs-qsv11/QSV_Encoder_Internal.h index cfd9e12d5..b3e98bc79 100644 --- a/plugins/obs-qsv11/QSV_Encoder_Internal.h +++ b/plugins/obs-qsv11/QSV_Encoder_Internal.h @@ -63,7 +63,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class QSV_Encoder_Internal { public: - QSV_Encoder_Internal(mfxVersion &version, bool isDGPU); + QSV_Encoder_Internal(mfxVersion &version); ~QSV_Encoder_Internal(); mfxStatus Open(qsv_param_t *pParams, enum qsv_codec codec); @@ -85,8 +85,6 @@ public: mfxI16 delta); void ClearROI(); - bool IsDGPU() const { return m_isDGPU; } - protected: mfxStatus InitParams(qsv_param_t *pParams, enum qsv_codec codec); mfxStatus AllocateSurfaces(); @@ -135,7 +133,6 @@ private: mfxBitstream m_outBitstream; bool m_bUseD3D11; bool m_bUseTexAlloc; - bool m_isDGPU; static mfxU16 g_numEncodersOpen; static mfxHDL g_DX_Handle; // we only want one handle for all instances to use; diff --git a/plugins/obs-qsv11/common_utils.cpp b/plugins/obs-qsv11/common_utils.cpp index 041923482..bec75c26d 100644 --- a/plugins/obs-qsv11/common_utils.cpp +++ b/plugins/obs-qsv11/common_utils.cpp @@ -6,6 +6,7 @@ struct adapter_info adapters[MAX_ADAPTERS] = {0}; size_t adapter_count = 0; +size_t adapter_index = 0; void PrintErrString(int err, const char *filestr, int line) { diff --git a/plugins/obs-qsv11/common_utils.h b/plugins/obs-qsv11/common_utils.h index 915405ac5..46fcabe4c 100644 --- a/plugins/obs-qsv11/common_utils.h +++ b/plugins/obs-qsv11/common_utils.h @@ -23,6 +23,7 @@ struct adapter_info { #define MAX_ADAPTERS 10 extern struct adapter_info adapters[MAX_ADAPTERS]; extern size_t adapter_count; +extern size_t adapter_index; void util_cpuid(int cpuinfo[4], int flags); void check_adapters(struct adapter_info *adapters, size_t *adapter_count); @@ -162,7 +163,7 @@ int GetFreeTaskIndex(Task *pTaskPool, mfxU16 nPoolSize); mfxStatus Initialize(mfxVersion ver, mfxSession *pSession, mfxFrameAllocator *pmfxAllocator, mfxHDL *deviceHandle, bool bCreateSharedHandles, enum qsv_codec codec, - void **data); //vpl change + void **data); // Release global shared resources (device/display) void Release(); diff --git a/plugins/obs-qsv11/common_utils_windows.cpp b/plugins/obs-qsv11/common_utils_windows.cpp index 17e6386b5..06c91b0c7 100644 --- a/plugins/obs-qsv11/common_utils_windows.cpp +++ b/plugins/obs-qsv11/common_utils_windows.cpp @@ -16,6 +16,7 @@ #include #include +#include /* ======================================================= * Windows implementation of OS-specific utility functions @@ -29,6 +30,29 @@ mfxStatus Initialize(mfxVersion ver, mfxSession *pSession, UNUSED_PARAMETER(codec); UNUSED_PARAMETER(data); + obs_video_info ovi; + obs_get_video_info(&ovi); + mfxU32 adapter_idx = ovi.adapter; + + // Select current adapter - will be iGPU if exists due to adapter reordering + if (codec == QSV_CODEC_AV1 && !adapters[adapter_idx].supports_av1) { + for (mfxU32 i = 0; i < 4; i++) { + if (adapters[i].supports_av1) { + adapter_idx = i; + break; + } + } + } else if (!adapters[adapter_idx].is_intel) { + for (mfxU32 i = 0; i < 4; i++) { + if (adapters[i].is_intel) { + adapter_idx = i; + break; + } + } + } + + adapter_index = adapter_idx; + mfxStatus sts = MFX_ERR_NONE; mfxVariant impl; @@ -56,7 +80,7 @@ mfxStatus Initialize(mfxVersion ver, mfxSession *pSession, (const mfxU8 *)"mfxImplDescription.AccelerationMode", impl); - sts = MFXCreateSession(loader, 0, pSession); + sts = MFXCreateSession(loader, adapter_idx, pSession); MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); // Create DirectX device context @@ -109,7 +133,7 @@ mfxStatus Initialize(mfxVersion ver, mfxSession *pSession, (const mfxU8 *)"mfxImplDescription.AccelerationMode", impl); - sts = MFXCreateSession(loader, 0, pSession); + sts = MFXCreateSession(loader, adapter_idx, pSession); MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); } return sts; diff --git a/plugins/obs-qsv11/obs-qsv11.c b/plugins/obs-qsv11/obs-qsv11.c index fdb2f4d54..a4aefda2e 100644 --- a/plugins/obs-qsv11/obs-qsv11.c +++ b/plugins/obs-qsv11/obs-qsv11.c @@ -1098,7 +1098,7 @@ static inline void cap_resolution(struct obs_qsv *obsqsv, uint32_t width = obs_encoder_get_width(obsqsv->encoder); uint32_t height = obs_encoder_get_height(obsqsv->encoder); - if (qsv_encoder_is_dgpu(obsqsv->context)) + if (adapters[adapter_index].is_dgpu == true) qsv_platform = QSV_CPU_PLATFORM_UNKNOWN; info->height = height;