[meta-intel] [PATCH 2/2] mesa-demos: fix build errors

tom.zanussi at linux.intel.com tom.zanussi at linux.intel.com
Mon Apr 8 08:37:22 PDT 2013


From: Tom Zanussi <tom.zanussi at linux.intel.com>

When commit 6d17c9b ('emgd-driver-bin: add pkgconfig files') was added
for libva, it exposed some missing EMGD functionality, which it turns
out has been fixed by patches submitted or accepted upstream (see the
individual patches for details).

This adds those patches to get around the build problems when building
with EMGD 1.16.

Fixes [YOCTO #3469] for meta-intel (EMGD).

Signed-off-by: Tom Zanussi <tom.zanussi at linux.intel.com>
---
 ...glgears-Make-EGL_KHR_image-usage-portable.patch |  95 ++++++++
 .../egl-mesa-screen-surface-build-fix.patch        | 257 +++++++++++++++++++++
 .../mesa-demos/egl-mesa-screen-surface-query.patch |  35 +++
 .../mesa/mesa-demos_8.0.1.bbappend                 |   5 +
 4 files changed, 392 insertions(+)
 create mode 100644 common/recipes-graphics/mesa/mesa-demos/0001-xeglgears-Make-EGL_KHR_image-usage-portable.patch
 create mode 100644 common/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-build-fix.patch
 create mode 100644 common/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-query.patch
 create mode 100644 common/recipes-graphics/mesa/mesa-demos_8.0.1.bbappend

diff --git a/common/recipes-graphics/mesa/mesa-demos/0001-xeglgears-Make-EGL_KHR_image-usage-portable.patch b/common/recipes-graphics/mesa/mesa-demos/0001-xeglgears-Make-EGL_KHR_image-usage-portable.patch
new file mode 100644
index 0000000..43d4fb1
--- /dev/null
+++ b/common/recipes-graphics/mesa/mesa-demos/0001-xeglgears-Make-EGL_KHR_image-usage-portable.patch
@@ -0,0 +1,95 @@
+From 43c2122af1caa750531f29bf734c03d1f50801d1 Mon Sep 17 00:00:00 2001
+Message-Id: <43c2122af1caa750531f29bf734c03d1f50801d1.1365283761.git.tom.zanussi at linux.intel.com>
+From: Frank Binns <frank.binns at imgtec.com>
+Date: Fri, 29 Jun 2012 14:06:27 +0100
+Subject: [PATCH] xeglgears: Make EGL_KHR_image usage portable
+
+EGL extension functions don't have to be exported which means
+xeglgears was failing to link against implementations that
+support EGL_KHR_image but were not exporting its related functions.
+
+This has been fixed by using eglGetProcAddress to get a function
+pointer instead of using the functions prototype. This is portable.
+
+Signed-off-by: Frank Binns <frank.binns at imgtec.com>
+
+Integrated-by: Tom Zanussi <tom.zanussi at linux.intel.com>
+
+Upstream-Status: Backport
+---
+ src/egl/opengl/xeglgears.c | 37 +++++++++++++++++++++++++++++++------
+ 1 file changed, 31 insertions(+), 6 deletions(-)
+
+diff --git a/src/egl/opengl/xeglgears.c b/src/egl/opengl/xeglgears.c
+index 513c587..866b89a 100644
+--- a/src/egl/opengl/xeglgears.c
++++ b/src/egl/opengl/xeglgears.c
+@@ -51,6 +51,10 @@
+ static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES_func;
+ #endif
+ 
++#ifdef EGL_KHR_image
++static PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR_func;
++#endif
++
+ 
+ #define BENCHMARK
+ 
+@@ -405,6 +409,17 @@ egl_manager_new(EGLNativeDisplayType xdpy, const EGLint *attrib_list,
+       eglGetProcAddress("glEGLImageTargetTexture2DOES");
+ #endif
+ 
++#ifdef EGL_KHR_image
++   eglCreateImageKHR_func = (PFNEGLCREATEIMAGEKHRPROC)
++      eglGetProcAddress("eglCreateImageKHR");
++   if (eglCreateImageKHR_func == NULL) {
++      printf("failed to get eglCreateImageKHR\n");
++      eglTerminate(eman->dpy);
++      free(eman);
++      return NULL;
++   }
++#endif
++
+    return eman;
+ }
+ 
+@@ -850,10 +865,16 @@ main(int argc, char *argv[])
+    case GEARS_PIXMAP:
+    case GEARS_PIXMAP_TEXTURE:
+       ret = egl_manager_create_pixmap(eman, eman->xwin, EGL_TRUE, NULL);
++
++#ifdef EGL_KHR_image
+       if (surface_type == GEARS_PIXMAP_TEXTURE)
+-	 eman->image = eglCreateImageKHR (eman->dpy, eman->ctx,
+-					  EGL_NATIVE_PIXMAP_KHR,
+-					  (EGLClientBuffer) eman->xpix, NULL);
++	 eman->image = eglCreateImageKHR_func(eman->dpy, eman->ctx,
++					      EGL_NATIVE_PIXMAP_KHR,
++					      (EGLClientBuffer) eman->xpix, NULL);
++#else
++      fprintf(stderr, "EGL_KHR_image not found at compile time.\n");
++#endif
++
+       if (ret)
+          ret = eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx);
+       break;
+@@ -892,9 +913,13 @@ main(int argc, char *argv[])
+ 				   GL_RENDERBUFFER_EXT,
+ 				   color_rb);
+ 
+-      eman->image = eglCreateImageKHR(eman->dpy, eman->ctx,
+-				      EGL_GL_RENDERBUFFER_KHR,
+-				      (EGLClientBuffer) color_rb, NULL);
++#ifdef EGL_KHR_image
++      eman->image = eglCreateImageKHR_func(eman->dpy, eman->ctx,
++					   EGL_GL_RENDERBUFFER_KHR,
++					   (EGLClientBuffer) color_rb, NULL);
++#else
++      fprintf(stderr, "EGL_KHR_image not found at compile time.\n");
++#endif
+ 
+       glGenRenderbuffers(1, &depth_rb);
+       glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_rb);
+-- 
+1.7.11.4
+
diff --git a/common/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-build-fix.patch b/common/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-build-fix.patch
new file mode 100644
index 0000000..46a3e98
--- /dev/null
+++ b/common/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-build-fix.patch
@@ -0,0 +1,257 @@
+From ab76f645e29b0a603ff95d88f976bc35ab6301ee Mon Sep 17 00:00:00 2001
+From: Frank Binns <frank.binns at imgtec.com>
+Date: Fri, 29 Jun 2012 11:26:04 +0100
+Subject: [PATCH 1/2] mesa-demos: Fix build when EGL_MESA_screen_surface
+ extension isn't present
+
+The EGL demos won't build against EGL implementations that don't support 
+the EGL_MESA_screen_surface extension. Fix this, in most cases, by 
+wrapping relevant bits of code in #ifdef EGL_MESA_screen_surface.
+
+Signed-off-by: Frank Binns <frank.binns at imgtec.com>
+
+Applied and fixed up in Yocto by...
+
+Integrated-by: Tom Zanussi <tom.zanussi at linux.intel.com>
+
+Upstream-Status: Pending
+
+Index: mesa-demos-8.0.1/src/egl/eglut/eglut.c
+===================================================================
+--- mesa-demos-8.0.1.orig/src/egl/eglut/eglut.c
++++ mesa-demos-8.0.1/src/egl/eglut/eglut.c
+@@ -51,8 +51,9 @@ _eglutNow(void)
+ static void
+ _eglutDestroyWindow(struct eglut_window *win)
+ {
+-   if (_eglut->surface_type != EGL_PBUFFER_BIT &&
+-       _eglut->surface_type != EGL_SCREEN_BIT_MESA)
++
++   if (_eglut->surface_type == EGL_WINDOW_BIT ||
++       _eglut->surface_type == EGL_PIXMAP_BIT)
+       eglDestroySurface(_eglut->dpy, win->surface);
+ 
+    _eglutNativeFiniWindow(win);
+@@ -150,7 +151,9 @@ _eglutCreateWindow(const char *title, in
+             win->config, win->native.u.pixmap, NULL);
+       break;
+    case EGL_PBUFFER_BIT:
++#ifdef EGL_MESA_screen_surface
+    case EGL_SCREEN_BIT_MESA:
++#endif
+       win->surface = win->native.u.surface;
+       break;
+    default:
+@@ -264,8 +267,10 @@ eglutDestroyWindow(int win)
+    if (window->index != win)
+       return;
+ 
++#ifdef EGL_MESA_screen_surface
+    /* XXX it causes some bug in st/egl KMS backend */
+    if ( _eglut->surface_type != EGL_SCREEN_BIT_MESA)
++#endif
+       eglMakeCurrent(_eglut->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ 
+    _eglutDestroyWindow(_eglut->current);
+Index: mesa-demos-8.0.1/src/egl/eglut/eglut_screen.c
+===================================================================
+--- mesa-demos-8.0.1.orig/src/egl/eglut/eglut_screen.c
++++ mesa-demos-8.0.1/src/egl/eglut/eglut_screen.c
+@@ -10,26 +10,33 @@
+ 
+ #define MAX_MODES 100
+ 
++#ifdef EGL_MESA_screen_surface
+ static EGLScreenMESA kms_screen;
+ static EGLModeMESA kms_mode;
+ static EGLint kms_width, kms_height;
++#endif
+ 
+ void
+ _eglutNativeInitDisplay(void)
+ {
++#ifdef EGL_MESA_screen_surface
+    _eglut->native_dpy = EGL_DEFAULT_DISPLAY;
+    _eglut->surface_type = EGL_SCREEN_BIT_MESA;
++#endif
+ }
+ 
+ void
+ _eglutNativeFiniDisplay(void)
+ {
++#ifdef EGL_MESA_screen_surface
+    kms_screen = 0;
+    kms_mode = 0;
+    kms_width = 0;
+    kms_height = 0;
++#endif
+ }
+ 
++#ifdef EGL_MESA_screen_surface
+ static void
+ init_kms(void)
+ {
+@@ -69,19 +76,23 @@ init_kms(void)
+    kms_width = width;
+    kms_height = height;
+ }
++#endif
+ 
+ void
+ _eglutNativeInitWindow(struct eglut_window *win, const char *title,
+                        int x, int y, int w, int h)
+ {
++#ifdef EGL_MESA_screen_surface
+    EGLint surf_attribs[16];
+    EGLint i;
++#endif
+    const char *exts;
+ 
+    exts = eglQueryString(_eglut->dpy, EGL_EXTENSIONS);
+    if (!exts || !strstr(exts, "EGL_MESA_screen_surface"))
+       _eglutFatal("EGL_MESA_screen_surface is not supported\n");
+ 
++#ifdef EGL_MESA_screen_surface
+    init_kms();
+ 
+    i = 0;
+@@ -103,14 +114,17 @@ _eglutNativeInitWindow(struct eglut_wind
+ 
+    win->native.width = kms_width;
+    win->native.height = kms_height;
++#endif
+ }
+ 
+ void
+ _eglutNativeFiniWindow(struct eglut_window *win)
+ {
++#ifdef EGL_MESA_screen_surface
+    eglShowScreenSurfaceMESA(_eglut->dpy,
+          kms_screen, EGL_NO_SURFACE, 0);
+    eglDestroySurface(_eglut->dpy, win->native.u.surface);
++#endif
+ }
+ 
+ void
+Index: mesa-demos-8.0.1/src/egl/opengl/demo1.c
+===================================================================
+--- mesa-demos-8.0.1.orig/src/egl/opengl/demo1.c
++++ mesa-demos-8.0.1/src/egl/opengl/demo1.c
+@@ -18,6 +18,7 @@
+ static void
+ TestScreens(EGLDisplay dpy)
+ {
++#ifdef EGL_MESA_screen_surface
+ #define MAX 8
+    EGLScreenMESA screens[MAX];
+    EGLint numScreens;
+@@ -28,6 +29,7 @@ TestScreens(EGLDisplay dpy)
+    for (i = 0; i < numScreens; i++) {
+       printf(" Screen %d handle: %d\n", i, (int) screens[i]);
+    }
++#endif
+ }
+ 
+ /**
+Index: mesa-demos-8.0.1/src/egl/opengl/demo2.c
+===================================================================
+--- mesa-demos-8.0.1.orig/src/egl/opengl/demo2.c
++++ mesa-demos-8.0.1/src/egl/opengl/demo2.c
+@@ -16,6 +16,7 @@
+ 
+ /*#define FRONTBUFFER*/
+ 
++#ifdef EGL_MESA_screen_surface
+ static void _subset_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2,
+                           GLfloat r, GLfloat g, GLfloat b)
+ {
+@@ -95,12 +96,13 @@ TestScreens(EGLDisplay dpy)
+       printf(" Screen %d handle: %d\n", i, (int) screens[i]);
+    }
+ }
+-
++#endif
+ 
+ int
+ main(int argc, char *argv[])
+ {
+    int maj, min;
++#ifdef EGL_MESA_screen_surface
+    EGLContext ctx;
+    EGLSurface pbuffer, screen_surf;
+    EGLConfig configs[10];
+@@ -115,6 +117,7 @@ main(int argc, char *argv[])
+    EGLModeMESA mode;
+    EGLScreenMESA screen;
+    EGLint count;
++#endif
+ 
+    EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+    assert(d);
+@@ -132,6 +135,7 @@ main(int argc, char *argv[])
+       exit(1);
+    }
+ 
++#ifdef EGL_MESA_screen_surface
+    eglGetConfigs(d, configs, 10, &numConfigs);
+    printf("Got %d EGL configs:\n", numConfigs);
+    for (i = 0; i < numConfigs; i++) {
+@@ -211,6 +215,7 @@ main(int argc, char *argv[])
+    eglDestroySurface(d, pbuffer);
+    eglDestroyContext(d, ctx);
+    eglTerminate(d);
++#endif
+ 
+    return 0;
+ }
+Index: mesa-demos-8.0.1/src/egl/opengl/demo3.c
+===================================================================
+--- mesa-demos-8.0.1.orig/src/egl/opengl/demo3.c
++++ mesa-demos-8.0.1/src/egl/opengl/demo3.c
+@@ -46,7 +46,7 @@ GLubyte OpenGL_bits[] = {
+    0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00, 
+ };
+ 
+-
++#ifdef EGL_MESA_screen_surface
+ static void Init(void)
+ {
+ 
+@@ -551,11 +551,13 @@ write_ppm(const char *filename, const GL
+       fclose(f);
+    }
+ }
++#endif
+ 
+ int
+ main(int argc, char *argv[])
+ {
+    int maj, min;
++#ifdef EGL_MESA_screen_surface
+    EGLContext ctx;
+    EGLSurface screen_surf;
+    EGLConfig configs[10];
+@@ -566,6 +568,7 @@ main(int argc, char *argv[])
+    const GLubyte *bitmap;
+    EGLint screenAttribs[32];
+    EGLint i;
++#endif
+ 
+    EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+    assert(d);
+@@ -583,6 +586,7 @@ main(int argc, char *argv[])
+       exit(1);
+    }
+ 
++#ifdef EGL_MESA_screen_surface
+    eglGetConfigs(d, configs, 10, &numConfigs);
+    eglGetScreensMESA(d, &screen, 1, &count);
+    eglGetModesMESA(d, screen, &mode, 1, &count);
+@@ -642,6 +646,7 @@ main(int argc, char *argv[])
+    eglDestroySurface(d, screen_surf);
+    eglDestroyContext(d, ctx);
+    eglTerminate(d);
++#endif
+ 
+    return 0;
+ }
diff --git a/common/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-query.patch b/common/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-query.patch
new file mode 100644
index 0000000..7953708
--- /dev/null
+++ b/common/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-query.patch
@@ -0,0 +1,35 @@
+From cf90a5c0c173d017a80cde057da57c365b3b1a40 Mon Sep 17 00:00:00 2001
+From: Frank Binns <frank.binns at imgtec.com>
+Date: Fri, 29 Jun 2012 12:00:26 +0100
+Subject: [PATCH 2/2] mesa-demos: Query display for EGL_MESA_screen_surface
+ extension before using it
+
+This code makes heavy use of the EGL_MESA_screen_surface extension so 
+check the display to determine if it's supported by the underlying EGL 
+implementation. If it doesn't then bail.
+
+Signed-off-by: Frank Binns <frank.binns at imgtec.com>
+
+Applied and fixed up in Yocto by...
+
+Integrated-by: Tom Zanussi <tom.zanussi at linux.intel.com>
+
+Upstream-Status: Pending
+
+Index: mesa-demos-8.0.1/src/egl/opengl/demo1.c
+===================================================================
+--- mesa-demos-8.0.1.orig/src/egl/opengl/demo1.c
++++ mesa-demos-8.0.1/src/egl/opengl/demo1.c
+@@ -110,6 +110,12 @@ main(int argc, char *argv[])
+    printf("EGL version = %d.%d\n", maj, min);
+    printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
+ 
++   if (!strstr(eglQueryString(d, EGL_EXTENSIONS),
++               "EGL_MESA_screen_surface")) {
++      printf("EGL_MESA_screen_surface is not supported\n");
++      exit(1);
++   }
++
+    eglGetConfigs(d, NULL, 0, &numConfigs);
+    configs = malloc(sizeof(*configs) *numConfigs);
+    eglGetConfigs(d, configs, numConfigs, &numConfigs);
diff --git a/common/recipes-graphics/mesa/mesa-demos_8.0.1.bbappend b/common/recipes-graphics/mesa/mesa-demos_8.0.1.bbappend
new file mode 100644
index 0000000..1894cb1
--- /dev/null
+++ b/common/recipes-graphics/mesa/mesa-demos_8.0.1.bbappend
@@ -0,0 +1,5 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+SRC_URI += "file://egl-mesa-screen-surface-build-fix.patch \
+            file://egl-mesa-screen-surface-query.patch \
+            file://0001-xeglgears-Make-EGL_KHR_image-usage-portable.patch"
-- 
1.7.11.4




More information about the meta-intel mailing list