[meta-freescale] [meta-fsl-arm][PATCH 4/6] weston: Use common API to support G2d compositor

Tom Hochstein tom.hochstein at nxp.com
Fri Oct 7 15:36:57 PDT 2016


Replace gcoOS_WaylandCreateVivGlobal with eglBindWaylandDisplayWL.
Fix a width set error in g2d_renderer_attach_shm.
Use noncached buffer in weston shm buffer.

Signed-off-by: Tom Hochstein <tom.hochstein at nxp.com>
---
 ...-Use-common-API-to-support-G2d-compositor.patch | 196 +++++++++++++++++++++
 recipes-graphics/wayland/weston_%.bbappend         |   1 +
 2 files changed, 197 insertions(+)
 create mode 100644 recipes-graphics/wayland/weston/0013-MGS-1945-Use-common-API-to-support-G2d-compositor.patch

diff --git a/recipes-graphics/wayland/weston/0013-MGS-1945-Use-common-API-to-support-G2d-compositor.patch b/recipes-graphics/wayland/weston/0013-MGS-1945-Use-common-API-to-support-G2d-compositor.patch
new file mode 100644
index 0000000..4616173
--- /dev/null
+++ b/recipes-graphics/wayland/weston/0013-MGS-1945-Use-common-API-to-support-G2d-compositor.patch
@@ -0,0 +1,196 @@
+From bdf9a0349f84997397a1c9352ee041e6fa4256a9 Mon Sep 17 00:00:00 2001
+From: "yong.gan" <yong.gan at nxp.com>
+Date: Thu, 23 Jun 2016 09:15:51 +0800
+Subject: [PATCH] MGS-1945: Use common API to support G2d compositor.
+
+Replace gcoOS_WaylandCreateVivGlobal with eglBindWaylandDisplayWL.
+Fix a width set error in g2d_renderer_attach_shm.
+Use noncached buffer in weston shm buffer.
+
+Upstream-Status: Inappropriate [i.MX specific]
+Date: Jun 21, 2016
+Signed-off-by: Yong Gan <yong.gan at nxp.com>
+---
+ Makefile.am        |  4 ++++
+ src/g2d-renderer.c | 44 +++++++++++++++++++++++++++-----------------
+ src/g2d-renderer.h |  1 +
+ 3 files changed, 32 insertions(+), 17 deletions(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index f62bfc7..207864f 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -214,6 +214,7 @@ gl_renderer_la_SOURCES =			\
+ 	src/vertex-clipping.h			\
+ 	shared/helpers.h
+ endif
++
+ module_LTLIBRARIES += g2d-renderer.la
+ g2d_renderer_la_LDFLAGS = -module -avoid-version
+ g2d_renderer_la_LIBADD = $(COMPOSITOR_LIBS) $(EGL_LIBS) -lg2d
+@@ -226,6 +227,9 @@ g2d_renderer_la_SOURCES =			\
+ 	src/g2d-renderer.c			\
+ 	src/vertex-clipping.c			\
+ 	src/vertex-clipping.h
++if ENABLE_EGL
++g2d_renderer_la_CFLAGS += -DENABLE_EGL
++endif
+ 
+ if ENABLE_X11_COMPOSITOR
+ module_LTLIBRARIES += x11-backend.la
+diff --git a/src/g2d-renderer.c b/src/g2d-renderer.c
+index 4440fb9..0c26e91 100644
+--- a/src/g2d-renderer.c
++++ b/src/g2d-renderer.c
+@@ -46,7 +46,7 @@
+ #include "shared/helpers.h"
+ 
+ #define BUFFER_DAMAGE_COUNT 2
+-extern struct wl_global* gcoOS_WaylandCreateVivGlobal(struct wl_display* display);
++#define ALIGN_WIDTH(a) (((a) + 15) & ~15)
+ 
+ typedef struct _g2dRECT
+ {
+@@ -103,7 +103,11 @@ struct g2d_surface_state {
+ struct g2d_renderer {
+ 	struct weston_renderer base;
+ 	struct wl_signal destroy_signal;
+-	struct wl_global *viv_global;
++#ifdef ENABLE_EGL
++	NativeDisplayType display;
++	EGLDisplay egl_display;
++	struct wl_display *wl_display;
++#endif
+ 	void *handle;
+ };
+ 
+@@ -296,9 +300,10 @@ g2d_getG2dFormat(IN gceSURF_FORMAT Format, enum g2d_format* g2dFormat)
+ 	}
+ }
+ 
+-static void printG2dSurfaceInfo(struct g2d_surfaceEx* g2dSurface)
++static void printG2dSurfaceInfo(struct g2d_surfaceEx* g2dSurface, const char* msg)
+ {
+-	weston_log("physicAddr = %d left = %d right = %d top=%d bottom=%d stride= %d tiling = %d, format=%d \n",
++	weston_log("%s physicAddr = %x left = %d right = %d top=%d bottom=%d stride= %d tiling = %d, format=%d \n",
++				msg,
+ 				g2dSurface->base.planes[0],
+ 				g2dSurface->base.left,
+ 				g2dSurface->base.right,
+@@ -357,8 +362,8 @@ g2d_blitSurface(void *handle, struct g2d_surfaceEx * srcG2dSurface, struct g2d_s
+ 
+ 	if(g2d_blitEx(handle, srcG2dSurface, dstG2dSurface))
+ 	{
+-		printG2dSurfaceInfo(srcG2dSurface);
+-		printG2dSurfaceInfo(dstG2dSurface);
++		printG2dSurfaceInfo(srcG2dSurface, "SRC:");
++		printG2dSurfaceInfo(dstG2dSurface, "DST:");
+ 		return -1;
+ 	}
+ 	return 0;
+@@ -724,7 +729,7 @@ g2d_renderer_flush_damage(struct weston_surface *surface)
+ 		wl_shm_buffer_begin_access(buffer->shm_buffer);
+ 		if(gs->shm_buf)
+ 		{
+-			int alignedWidth = (buffer->width + 15) & ~15;
++			int alignedWidth = ALIGN_WIDTH(buffer->width);
+ 			if(alignedWidth == buffer->width)
+ 			{
+ 				int size = wl_shm_buffer_get_stride(buffer->shm_buffer)*buffer->height;
+@@ -743,7 +748,6 @@ g2d_renderer_flush_damage(struct weston_surface *surface)
+ 					}
+ 				}
+ 			}
+-			g2d_cache_op(gs->shm_buf, G2D_CACHE_CLEAN);
+ 		}
+ 		else
+ 		{
+@@ -768,7 +772,6 @@ g2d_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
+ 			struct wl_shm_buffer *shm_buffer)
+ {
+ 	struct g2d_surface_state *gs = get_surface_state(es);
+-	int stride = 0;
+ 	int buffer_length = 0;
+ 	int alloc_new_buff = 1;
+ 	int alignedWidth = 0;
+@@ -776,9 +779,7 @@ g2d_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
+ 	buffer->shm_buffer = shm_buffer;
+ 	buffer->width = wl_shm_buffer_get_width(shm_buffer);
+ 	buffer->height = wl_shm_buffer_get_height(shm_buffer);
+-	alignedWidth = (buffer->width + 15) & ~15;
+-	stride = wl_shm_buffer_get_stride(shm_buffer);
+-	buffer_length = stride * buffer->height;
++	alignedWidth = ALIGN_WIDTH(buffer->width);
+ 
+ 	switch (wl_shm_buffer_get_format(shm_buffer)) {
+ 	case WL_SHM_FORMAT_XRGB8888:
+@@ -812,7 +813,7 @@ g2d_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
+ 	{
+ 		if(gs->shm_buf)
+ 			g2d_free(gs->shm_buf);
+-		gs->shm_buf = g2d_alloc(buffer_length, 1);
++		gs->shm_buf = g2d_alloc(buffer_length, 0);
+ 		gs->g2d_surface.base.planes[0] = gs->shm_buf->buf_paddr;
+ 	}
+ 	gs->g2d_surface.base.left = 0;
+@@ -820,7 +821,7 @@ g2d_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
+ 	gs->g2d_surface.base.right  = buffer->width;
+ 	gs->g2d_surface.base.bottom = buffer->height;
+ 	gs->g2d_surface.base.stride = alignedWidth;
+-	gs->g2d_surface.base.width  = buffer->width;
++	gs->g2d_surface.base.width  = alignedWidth;
+ 	gs->g2d_surface.base.height = buffer->height;
+ 	gs->g2d_surface.base.rot    = G2D_ROTATION_0;
+ 	gs->g2d_surface.base.clrcolor = 0xFF400000;
+@@ -953,7 +954,7 @@ static void
+ g2d_renderer_output_destroy(struct weston_output *output)
+ {
+ 	struct g2d_output_state *go = get_output_state(output);
+-	gctUINT32 i;
++	int i;
+ 
+ 	for (i = 0; i < 2; i++)
+ 	{
+@@ -1005,8 +1006,12 @@ g2d_renderer_destroy(struct weston_compositor *ec)
+ 	struct g2d_renderer *gr = get_renderer(ec);
+ 
+ 	wl_signal_emit(&gr->destroy_signal, gr);
+-	wl_global_destroy(gr->viv_global);
+ 	g2d_close(gr->handle);
++#ifdef ENABLE_EGL
++	eglUnbindWaylandDisplayWL(gr->egl_display);
++	eglTerminate(gr->egl_display);
++	fbDestroyDisplay(gr->display);
++#endif
+ 	free(ec->renderer);
+ 	ec->renderer = NULL;
+ }
+@@ -1247,7 +1252,12 @@ g2d_renderer_output_create(struct weston_output *output, struct wl_display *wl_d
+ 		return -1;
+ 	go->clone_display_num  = clone_display_num;
+ 	output->renderer_state = go;
+-	gr->viv_global = gcoOS_WaylandCreateVivGlobal(wl_display);
++#ifdef ENABLE_EGL
++	gr->wl_display = wl_display;
++	gr->display = fbGetDisplay(wl_display);
++	gr->egl_display = eglGetDisplay(gr->display);
++	eglBindWaylandDisplayWL(gr->egl_display, wl_display);
++#endif
+ 	getBufferNumber(go);
+ 
+ 	if(g2d_renderer_surface_create(go, gr, displays[0]) < 0)
+diff --git a/src/g2d-renderer.h b/src/g2d-renderer.h
+index 45c72de..fc4ca49 100644
+--- a/src/g2d-renderer.h
++++ b/src/g2d-renderer.h
+@@ -30,6 +30,7 @@
+ 
+ #ifdef ENABLE_EGL
+ #include <EGL/egl.h>
++#include <EGL/eglext.h>
+ #endif
+ 
+ struct g2d_renderer_interface {
+-- 
+1.9.1
+
diff --git a/recipes-graphics/wayland/weston_%.bbappend b/recipes-graphics/wayland/weston_%.bbappend
index d0ccb01..0468149 100644
--- a/recipes-graphics/wayland/weston_%.bbappend
+++ b/recipes-graphics/wayland/weston_%.bbappend
@@ -11,6 +11,7 @@ SRC_URI_append_imxgpu2d = " \
     file://0010-MGS-1284-1-xwld-Re-implement-weston-2d-renderer-with.patch \
     file://0011-MGS-1724-xwld-G2D-compositor-build-failed-in-slevk-b.patch \
     file://0012-MGS-1783-xwld-Add-clone-mode-support-for-multi-displ.patch \
+    file://0013-MGS-1945-Use-common-API-to-support-G2d-compositor.patch    \
 "
 
 PACKAGECONFIG_IMX_TO_APPEND = ""
-- 
1.9.1



More information about the meta-freescale mailing list