onevpl: Adding basic wayland dmabuf support to samples

Signed-off-by: Ung, Teng En <teng.en.ung@intel.com>
Signed-off-by: Yew, Chang Ching <chang.ching.yew@intel.com>
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
This commit is contained in:
Yew, Chang Ching 2021-11-08 10:14:29 +08:00 committed by Anuj Mittal
parent 99fd5cb683
commit ff68bb4952
5 changed files with 397 additions and 0 deletions

View File

@ -0,0 +1,90 @@
From 2e2bcb1817f2dc91adf85f5255a4792a6213a74e Mon Sep 17 00:00:00 2001
From: "Ung, Teng En" <teng.en.ung@intel.com>
Date: Fri, 8 Oct 2021 14:19:40 +0000
Subject: [PATCH 2/3] sample_misc: Addin basic wayland dmabuf support.
Upstream-Status: Submitted
innersource PR #269
---
.../sample_misc/wayland/include/class_wayland.h | 16 ++++++++++++++++
.../sample_misc/wayland/src/class_wayland.cpp | 8 ++++++++
2 files changed, 24 insertions(+)
diff --git a/tools/legacy/sample_misc/wayland/include/class_wayland.h b/tools/legacy/sample_misc/wayland/include/class_wayland.h
index 564b9b8b..e5267ec2 100644
--- a/tools/legacy/sample_misc/wayland/include/class_wayland.h
+++ b/tools/legacy/sample_misc/wayland/include/class_wayland.h
@@ -32,6 +32,9 @@ extern "C" {
#include "sample_defs.h"
#include "vpl/mfxstructures.h"
#include "wayland-drm-client-protocol.h"
+#if defined(WAYLAND_LINUX_DMABUF_SUPPORT)
+ #include "linux-dmabuf-unstable-v1.h"
+#endif
typedef struct buffer wld_buffer;
@@ -93,6 +96,11 @@ public:
struct wl_drm* GetDrm() {
return m_drm;
}
+#if defined(WAYLAND_LINUX_DMABUF_SUPPORT)
+ struct zwp_linux_dmabuf_v1* GetDMABuf() {
+ return m_dmabuf;
+ }
+#endif
struct wl_shm* GetShm() {
return m_shm;
};
@@ -120,6 +128,11 @@ public:
void SetDrm(struct wl_drm* drm) {
m_drm = drm;
}
+#if defined(WAYLAND_LINUX_DMABUF_SUPPORT)
+ void SetDMABuf(struct zwp_linux_dmabuf_v1* dmabuf) {
+ m_dmabuf = dmabuf;
+ }
+#endif
void DrmHandleDevice(const char* device);
void DrmHandleAuthenticated();
void RegistryGlobal(struct wl_registry* registry,
@@ -147,6 +160,9 @@ private:
struct wl_compositor* m_compositor;
struct wl_shell* m_shell;
struct wl_drm* m_drm;
+#if defined(WAYLAND_LINUX_DMABUF_SUPPORT)
+ struct zwp_linux_dmabuf_v1* m_dmabuf;
+#endif
struct wl_shm* m_shm;
struct wl_shm_pool* m_pool;
struct wl_surface* m_surface;
diff --git a/tools/legacy/sample_misc/wayland/src/class_wayland.cpp b/tools/legacy/sample_misc/wayland/src/class_wayland.cpp
index 65147973..dc2fc718 100644
--- a/tools/legacy/sample_misc/wayland/src/class_wayland.cpp
+++ b/tools/legacy/sample_misc/wayland/src/class_wayland.cpp
@@ -50,6 +50,9 @@ Wayland::Wayland()
m_compositor(NULL),
m_shell(NULL),
m_drm(NULL),
+#if defined(WAYLAND_LINUX_DMABUF_SUPPORT)
+ m_dmabuf(NULL),
+#endif
m_shm(NULL),
m_pool(NULL),
m_surface(NULL),
@@ -360,6 +363,11 @@ void Wayland::RegistryGlobal(struct wl_registry* registry,
m_drm = static_cast<wl_drm*>(wl_registry_bind(registry, name, &wl_drm_interface, 2));
wl_drm_add_listener(m_drm, &drm_listener, this);
}
+#if defined(WAYLAND_LINUX_DMABUF_SUPPORT)
+ else if(0 == strcmp(interface, "zwp_linux_dmabuf_v1"))
+ m_dmabuf = static_cast<zwp_linux_dmabuf_v1*>(
+ wl_registry_bind(registry, name, &zwp_linux_dmabuf_v1_interface, version));
+#endif
}
void Wayland::DrmHandleDevice(const char* name) {
--
2.31.1

View File

@ -0,0 +1,94 @@
From 0091d3fea76e64ffbd537b2ae47b8912c89c09d7 Mon Sep 17 00:00:00 2001
From: "Ung, Teng En" <teng.en.ung@intel.com>
Date: Fri, 8 Oct 2021 14:38:45 +0000
Subject: [PATCH 3/3] sample_misc: use wayland dmabuf to render nv12
Upstream-Status: Submitted
innersource PR #269
---
.../sample_misc/wayland/src/class_wayland.cpp | 60 +++++++++++++++----
1 file changed, 47 insertions(+), 13 deletions(-)
diff --git a/tools/legacy/sample_misc/wayland/src/class_wayland.cpp b/tools/legacy/sample_misc/wayland/src/class_wayland.cpp
index dc2fc718..d2e7e4e2 100644
--- a/tools/legacy/sample_misc/wayland/src/class_wayland.cpp
+++ b/tools/legacy/sample_misc/wayland/src/class_wayland.cpp
@@ -26,6 +26,7 @@ or https://software.intel.com/en-us/media-client-solutions-support.
#include <iostream>
extern "C" {
#include <drm.h>
+#include <drm_fourcc.h>
#include <intel_bufmgr.h>
#include <xf86drm.h>
}
@@ -305,20 +306,53 @@ struct wl_buffer* Wayland::CreatePrimeBuffer(uint32_t name,
int32_t offsets[3],
int32_t pitches[3]) {
struct wl_buffer* buffer = NULL;
- if (NULL == m_drm)
- return NULL;
- buffer = wl_drm_create_prime_buffer(m_drm,
- name,
- width,
- height,
- format,
- offsets[0],
- pitches[0],
- offsets[1],
- pitches[1],
- offsets[2],
- pitches[2]);
+#if defined(WAYLAND_LINUX_DMABUF_SUPPORT)
+ if (format == WL_DRM_FORMAT_NV12) {
+ if(NULL == m_dmabuf)
+ return NULL;
+
+ struct zwp_linux_buffer_params_v1 *dmabuf_params = NULL;
+ int i = 0;
+ uint64_t modifier = I915_FORMAT_MOD_Y_TILED;
+
+ dmabuf_params = zwp_linux_dmabuf_v1_create_params(m_dmabuf);
+ for(i = 0; i < 2; i++) {
+ zwp_linux_buffer_params_v1_add(dmabuf_params,
+ name,
+ i,
+ offsets[i],
+ pitches[i],
+ modifier >> 32,
+ modifier & 0xffffffff);
+ }
+
+ buffer = zwp_linux_buffer_params_v1_create_immed(dmabuf_params,
+ width,
+ height,
+ format,
+ 0);
+
+ zwp_linux_buffer_params_v1_destroy(dmabuf_params);
+ } else
+#endif
+ {
+ if(NULL == m_drm)
+ return NULL;
+
+ buffer = wl_drm_create_prime_buffer(m_drm,
+ name,
+ width,
+ height,
+ format,
+ offsets[0],
+ pitches[0],
+ offsets[1],
+ pitches[1],
+ offsets[2],
+ pitches[2]);
+ }
+
return buffer;
}
--
2.31.1

View File

@ -0,0 +1,98 @@
From 6ef9dd02e297ae20da422f2f3f4f298061efd6e9 Mon Sep 17 00:00:00 2001
From: "Ung, Teng En" <teng.en.ung@intel.com>
Date: Fri, 15 Oct 2021 11:55:13 +0000
Subject: [PATCH 1/3] samples: Addin wayland-scanner auto generate on cmake.
Upstream-Status: Submitted
innersource PR #269
---
tools/legacy/sample_common/CMakeLists.txt | 21 ++++++++++
.../legacy/sample_misc/wayland/CMakeLists.txt | 39 +++++++++++++++++++
2 files changed, 60 insertions(+)
diff --git a/tools/legacy/sample_common/CMakeLists.txt b/tools/legacy/sample_common/CMakeLists.txt
index 0ff83aa4..0ed8b390 100644
--- a/tools/legacy/sample_common/CMakeLists.txt
+++ b/tools/legacy/sample_common/CMakeLists.txt
@@ -92,6 +92,27 @@ if(UNIX)
target_include_directories(
${TARGET}
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../sample_misc/wayland/include)
+
+ pkg_check_modules(PKG_WAYLAND_SCANNER "wayland-scanner>=1.15")
+ pkg_check_modules(PKG_WAYLAND_PROTCOLS "wayland-protocols>=1.15")
+
+ if(PKG_WAYLAND_SCANNER_FOUND AND PKG_WAYLAND_PROTCOLS_FOUND)
+ pkg_get_variable(WAYLAND_PROTOCOLS_PATH wayland-protocols pkgdatadir)
+ if(WAYLAND_PROTOCOLS_PATH)
+ find_file(
+ WAYLAND_LINUX_DMABUF_XML_PATH linux-dmabuf-unstable-v1.xml
+ PATHS ${WAYLAND_PROTOCOLS_PATH}/unstable/linux-dmabuf
+ NO_DEFAULT_PATH)
+ endif()
+ endif()
+
+ if(WAYLAND_LINUX_DMABUF_XML_PATH)
+ target_compile_definitions(
+ ${TARGET} PUBLIC -DWAYLAND_LINUX_DMABUF_SUPPORT)
+ target_include_directories(
+ ${TARGET}
+ PUBLIC ${CMAKE_BINARY_DIR}/tools/legacy/sample_misc/wayland)
+ endif()
else()
message(
WARNING
diff --git a/tools/legacy/sample_misc/wayland/CMakeLists.txt b/tools/legacy/sample_misc/wayland/CMakeLists.txt
index 1fe98da4..01e6029b 100644
--- a/tools/legacy/sample_misc/wayland/CMakeLists.txt
+++ b/tools/legacy/sample_misc/wayland/CMakeLists.txt
@@ -29,6 +29,45 @@ target_sources(
${CMAKE_CURRENT_SOURCE_DIR}/src/listener_wayland.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/wayland-drm-protocol.c)
+if(PKG_WAYLAND_SCANNER_FOUND AND PKG_WAYLAND_PROTCOLS_FOUND AND WAYLAND_LINUX_DMABUF_XML_PATH)
+ pkg_get_variable(WAYLAND_SCANNER_BIN_PATH wayland-scanner bindir)
+ pkg_get_variable(WAYLAND_SCANNER_BIN wayland-scanner wayland_scanner)
+
+ if(WAYLAND_SCANNER_BIN_PATH AND WAYLAND_SCANNER_BIN)
+ execute_process(
+ COMMAND "${WAYLAND_SCANNER_BIN_PATH}\/${WAYLAND_SCANNER_BIN}"
+ "client-header" "${WAYLAND_LINUX_DMABUF_XML_PATH}"
+ "tools/legacy/sample_misc/wayland/linux-dmabuf-unstable-v1.h"
+ WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
+ RESULT_VARIABLE WAYLAND_SCANNER_RESULT)
+ if (WAYLAND_SCANNER_RESULT)
+ message(ERROR "Failed to generate linux-dmabuf-unstable-v1.h")
+ return()
+ endif()
+
+ execute_process(
+ COMMAND "${WAYLAND_SCANNER_BIN_PATH}\/${WAYLAND_SCANNER_BIN}"
+ "private-code" "${WAYLAND_LINUX_DMABUF_XML_PATH}"
+ "tools/legacy/sample_misc/wayland/linux-dmabuf-unstable-v1.c"
+ WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
+ RESULT_VARIABLE WAYLAND_SCANNER_RESULT)
+ if (WAYLAND_SCANNER_RESULT)
+ message(ERROR "Failed to generate linux-dmabuf-unstable-v1.c")
+ return()
+ endif()
+
+ include_directories(
+ ${CMAKE_BINARY_DIR}/tools/legacy/sample_misc/wayland)
+ add_definitions(-DWAYLAND_LINUX_DMABUF_SUPPORT)
+ target_sources(
+ ${TARGET}
+ PRIVATE ${CMAKE_BINARY_DIR}/tools/legacy/sample_misc/wayland/linux-dmabuf-unstable-v1.c)
+ else()
+ message(ERROR "Don't know how to execute wayland-scanner.")
+ return()
+ endif()
+endif()
+
target_link_libraries(${TARGET} sample_common wayland-client va drm drm_intel)
install(TARGETS ${TARGET} LIBRARY DESTINATION ${_TOOLS_LIB_PATH})
--
2.31.1

View File

@ -0,0 +1,108 @@
From c69500c88058358bdc6c0a036d90b000d63f2a41 Mon Sep 17 00:00:00 2001
From: "Ung, Teng En" <teng.en.ung@intel.com>
Date: Wed, 3 Nov 2021 14:23:15 +0000
Subject: [PATCH 4/4] samples: use find_program to detect wayland-scanner in
cmake
Upstream-Status: Submitted
innersource PR #269
---
tools/legacy/sample_common/CMakeLists.txt | 4 +-
tools/legacy/sample_misc/wayland/CMakeLists.txt | 59 +++++++++++--------------
2 files changed, 28 insertions(+), 35 deletions(-)
diff --git a/tools/legacy/sample_common/CMakeLists.txt b/tools/legacy/sample_common/CMakeLists.txt
index 0ed8b39..658d44d 100644
--- a/tools/legacy/sample_common/CMakeLists.txt
+++ b/tools/legacy/sample_common/CMakeLists.txt
@@ -93,10 +93,10 @@ if(UNIX)
${TARGET}
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../sample_misc/wayland/include)
- pkg_check_modules(PKG_WAYLAND_SCANNER "wayland-scanner>=1.15")
+ find_program(WAYLAND_SCANNER_BIN "wayland-scanner")
pkg_check_modules(PKG_WAYLAND_PROTCOLS "wayland-protocols>=1.15")
- if(PKG_WAYLAND_SCANNER_FOUND AND PKG_WAYLAND_PROTCOLS_FOUND)
+ if(WAYLAND_SCANNER_BIN AND PKG_WAYLAND_PROTCOLS_FOUND)
pkg_get_variable(WAYLAND_PROTOCOLS_PATH wayland-protocols pkgdatadir)
if(WAYLAND_PROTOCOLS_PATH)
find_file(
diff --git a/tools/legacy/sample_misc/wayland/CMakeLists.txt b/tools/legacy/sample_misc/wayland/CMakeLists.txt
index 01e6029..7625bc5 100644
--- a/tools/legacy/sample_misc/wayland/CMakeLists.txt
+++ b/tools/legacy/sample_misc/wayland/CMakeLists.txt
@@ -29,43 +29,36 @@ target_sources(
${CMAKE_CURRENT_SOURCE_DIR}/src/listener_wayland.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/wayland-drm-protocol.c)
-if(PKG_WAYLAND_SCANNER_FOUND AND PKG_WAYLAND_PROTCOLS_FOUND AND WAYLAND_LINUX_DMABUF_XML_PATH)
- pkg_get_variable(WAYLAND_SCANNER_BIN_PATH wayland-scanner bindir)
- pkg_get_variable(WAYLAND_SCANNER_BIN wayland-scanner wayland_scanner)
+ if(WAYLAND_SCANNER_BIN AND PKG_WAYLAND_PROTCOLS_FOUND AND WAYLAND_LINUX_DMABUF_XML_PATH)
- if(WAYLAND_SCANNER_BIN_PATH AND WAYLAND_SCANNER_BIN)
- execute_process(
- COMMAND "${WAYLAND_SCANNER_BIN_PATH}\/${WAYLAND_SCANNER_BIN}"
- "client-header" "${WAYLAND_LINUX_DMABUF_XML_PATH}"
- "tools/legacy/sample_misc/wayland/linux-dmabuf-unstable-v1.h"
- WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
- RESULT_VARIABLE WAYLAND_SCANNER_RESULT)
- if (WAYLAND_SCANNER_RESULT)
- message(ERROR "Failed to generate linux-dmabuf-unstable-v1.h")
- return()
- endif()
-
- execute_process(
- COMMAND "${WAYLAND_SCANNER_BIN_PATH}\/${WAYLAND_SCANNER_BIN}"
- "private-code" "${WAYLAND_LINUX_DMABUF_XML_PATH}"
- "tools/legacy/sample_misc/wayland/linux-dmabuf-unstable-v1.c"
- WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
- RESULT_VARIABLE WAYLAND_SCANNER_RESULT)
- if (WAYLAND_SCANNER_RESULT)
- message(ERROR "Failed to generate linux-dmabuf-unstable-v1.c")
- return()
- endif()
+ execute_process(
+ COMMAND "${WAYLAND_SCANNER_BIN}"
+ "client-header" "${WAYLAND_LINUX_DMABUF_XML_PATH}"
+ "tools/legacy/sample_misc/wayland/linux-dmabuf-unstable-v1.h"
+ WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
+ RESULT_VARIABLE WAYLAND_SCANNER_RESULT)
+ if (WAYLAND_SCANNER_RESULT)
+ message(ERROR "Failed to generate linux-dmabuf-unstable-v1.h")
+ return()
+ endif()
- include_directories(
- ${CMAKE_BINARY_DIR}/tools/legacy/sample_misc/wayland)
- add_definitions(-DWAYLAND_LINUX_DMABUF_SUPPORT)
- target_sources(
- ${TARGET}
- PRIVATE ${CMAKE_BINARY_DIR}/tools/legacy/sample_misc/wayland/linux-dmabuf-unstable-v1.c)
- else()
- message(ERROR "Don't know how to execute wayland-scanner.")
+ execute_process(
+ COMMAND "${WAYLAND_SCANNER_BIN}"
+ "private-code" "${WAYLAND_LINUX_DMABUF_XML_PATH}"
+ "tools/legacy/sample_misc/wayland/linux-dmabuf-unstable-v1.c"
+ WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
+ RESULT_VARIABLE WAYLAND_SCANNER_RESULT)
+ if (WAYLAND_SCANNER_RESULT)
+ message(ERROR "Failed to generate linux-dmabuf-unstable-v1.c")
return()
endif()
+
+ include_directories(
+ ${CMAKE_BINARY_DIR}/tools/legacy/sample_misc/wayland)
+ add_definitions(-DWAYLAND_LINUX_DMABUF_SUPPORT)
+ target_sources(
+ ${TARGET}
+ PRIVATE ${CMAKE_BINARY_DIR}/tools/legacy/sample_misc/wayland/linux-dmabuf-unstable-v1.c)
endif()
target_link_libraries(${TARGET} sample_common wayland-client va drm drm_intel)
--
2.7.4

View File

@ -11,6 +11,10 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c18ea6bb4786a26bf4eee88a7424a408 \
SRC_URI = "git://github.com/oneapi-src/oneVPL.git;protocol=https;branch=master \
file://0001-Fix-basename-build-issue-with-musl_libc.patch \
file://0001-Extends-errorTypes-to-support-JPEG-errors.patch \
file://0001-samples-Addin-wayland-scanner-auto-generate-on-cmake.patch \
file://0001-sample_misc-Addin-basic-wayland-dmabuf-support.patch \
file://0001-sample_misc-use-wayland-dmabuf-to-render-nv12.patch \
file://0001-samples-use-find_program-to-detect-wayland-scanner-i.patch \
"
SRCREV = "cdf7444dc971544d148c51e0d93a2df1bb55dda7"
S = "${WORKDIR}/git"
@ -18,6 +22,9 @@ S = "${WORKDIR}/git"
inherit cmake
DEPENDS += "libva pkgconfig-native"
PACKAGECONFIG ??= "tools"
PACKAGECONFIG[tools] = "-DBUILD_TOOLS=ON, -DBUILD_TOOLS=OFF, wayland wayland-native wayland-protocols"
do_install:append() {
mkdir -p ${D}${datadir}/oneVPL/samples
mv ${D}${bindir}/sample_* ${D}${datadir}/oneVPL/samples