From 61f75283da56105adca1d3034422ddac2bc88c18 Mon Sep 17 00:00:00 2001 From: Vincent Cheah Beng Keat Date: Wed, 19 Jun 2024 21:08:14 +0800 Subject: [PATCH 4/9] Fix rDRM DMA methods Upstream-Status: Backport [https://github.com/intel/libvpl-tools/commit/0c12ef0fed3d2e8c8f017e6fa5bf74e55ec51412] The commits also remove out libDRM intel bufmgr (i915) dependency where XE does not have the equivalent API. Tested i915 for both DRM_PRIME and KERNEL_DRM, both methods could work correctly. Signed-off-by: Lim Siew Hoon --- .../sample_common/include/vaapi_utils.h | 2 + .../sample_common/include/vaapi_utils_drm.h | 2 + .../legacy/sample_common/src/vaapi_utils.cpp | 3 +- .../sample_common/src/vaapi_utils_drm.cpp | 159 ++++++++++-------- 4 files changed, 93 insertions(+), 73 deletions(-) diff --git a/tools/legacy/sample_common/include/vaapi_utils.h b/tools/legacy/sample_common/include/vaapi_utils.h index a3a8544..868dd0e 100644 --- a/tools/legacy/sample_common/include/vaapi_utils.h +++ b/tools/legacy/sample_common/include/vaapi_utils.h @@ -281,6 +281,7 @@ public: typedef drm_intel_bufmgr* (*drm_intel_bufmgr_gem_init_type)(int fd, int batch_size); typedef int (*drm_intel_bo_gem_export_to_prime_type)(drm_intel_bo*, int*); typedef void (*drm_intel_bufmgr_destroy_type)(drm_intel_bufmgr*); + typedef int (*drmPrimeFDToHandle_type)(int fd, int prime_fd, uint32_t* handle); DrmIntel_Proxy(); ~DrmIntel_Proxy(); @@ -290,6 +291,7 @@ public: __DECLARE(drm_intel_bo_unreference); __DECLARE(drm_intel_bufmgr_gem_init); __DECLARE(drm_intel_bufmgr_destroy); + __DECLARE(drmPrimeFDToHandle); #if defined(X11_DRI3_SUPPORT) __DECLARE(drm_intel_bo_gem_export_to_prime); #endif diff --git a/tools/legacy/sample_common/include/vaapi_utils_drm.h b/tools/legacy/sample_common/include/vaapi_utils_drm.h index 78109aa..1ba6ea8 100644 --- a/tools/legacy/sample_common/include/vaapi_utils_drm.h +++ b/tools/legacy/sample_common/include/vaapi_utils_drm.h @@ -130,6 +130,8 @@ private: mfxExtContentLightLevelInfo* contentLight, bool enableHDR); + uint32_t convertVaFourccToDrmFormat(uint32_t vaFourcc); + const MfxLoader::DRM_Proxy m_drmlib; const MfxLoader::DrmIntel_Proxy m_drmintellib; diff --git a/tools/legacy/sample_common/src/vaapi_utils.cpp b/tools/legacy/sample_common/src/vaapi_utils.cpp index f01b07f..48a51b0 100644 --- a/tools/legacy/sample_common/src/vaapi_utils.cpp +++ b/tools/legacy/sample_common/src/vaapi_utils.cpp @@ -136,7 +136,8 @@ DrmIntel_Proxy::DrmIntel_Proxy() SIMPLE_LOADER_FUNCTION(drm_intel_bo_gem_create_from_prime), SIMPLE_LOADER_FUNCTION(drm_intel_bo_unreference), SIMPLE_LOADER_FUNCTION(drm_intel_bufmgr_gem_init), - SIMPLE_LOADER_FUNCTION(drm_intel_bufmgr_destroy) + SIMPLE_LOADER_FUNCTION(drm_intel_bufmgr_destroy), + SIMPLE_LOADER_FUNCTION(drmPrimeFDToHandle) #if defined(X11_DRI3_SUPPORT) , SIMPLE_LOADER_FUNCTION(drm_intel_bo_gem_export_to_prime) diff --git a/tools/legacy/sample_common/src/vaapi_utils_drm.cpp b/tools/legacy/sample_common/src/vaapi_utils_drm.cpp index 7227588..44bc693 100644 --- a/tools/legacy/sample_common/src/vaapi_utils_drm.cpp +++ b/tools/legacy/sample_common/src/vaapi_utils_drm.cpp @@ -14,6 +14,7 @@ #include #include + #include #include "i915_drm.h" #include "vaapi_utils_drm.h" @@ -211,7 +212,6 @@ drmRenderer::drmRenderer(int fd, mfxI32 monitorType) m_crtc(), m_connectorProperties(), m_crtcProperties(), - m_bufmgr(NULL), m_overlay_wrn(true), m_bSentHDR(false), m_bHdrSupport(false), @@ -257,11 +257,6 @@ drmRenderer::~drmRenderer() { m_drmlib.drmModeFreeCrtc(m_crtc); m_drmlib.drmModeFreeObjectProperties(m_connectorProperties); m_drmlib.drmModeFreeObjectProperties(m_crtcProperties); - - if (m_bufmgr) { - m_drmintellib.drm_intel_bufmgr_destroy(m_bufmgr); - m_bufmgr = NULL; - } } drmModeObjectPropertiesPtr drmRenderer::getProperties(int fd, int objectId, int32_t objectTypeId) { @@ -752,36 +747,75 @@ int drmRenderer::drmSendHdrMetaData(mfxExtMasteringDisplayColourVolume* displayC return 0; } +uint32_t drmRenderer::convertVaFourccToDrmFormat(uint32_t vaFourcc) { + switch (vaFourcc) { + case VA_FOURCC_ARGB: + return DRM_FORMAT_ARGB8888; + case VA_FOURCC_NV12: + return DRM_FORMAT_NV12; + #if defined(DRM_LINUX_P010_SUPPORT) + case VA_FOURCC_P010: + return DRM_FORMAT_P010; + #endif + + default: + printf("unsupported fourcc\n"); + return 0; + } +} + void* drmRenderer::acquire(mfxMemId mid) { - vaapiMemId* vmid = (vaapiMemId*)mid; + vaapiMemId* vmid = (vaapiMemId*)mid; + uint32_t fbhandle = 0; + uint32_t handles[4], pitches[4], offsets[4], flags = 0; + uint64_t modifiers[4]; + int ret; + + MSDK_ZERO_MEMORY(handles); + MSDK_ZERO_MEMORY(pitches); + MSDK_ZERO_MEMORY(offsets); + MSDK_ZERO_MEMORY(modifiers); if (vmid->m_buffer_info.mem_type == VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME) { - if (!m_bufmgr) { - m_bufmgr = m_drmintellib.drm_intel_bufmgr_gem_init(m_fd, 4096); - if (!m_bufmgr) - return NULL; - } + uint32_t bo_handle; - drm_intel_bo* bo = - m_drmintellib.drm_intel_bo_gem_create_from_prime(m_bufmgr, - (int)vmid->m_buffer_info.handle, - vmid->m_buffer_info.mem_size); - if (!bo) + ret = m_drmintellib.drmPrimeFDToHandle(m_fd, (int)vmid->m_buffer_info.handle, &bo_handle); + if (ret) return NULL; - int ret = m_drmlib.drmModeAddFB(m_fd, - vmid->m_image.width, - vmid->m_image.height, - 24, - 32, - vmid->m_image.pitches[0], - bo->handle, - &fbhandle); - if (ret) { - return NULL; + for (uint32_t i = 0; i < vmid->m_image.num_planes; i++) { + pitches[i] = vmid->m_image.pitches[i]; + offsets[i] = vmid->m_image.offsets[i]; + handles[i] = bo_handle; + + if (VA_FOURCC_NV12 == vmid->m_fourcc + #if defined(DRM_LINUX_P010_SUPPORT) + || VA_FOURCC_P010 == vmid->m_fourcc + #endif + ) { + flags = DRM_MODE_FB_MODIFIERS; + modifiers[i] = I915_FORMAT_MOD_Y_TILED; + if (m_bRequiredTiled4) { + #if defined(DRM_LINUX_MODIFIER_TILED4_SUPPORT) + modifiers[i] = I915_FORMAT_MOD_4_TILED; + #endif + } + } } - m_drmintellib.drm_intel_bo_unreference(bo); + + ret = m_drmlib.drmModeAddFB2WithModifiers(m_fd, + vmid->m_image.width, + vmid->m_image.height, + convertVaFourccToDrmFormat(vmid->m_fourcc), + handles, + pitches, + offsets, + modifiers, + &fbhandle, + flags); + if (ret) + return NULL; } else if (vmid->m_buffer_info.mem_type == VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM) { struct drm_gem_open flink_open; @@ -793,62 +827,42 @@ void* drmRenderer::acquire(mfxMemId mid) { if (ret) return NULL; - uint32_t handles[4], pitches[4], offsets[4], pixel_format, flags = 0; - uint64_t modifiers[4]; - - memset(&handles, 0, sizeof(handles)); - memset(&pitches, 0, sizeof(pitches)); - memset(&offsets, 0, sizeof(offsets)); - memset(&modifiers, 0, sizeof(modifiers)); - - handles[0] = flink_open.handle; - pitches[0] = vmid->m_image.pitches[0]; - offsets[0] = vmid->m_image.offsets[0]; + for (uint32_t i = 0; i < vmid->m_image.num_planes; i++) { + pitches[i] = vmid->m_image.pitches[i]; + offsets[i] = vmid->m_image.offsets[i]; + handles[i] = flink_open.handle; - if (VA_FOURCC_NV12 == vmid->m_fourcc + if (VA_FOURCC_NV12 == vmid->m_fourcc #if defined(DRM_LINUX_P010_SUPPORT) - || VA_FOURCC_P010 == vmid->m_fourcc + || VA_FOURCC_P010 == vmid->m_fourcc #endif - ) { - pixel_format = DRM_FORMAT_NV12; - #if defined(DRM_LINUX_P010_SUPPORT) - if (VA_FOURCC_P010 == vmid->m_fourcc) - pixel_format = DRM_FORMAT_P010; - #endif - handles[1] = flink_open.handle; - pitches[1] = vmid->m_image.pitches[1]; - offsets[1] = vmid->m_image.offsets[1]; - modifiers[0] = modifiers[1] = I915_FORMAT_MOD_Y_TILED; - flags = DRM_MODE_FB_MODIFIERS; - - if (m_bRequiredTiled4) { + ) { + flags = DRM_MODE_FB_MODIFIERS; + modifiers[i] = I915_FORMAT_MOD_Y_TILED; + if (m_bRequiredTiled4) { #if defined(DRM_LINUX_MODIFIER_TILED4_SUPPORT) - modifiers[0] = modifiers[1] = I915_FORMAT_MOD_4_TILED; + modifiers[i] = I915_FORMAT_MOD_4_TILED; #endif - } - else { - modifiers[0] = modifiers[1] = I915_FORMAT_MOD_Y_TILED; - - struct drm_i915_gem_set_tiling set_tiling; - memset(&set_tiling, 0, sizeof(set_tiling)); - set_tiling.handle = flink_open.handle; - set_tiling.tiling_mode = I915_TILING_Y; - set_tiling.stride = vmid->m_image.pitches[0]; - ret = m_drmlib.drmIoctl(m_fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling); - if (ret) { - printf("DRM_IOCTL_I915_GEM_SET_TILING Failed ret = %d\n", ret); - return NULL; + } + else { + struct drm_i915_gem_set_tiling set_tiling; + memset(&set_tiling, 0, sizeof(set_tiling)); + set_tiling.handle = flink_open.handle; + set_tiling.tiling_mode = I915_TILING_Y; + set_tiling.stride = vmid->m_image.pitches[0]; + ret = m_drmlib.drmIoctl(m_fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling); + if (ret) { + printf("DRM_IOCTL_I915_GEM_SET_TILING Failed ret = %d\n", ret); + return NULL; + } } } } - else { - pixel_format = DRM_FORMAT_XRGB8888; - } ret = m_drmlib.drmModeAddFB2WithModifiers(m_fd, vmid->m_image.width, vmid->m_image.height, - pixel_format, + convertVaFourccToDrmFormat(vmid->m_fourcc), handles, pitches, offsets, @@ -905,6 +919,7 @@ mfxStatus drmRenderer::render(mfxFrameSurface1* pSurface) { if (!setMaster()) { return MFX_ERR_UNKNOWN; } + if ((m_mode.hdisplay == memid->m_image.width) && (m_mode.vdisplay == memid->m_image.height)) { // surface in the framebuffer exactly matches crtc scanout port, so we // can scanout from this framebuffer for the whole crtc -- 2.43.2