From: "Yew, Chang Ching" <[email protected]>

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 <[email protected]>
Signed-off-by: Anuj Mittal <[email protected]>
Signed-off-by: Yew, Chang Ching <[email protected]>
---
 ...ort-of-DRM_FORMAT_NV12-for-console-m.patch | 170 ++++++++++++++++++
 ...-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

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" <[email protected]>
+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 <[email protected]>
+Signed-off-by: Sodhi, Vunny <[email protected]>
+Signed-off-by: Yew, Chang Ching <[email protected]>
+---
+ .../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 <sys/ioctl.h>
+     #include "vaapi_allocator.h"
+ 
+-    #include <stdexcept>
+-
+     #include <drm_fourcc.h>
++    #include <stdexcept>
++    #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" <[email protected]>
+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 <[email protected]>
+Signed-off-by: Yew, Chang Ching <[email protected]>
+---
+ 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"
-- 
2.32.0

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#7222): 
https://lists.yoctoproject.org/g/meta-intel/message/7222
Mute This Topic: https://lists.yoctoproject.org/mt/85129898/21656
Group Owner: [email protected]
Unsubscribe: https://lists.yoctoproject.org/g/meta-intel/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to