summaryrefslogtreecommitdiffstats
path: root/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0118-V4L2VDA-Use-dlopen-to-dynamically-use-g2d-api.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0118-V4L2VDA-Use-dlopen-to-dynamically-use-g2d-api.patch')
-rw-r--r--dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0118-V4L2VDA-Use-dlopen-to-dynamically-use-g2d-api.patch306
1 files changed, 306 insertions, 0 deletions
diff --git a/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0118-V4L2VDA-Use-dlopen-to-dynamically-use-g2d-api.patch b/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0118-V4L2VDA-Use-dlopen-to-dynamically-use-g2d-api.patch
new file mode 100644
index 00000000..7cd0b852
--- /dev/null
+++ b/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0118-V4L2VDA-Use-dlopen-to-dynamically-use-g2d-api.patch
@@ -0,0 +1,306 @@
1From 59bf28174104b591088a08e2ed61644cc93101fd Mon Sep 17 00:00:00 2001
2From: Hou Qi <qi.hou@nxp.com>
3Date: Thu, 22 Sep 2022 11:10:46 +0800
4Subject: [PATCH] V4L2VDA: Use dlopen to dynamically use g2d api
5
6Upstream-Status: Inappropriate [NXP specific]
7---
8 media/gpu/v4l2/BUILD.gn | 1 -
9 media/gpu/v4l2/v4l2_device.cc | 205 ++++++++++++++++++++++++++++++++--
10 2 files changed, 194 insertions(+), 12 deletions(-)
11
12diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn
13index 273f6066de175..ebd0a4ad64646 100644
14--- a/media/gpu/v4l2/BUILD.gn
15+++ b/media/gpu/v4l2/BUILD.gn
16@@ -86,7 +86,6 @@ source_set("v4l2") {
17 "EGL",
18 "GLESv2",
19 ]
20- libs += [ "g2d" ]
21
22 if (use_v4l2_codec_aml) {
23 sources += [
24diff --git a/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc
25index 42cd8386f41cb..af71f54d141aa 100644
26--- a/media/gpu/v4l2/v4l2_device.cc
27+++ b/media/gpu/v4l2/v4l2_device.cc
28@@ -40,10 +40,12 @@
29 #include "media/gpu/v4l2/aml_v4l2_device.h"
30 #endif
31
32-#include "g2d.h"
33-#include "g2dExt.h"
34+// #include "g2d.h"
35+// #include "g2dExt.h"
36+
37 #include <linux/dma-buf.h>
38 #include <time.h>
39+#include <dlfcn.h>
40
41 namespace media {
42
43@@ -142,6 +144,158 @@ void V4L2ProcessingTrace(const struct v4l2_buffer* v4l2_buffer, bool start) {
44
45 } // namespace
46
47+/* g2d.h g2dExt.h */
48+enum g2d_format
49+{
50+//rgb formats
51+ G2D_RGB565 = 0, /* [0:4] Blue; [5:10] Green; [11:15] Red */
52+ G2D_RGBA8888 = 1, /* [0:7] Red; [8:15] Green; [16:23] Blue; [23:31] Alpha */
53+ G2D_RGBX8888 = 2, /* [0:7] Red; [8:15] Green; [16:23] Blue; [23:31] don't care */
54+ G2D_BGRA8888 = 3, /* [0:7] Blue; [8:15] Green; [16:23] Red; [23:31] Alpha */
55+ G2D_BGRX8888 = 4, /* [0:7] Blue; [8:15] Green; [16:23] Red; [23:31] don't care */
56+ G2D_BGR565 = 5, /* [0:4] Red; [5:10] Green; [11:15] Blue */
57+
58+ G2D_ARGB8888 = 6, /* [0:7] Alpha; [8:15] Red; [16:23] Green; [23:31] Blue */
59+ G2D_ABGR8888 = 7, /* [0:7] Alpha; [8:15] Blue; [16:23] Green; [23:31] Red */
60+ G2D_XRGB8888 = 8, /* [0:7] don't care; [8:15] Red; [16:23] Green; [23:31] Blue */
61+ G2D_XBGR8888 = 9, /* [0:7] don't care; [8:15] Blue; [16:23] Green; [23:31] Red */
62+ G2D_RGB888 = 10, /* [0:7] Red; [8:15] Green; [16:23] Blue */
63+ G2D_BGR888 = 11, /* [0:7] Blue; [8:15] Green; [16:23] Red */
64+
65+ G2D_RGBA5551 = 12, /* [0:4] Red; [5:9] Green; [10:14] Blue; [15] Alpha */
66+ G2D_RGBX5551 = 13, /* [0:4] Red; [5:9] Green; [10:14] Blue; [15] don't care */
67+ G2D_BGRA5551 = 14, /* [0:4] Blue; [5:9] Green; [10:14] Red; [15] Alpha */
68+ G2D_BGRX5551 = 15, /* [0:4] Blue; [5:9] Green; [10:14] Red; [15] don't care */
69+
70+//yuv formats
71+ G2D_NV12 = 20, /* 2 plane 420 format; plane 1: [0:7] Y ; plane 2: [0:7] U; [8:15] V */
72+ G2D_I420 = 21, /* 3 plane 420 format; plane 1: [0:7] Y ; plane 2: [0:7] U; plane 3: [0:7] V */
73+ G2D_YV12 = 22, /* 3 plane 420 format; plane 1: [0:7] Y ; plane 2: [0:7] V; plane 3: [0:7] U */
74+ G2D_NV21 = 23, /* 2 plane 420 format; plane 1: [0:7] Y ; plane 2: [0:7] V; [8:15] U */
75+ G2D_YUYV = 24, /* 1 plane 422 format; [0:7] Y; [8:15; U; [16:23] Y; [24:31] V */
76+ G2D_YVYU = 25, /* 1 plane 422 format; [0:7] Y; [8:15; V; [16:23] Y; [24:31] U */
77+ G2D_UYVY = 26, /* 1 plane 422 format; [0:7] U; [8:15; Y; [16:23] V; [24:31] Y */
78+ G2D_VYUY = 27, /* 1 plane 422 format; [0:7] V; [8:15; Y; [16:23] U; [24:31] Y */
79+ G2D_NV16 = 28, /* 2 plane 422 format; plane 1: [0:7] Y ; plane 2: [0:7] U; [8:15] V */
80+ G2D_NV61 = 29, /* 2 plane 422 format; plane 1: [0:7] Y ; plane 2: [0:7] V; [8:15] U */
81+};
82+
83+enum g2d_tiling
84+{
85+ G2D_LINEAR = 0x1,
86+ G2D_TILED = 0x2,
87+ G2D_SUPERTILED = 0x4,
88+ G2D_AMPHION_TILED = 0x8,
89+ G2D_AMPHION_INTERLACED = 0x10,
90+ G2D_TILED_STATUS = 0x20,
91+ G2D_AMPHION_TILED_10BIT = 0x40,
92+};
93+
94+struct g2d_tile_status
95+{
96+ unsigned int ts_addr;
97+
98+ unsigned int fc_enabled;
99+ unsigned int fc_value;
100+ unsigned int fc_value_upper;
101+};
102+
103+struct g2d_buf
104+{
105+ void *buf_handle;
106+ void *buf_vaddr;
107+ int buf_paddr;
108+ int buf_size;
109+};
110+
111+enum g2d_blend_func
112+{
113+//basic blend
114+ G2D_ZERO = 0,
115+ G2D_ONE = 1,
116+ G2D_SRC_ALPHA = 2,
117+ G2D_ONE_MINUS_SRC_ALPHA = 3,
118+ G2D_DST_ALPHA = 4,
119+ G2D_ONE_MINUS_DST_ALPHA = 5,
120+
121+// extensive blend is set with basic blend together,
122+// such as, G2D_ONE | G2D_PRE_MULTIPLIED_ALPHA
123+ G2D_PRE_MULTIPLIED_ALPHA = 0x10,
124+ G2D_DEMULTIPLY_OUT_ALPHA = 0x20,
125+};
126+
127+enum g2d_rotation
128+{
129+ G2D_ROTATION_0 = 0,
130+ G2D_ROTATION_90 = 1,
131+ G2D_ROTATION_180 = 2,
132+ G2D_ROTATION_270 = 3,
133+ G2D_FLIP_H = 4,
134+ G2D_FLIP_V = 5,
135+};
136+
137+struct g2d_surface
138+{
139+ enum g2d_format format;
140+
141+ int planes[3];//surface buffer addresses are set in physical planes separately
142+ //RGB: planes[0] - RGB565/RGBA8888/RGBX8888/BGRA8888/BRGX8888
143+ //NV12: planes[0] - Y, planes[1] - packed UV
144+ //I420: planes[0] - Y, planes[1] - U, planes[2] - V
145+ //YV12: planes[0] - Y, planes[1] - V, planes[2] - U
146+ //NV21: planes[0] - Y, planes[1] - packed VU
147+ //YUYV: planes[0] - packed YUYV
148+ //YVYU: planes[0] - packed YVYU
149+ //UYVY: planes[0] - packed UYVY
150+ //VYUY: planes[0] - packed VYUY
151+ //NV16: planes[0] - Y, planes[1] - packed UV
152+ //NV61: planes[0] - Y, planes[1] - packed VU
153+
154+ //blit rectangle in surface
155+ int left;
156+ int top;
157+ int right;
158+ int bottom;
159+ int stride; ///< buffer stride, in Pixels
160+ int width; ///< surface width, in Pixels
161+ int height; ///< surface height, in Pixels
162+ enum g2d_blend_func blendfunc; ///< alpha blending parameters
163+ int global_alpha; ///< value is 0 ~ 255
164+ //clrcolor format is RGBA8888, used as dst for clear, as src for blend dim
165+ int clrcolor;
166+
167+ //rotation degree
168+ enum g2d_rotation rot;
169+};
170+
171+struct g2d_surfaceEx
172+{
173+ struct g2d_surface base;
174+ enum g2d_tiling tiling;
175+
176+ struct g2d_tile_status ts;
177+ int reserved[8];
178+};
179+
180+void *dl_handle = NULL;
181+
182+typedef int (*g2d_api_open)(void **handle);
183+typedef int (*g2d_api_close)(void *handle);
184+typedef int (*g2d_api_free)(struct g2d_buf *buf);
185+typedef struct g2d_buf* (*g2d_api_alloc)(int size, int cacheable);
186+typedef int (*g2d_api_buf_export_fd)(struct g2d_buf *);
187+typedef int (*g2d_api_blitEx)(void *handle, struct g2d_surfaceEx *srcEx, struct g2d_surfaceEx *dstEx);
188+
189+#define G2D_API_SYM(name) g2d_api_##name g2d_##name = nullptr
190+G2D_API_SYM(open);
191+G2D_API_SYM(close);
192+G2D_API_SYM(free);
193+G2D_API_SYM(alloc);
194+G2D_API_SYM(buf_export_fd);
195+G2D_API_SYM(blitEx);
196+#undef G2D_API_SYM
197+/* g2d.h g2dExt.h */
198+
199 V4L2ExtCtrl::V4L2ExtCtrl(uint32_t id) {
200 memset(&ctrl, 0, sizeof(ctrl));
201 ctrl.id = id;
202@@ -261,7 +415,7 @@ V4L2Buffer::~V4L2Buffer() {
203 }
204 }
205 }
206- if(g2dbuf_p0 && g2dbuf_p1) {
207+ if(g2d_free && g2dbuf_p0 && g2dbuf_p1) {
208 g2d_free(g2dbuf_p0);
209 g2d_free(g2dbuf_p1);
210 }
211@@ -399,14 +553,18 @@ scoped_refptr<VideoFrame> V4L2Buffer::CreateVideoFrame() {
212 else
213 phys_1 = query1.phys;
214
215- g2dbuf_p0 = g2d_alloc(format_.fmt.pix_mp.width * format_.fmt.pix_mp.height, 0);
216- g2dbuf_p1 = g2d_alloc(format_.fmt.pix_mp.width * format_.fmt.pix_mp.height / 2, 0);
217+ if (g2d_alloc) {
218+ g2dbuf_p0 = g2d_alloc(format_.fmt.pix_mp.width * format_.fmt.pix_mp.height, 0);
219+ g2dbuf_p1 = g2d_alloc(format_.fmt.pix_mp.width * format_.fmt.pix_mp.height / 2, 0);
220+ }
221 if((!g2dbuf_p0) || (!g2dbuf_p1)){
222 DLOG(ERROR)<<"g2d buf alloc failed";
223 return nullptr;
224 }
225
226- int tmpfd = g2d_buf_export_fd(g2dbuf_p0);
227+ int tmpfd = -1;
228+ if (g2d_buf_export_fd)
229+ tmpfd = g2d_buf_export_fd(g2dbuf_p0);
230 tmpfd = dup(tmpfd);
231 if(tmpfd > 0)
232 g2dbufs_fds.push_back(base::ScopedFD(tmpfd));
233@@ -416,7 +574,8 @@ scoped_refptr<VideoFrame> V4L2Buffer::CreateVideoFrame() {
234 return nullptr;
235 }
236
237- tmpfd = g2d_buf_export_fd(g2dbuf_p1);
238+ if (g2d_buf_export_fd)
239+ tmpfd = g2d_buf_export_fd(g2dbuf_p1);
240 tmpfd = dup(tmpfd);
241 if(tmpfd>0)
242 g2dbufs_fds.push_back(base::ScopedFD(tmpfd));
243@@ -1152,7 +1311,7 @@ V4L2Queue::V4L2Queue(scoped_refptr<V4L2Device> dev,
244 #endif
245
246 g2d_handle = NULL;
247- if(g2d_open(&g2d_handle))
248+ if(g2d_open && g2d_open(&g2d_handle))
249 VLOGF(1) << "g2d_open fail";
250 }
251
252@@ -1172,7 +1331,7 @@ V4L2Queue::~V4L2Queue() {
253 DeallocateBuffers();
254 }
255
256- if(g2d_handle)
257+ if(g2d_close && g2d_handle)
258 g2d_close(g2d_handle);
259
260 std::move(destroy_cb_).Run();
261@@ -1573,7 +1732,8 @@ std::pair<bool, V4L2ReadableBufferRef> V4L2Queue::DequeueBuffer() {
262 src->global_alpha = 0xff;
263 src->blendfunc = G2D_ONE;
264
265- g2d_blitEx(g2d_handle, &srcEx, &dstEx);
266+ if (g2d_blitEx)
267+ g2d_blitEx(g2d_handle, &srcEx, &dstEx);
268 }
269
270 return std::make_pair(true, V4L2BufferRefFactory::CreateReadableRef(
271@@ -1747,8 +1907,31 @@ scoped_refptr<V4L2Device> V4L2Device::Create() {
272 #endif
273
274 device = new GenericV4L2Device();
275- if (device->Initialize())
276+ if (device->Initialize()) {
277+ dl_handle = dlopen("/usr/lib/libg2d.so",
278+ RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE | RTLD_LAZY);
279+ if (!dl_handle) {
280+ VLOGF(1) << "Has no libg2d.so";
281+ return device;
282+ }
283+
284+#define G2D_API_DLSYM(lib, name) \
285+ do { \
286+ g2d_##name = reinterpret_cast<g2d_api_##name>(dlsym(lib, "g2d_" #name)); \
287+ if (!(g2d_##name)) \
288+ VLOGF(1) << "Failed to dlsym g2d_" #name; \
289+ } while (0)
290+
291+ G2D_API_DLSYM(dl_handle, open);
292+ G2D_API_DLSYM(dl_handle, close);
293+ G2D_API_DLSYM(dl_handle, free);
294+ G2D_API_DLSYM(dl_handle, alloc);
295+ G2D_API_DLSYM(dl_handle, buf_export_fd);
296+ G2D_API_DLSYM(dl_handle, blitEx);
297+
298 return device;
299+ }
300+
301
302 VLOGF(1) << "Failed to create a V4L2Device";
303 return nullptr;
304--
3052.17.1
306