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 +++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 recipes-multimedia/onevpl/onevpl/0001-samples-Add-support-of-DRM_FORMAT_NV12-for-console-m.patch (limited to 'recipes-multimedia/onevpl/onevpl/0001-samples-Add-support-of-DRM_FORMAT_NV12-for-console-m.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" +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 + -- cgit v1.2.3-54-g00ecf