From 036ca44cbb943f1bf46ad060d6f2e58ff276dfa7 Mon Sep 17 00:00:00 2001 From: "Yew, Chang Ching" Date: Wed, 25 Aug 2021 13:59:16 +0800 Subject: onevpl: Add support of DRM_FORMAT_NV12 and fix tile issue Currently in drm/console mode only RGB4 direct rendering is possible. This patch add NV12 format support. If we are using I915_FORMAT_MOD_Y_TILED which is needed for NV12 format then modifiers need to be enabled which can be passed as flags argument to ioctl. Signed-off-by: Sodhi, Vunny Signed-off-by: Anuj Mittal Signed-off-by: Yew, Chang Ching Signed-off-by: Anuj Mittal --- ...-support-of-DRM_FORMAT_NV12-for-console-m.patch | 170 +++++++++++++++++++++ ...Fixed-tile-modifier-issue-for-NV12-format.patch | 51 +++++++ recipes-multimedia/onevpl/onevpl_2021.5.0.bb | 2 + 3 files changed, 223 insertions(+) create mode 100644 recipes-multimedia/onevpl/onevpl/0001-samples-Add-support-of-DRM_FORMAT_NV12-for-console-m.patch create mode 100644 recipes-multimedia/onevpl/onevpl/0001-samples-Fixed-tile-modifier-issue-for-NV12-format.patch (limited to 'recipes-multimedia') diff --git a/recipes-multimedia/onevpl/onevpl/0001-samples-Add-support-of-DRM_FORMAT_NV12-for-console-m.patch b/recipes-multimedia/onevpl/onevpl/0001-samples-Add-support-of-DRM_FORMAT_NV12-for-console-m.patch new file mode 100644 index 00000000..a5191fe2 --- /dev/null +++ b/recipes-multimedia/onevpl/onevpl/0001-samples-Add-support-of-DRM_FORMAT_NV12-for-console-m.patch @@ -0,0 +1,170 @@ +From a7f667debb6cf3007ef5b581a91ff7c925d623c3 Mon Sep 17 00:00:00 2001 +From: "Yew, Chang Ching" +Date: Wed, 25 Aug 2021 11:13:28 +0000 +Subject: [PATCH 1/2] samples: Add support of DRM_FORMAT_NV12 for console mode + rendering + +Currently in drm/console mode only RGB4 direct rendering +is possible. This patch add NV12 format provided your +platform and kernel can support it. + +Tested both formats using: +sample_encode h265 -i 4k.h265 -rdrm -nv12 +sample_encode h265 -i 4k.h265 -rdrm -rgb4 + +Upstream-Status: Submitted +innersource PR #221 + +Signed-off: Fu, Wei A +Signed-off-by: Sodhi, Vunny +Signed-off-by: Yew, Chang Ching +--- + .../sample_common/include/vaapi_utils.h | 11 ++++ + .../sample_common/src/vaapi_allocator.cpp | 1 + + .../legacy/sample_common/src/vaapi_utils.cpp | 1 + + .../sample_common/src/vaapi_utils_drm.cpp | 61 +++++++++++++++---- + 4 files changed, 63 insertions(+), 11 deletions(-) + +diff --git a/tools/legacy/sample_common/include/vaapi_utils.h b/tools/legacy/sample_common/include/vaapi_utils.h +index 53318630..9df5507b 100644 +--- a/tools/legacy/sample_common/include/vaapi_utils.h ++++ b/tools/legacy/sample_common/include/vaapi_utils.h +@@ -149,6 +149,16 @@ public: + uint32_t pitch, + uint32_t bo_handle, + uint32_t* buf_id); ++ typedef int (*drmModeAddFB2WithModifiers_type)(int fd, ++ uint32_t width, ++ uint32_t height, ++ uint32_t pixel_format, ++ uint32_t bo_handles[4], ++ uint32_t pitches[4], ++ uint32_t offsets[4], ++ uint64_t modifier[4], ++ uint32_t* buf_id, ++ uint32_t flags); + typedef void (*drmModeFreeConnector_type)(drmModeConnectorPtr ptr); + typedef void (*drmModeFreeCrtc_type)(drmModeCrtcPtr ptr); + typedef void (*drmModeFreeEncoder_type)(drmModeEncoderPtr ptr); +@@ -192,6 +202,7 @@ public: + #define __DECLARE(name) const name##_type name + __DECLARE(drmIoctl); + __DECLARE(drmModeAddFB); ++ __DECLARE(drmModeAddFB2WithModifiers); + __DECLARE(drmModeFreeConnector); + __DECLARE(drmModeFreeCrtc); + __DECLARE(drmModeFreeEncoder); +diff --git a/tools/legacy/sample_common/src/vaapi_allocator.cpp b/tools/legacy/sample_common/src/vaapi_allocator.cpp +index 51690186..12ace297 100644 +--- a/tools/legacy/sample_common/src/vaapi_allocator.cpp ++++ b/tools/legacy/sample_common/src/vaapi_allocator.cpp +@@ -364,6 +364,7 @@ mfxStatus vaapiFrameAllocator::AllocImpl(mfxFrameAllocRequest* request, + } + } + if (m_exporter) { ++ vaapi_mids[i].m_fourcc = va_fourcc; + vaapi_mids[i].m_custom = m_exporter->acquire(&vaapi_mids[i]); + if (!vaapi_mids[i].m_custom) { + mfx_res = MFX_ERR_UNKNOWN; +diff --git a/tools/legacy/sample_common/src/vaapi_utils.cpp b/tools/legacy/sample_common/src/vaapi_utils.cpp +index b69dbe44..9531c65b 100644 +--- a/tools/legacy/sample_common/src/vaapi_utils.cpp ++++ b/tools/legacy/sample_common/src/vaapi_utils.cpp +@@ -94,6 +94,7 @@ DRM_Proxy::DRM_Proxy() + : lib("libdrm.so.2"), + SIMPLE_LOADER_FUNCTION(drmIoctl), + SIMPLE_LOADER_FUNCTION(drmModeAddFB), ++ SIMPLE_LOADER_FUNCTION(drmModeAddFB2WithModifiers), + SIMPLE_LOADER_FUNCTION(drmModeFreeConnector), + SIMPLE_LOADER_FUNCTION(drmModeFreeCrtc), + SIMPLE_LOADER_FUNCTION(drmModeFreeEncoder), +diff --git a/tools/legacy/sample_common/src/vaapi_utils_drm.cpp b/tools/legacy/sample_common/src/vaapi_utils_drm.cpp +index c896017b..cf8d7ba7 100644 +--- a/tools/legacy/sample_common/src/vaapi_utils_drm.cpp ++++ b/tools/legacy/sample_common/src/vaapi_utils_drm.cpp +@@ -11,9 +11,9 @@ + #include + #include "vaapi_allocator.h" + +- #include +- + #include ++ #include ++ #include "i915_drm.h" + #include "vaapi_utils_drm.h" + + constexpr mfxU32 MFX_DRI_MAX_NODES_NUM = 16; +@@ -311,7 +311,8 @@ bool drmRenderer::getPlane() { + if (plane) { + if (plane->possible_crtcs & (1 << m_crtcIndex)) { + for (uint32_t j = 0; j < plane->count_formats; ++j) { +- if (plane->formats[j] == DRM_FORMAT_XRGB8888) { ++ if ((plane->formats[j] == DRM_FORMAT_XRGB8888) || ++ (plane->formats[j] == DRM_FORMAT_NV12)) { + m_planeID = plane->plane_id; + m_drmlib.drmModeFreePlane(plane); + m_drmlib.drmModeFreePlaneResources(planes); +@@ -404,14 +405,52 @@ void* drmRenderer::acquire(mfxMemId mid) { + if (ret) + return NULL; + +- ret = m_drmlib.drmModeAddFB(m_fd, +- vmid->m_image.width, +- vmid->m_image.height, +- 24, +- 32, +- vmid->m_image.pitches[0], +- flink_open.handle, +- &fbhandle); ++ uint32_t handles[4], pitches[4], offsets[4], pixel_format; ++ 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]; ++ ++ if (VA_FOURCC_NV12 == vmid->m_fourcc) { ++ struct drm_i915_gem_set_tiling set_tiling; ++ ++ pixel_format = DRM_FORMAT_NV12; ++ 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) { ++ msdk_printf(MSDK_STRING("DRM_IOCTL_I915_GEM_SET_TILING Failed ret = %d\n"), ret); ++ return NULL; ++ } ++ ++ 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; ++ } ++ else { ++ pixel_format = DRM_FORMAT_XRGB8888; ++ } ++ ++ ret = m_drmlib.drmModeAddFB2WithModifiers(m_fd, ++ vmid->m_image.width, ++ vmid->m_image.height, ++ pixel_format, ++ handles, ++ pitches, ++ offsets, ++ modifiers, ++ &fbhandle, ++ 0); ++ + if (ret) + return NULL; + +-- +2.31.1 + diff --git a/recipes-multimedia/onevpl/onevpl/0001-samples-Fixed-tile-modifier-issue-for-NV12-format.patch b/recipes-multimedia/onevpl/onevpl/0001-samples-Fixed-tile-modifier-issue-for-NV12-format.patch new file mode 100644 index 00000000..c798e3f1 --- /dev/null +++ b/recipes-multimedia/onevpl/onevpl/0001-samples-Fixed-tile-modifier-issue-for-NV12-format.patch @@ -0,0 +1,51 @@ +From 15cc366b66b625b0b2613a4365e7777563325a94 Mon Sep 17 00:00:00 2001 +From: "Yew, Chang Ching" +Date: Wed, 25 Aug 2021 11:20:30 +0000 +Subject: [PATCH 2/2] samples: Fixed tile modifier issue for NV12 format + +If we are using I915_FORMAT_MOD_Y_TILED which is needed for +NV12 format then modifiers need to be enabled which can be passed +as flags argument to ioctl. + +Upstream-Status: Submitted +innersource PR #221 + +Signed-off-by: Sodhi, Vunny +Signed-off-by: Yew, Chang Ching +--- + tools/legacy/sample_common/src/vaapi_utils_drm.cpp | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/tools/legacy/sample_common/src/vaapi_utils_drm.cpp b/tools/legacy/sample_common/src/vaapi_utils_drm.cpp +index cf8d7ba7..3df3bb8a 100644 +--- a/tools/legacy/sample_common/src/vaapi_utils_drm.cpp ++++ b/tools/legacy/sample_common/src/vaapi_utils_drm.cpp +@@ -405,7 +405,7 @@ void* drmRenderer::acquire(mfxMemId mid) { + if (ret) + return NULL; + +- uint32_t handles[4], pitches[4], offsets[4], pixel_format; ++ uint32_t handles[4], pitches[4], offsets[4], pixel_format, flags = 0; + uint64_t modifiers[4]; + + memset(&handles, 0, sizeof(handles)); +@@ -435,6 +435,7 @@ void* drmRenderer::acquire(mfxMemId mid) { + pitches[1] = vmid->m_image.pitches[1]; + offsets[1] = vmid->m_image.offsets[1]; + modifiers[0] = modifiers[1] = I915_FORMAT_MOD_Y_TILED; ++ flags = 2; // DRM_MODE_FB_MODIFIERS (1<<1) /* enables ->modifer[] + } + else { + pixel_format = DRM_FORMAT_XRGB8888; +@@ -449,7 +450,7 @@ void* drmRenderer::acquire(mfxMemId mid) { + offsets, + modifiers, + &fbhandle, +- 0); ++ flags); + + if (ret) + return NULL; +-- +2.31.1 + diff --git a/recipes-multimedia/onevpl/onevpl_2021.5.0.bb b/recipes-multimedia/onevpl/onevpl_2021.5.0.bb index bb7ec49d..da530d64 100644 --- a/recipes-multimedia/onevpl/onevpl_2021.5.0.bb +++ b/recipes-multimedia/onevpl/onevpl_2021.5.0.bb @@ -11,6 +11,8 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c18ea6bb4786a26bf4eee88a7424a408 \ SRC_URI = "git://github.com/oneapi-src/oneVPL.git;protocol=https \ file://0001-Fix-the-rendering-to-X11-failures.patch \ file://0001-Fix-compile-issue-with-CMAKE_CXX_FLAGS-setting.patch \ + file://0001-samples-Add-support-of-DRM_FORMAT_NV12-for-console-m.patch \ + file://0001-samples-Fixed-tile-modifier-issue-for-NV12-format.patch \ " SRCREV = "dde640ef0872b645d6e0275a6aaec26c01a9c0b9" S = "${WORKDIR}/git" -- cgit v1.2.3-54-g00ecf