From bcb572f18031201227adf2a094afdc58035a97dd Mon Sep 17 00:00:00 2001 From: ZhuChenyanX Date: Tue, 21 Jan 2025 08:39:19 +0000 Subject: [PATCH] Use dgpu for codec when dual gpu case Find dgpu by local memory check, instead of node number. It's also available to select igpu/dgpu by property. Need to check property read permission. Tracked-On: OAM-129940 Signed-off-by: ZhuChenyanX --- _studio/mfx_lib/shared/src/libmfxsw.cpp | 66 ++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/_studio/mfx_lib/shared/src/libmfxsw.cpp b/_studio/mfx_lib/shared/src/libmfxsw.cpp index d3cff5f4..4ac3fdbf 100644 --- a/_studio/mfx_lib/shared/src/libmfxsw.cpp +++ b/_studio/mfx_lib/shared/src/libmfxsw.cpp @@ -32,6 +32,7 @@ #include #include #include "va/drm/va_drm.h" +#include #include "mediasdk_version.h" #include "libmfx_core_factory.h" @@ -41,6 +42,10 @@ #include "mfx_unified_decode_logging.h" +#if defined(ANDROID) +#include +#endif + mfxStatus MFXInit(mfxIMPL implParam, mfxVersion *ver, mfxSession *session) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_API, __FUNCTION__); @@ -222,7 +227,7 @@ mfxStatus MFXDoWork(mfxSession session) } MFXIUnknown * pInt = session->m_pScheduler; - MFXIScheduler2 *newScheduler = + MFXIScheduler2 *newScheduler = ::QueryInterface(pInt, MFXIScheduler2_GUID); if (!newScheduler) @@ -610,8 +615,62 @@ GetAdapterInfo(mfxU64 adapterId) return result; } +static int IsIntelDgpu(int fd) +{ + struct drm_i915_query_item item = { + .query_id = DRM_I915_QUERY_MEMORY_REGIONS, + }; + + struct drm_i915_query query = { + .num_items = 1, .items_ptr = (uintptr_t)&item, + }; + if (drmIoctl(fd, DRM_IOCTL_I915_QUERY, &query)) { + fprintf(stderr, "drv: Failed to DRM_IOCTL_I915_QUERY"); + return 0; + } + + struct drm_i915_query_memory_regions *meminfo = (struct drm_i915_query_memory_regions *)calloc(1, item.length); + if (!meminfo) { + fprintf(stderr, "drv: %s Exit due to memory allocation failure", __func__); + return 0; + } + + item.data_ptr = (uintptr_t)meminfo; + if (drmIoctl(fd, DRM_IOCTL_I915_QUERY, &query) || item.length <= 0) { + free(meminfo); + fprintf(stderr, "%s:%d DRM_IOCTL_I915_QUERY error", __FUNCTION__, __LINE__); + return 0; + } + + int has_sys = 0, has_local = 0; + for (uint32_t i = 0; i < meminfo->num_regions; i++) { + const struct drm_i915_memory_region_info *mem = &meminfo->regions[i]; + switch (mem->region.memory_class) { + case I915_MEMORY_CLASS_SYSTEM: + has_sys = 1; + break; + case I915_MEMORY_CLASS_DEVICE: + has_local = 1; + break; + default: + break; + } + } + + free(meminfo); + return has_local; +} + static bool QueryImplCaps(std::function < bool (VideoCORE&, mfxU32, mfxU32 , mfxU64, const std::vector& ) > QueryImpls) { + int use_dgpu = 1; +#if defined(ANDROID) + char value[PROPERTY_VALUE_MAX] = {}; + + property_get("video.hw.dgpu", value, "1"); + use_dgpu = atoi(value); +#endif + for (int i = 0; i < 64; ++i) { std::string path; @@ -685,6 +744,11 @@ static bool QueryImplCaps(std::function < bool (VideoCORE&, mfxU32, mfxU32 , mfx if (!QueryImpls(*pCore, deviceId, i, fd, subDevMask)) return false; + + // If specify to use dgpu and found dgpu, return the first found dgpu, + // otherwise use the last available intel node for codec + if (use_dgpu && IsIntelDgpu(fd)) + return true; } } }