From fd58fb07cf4fcc0553d0608f5688fc03e41ea15c Mon Sep 17 00:00:00 2001 From: Tom Zanussi Date: Sat, 6 Apr 2013 16:47:32 -0500 Subject: mesa-demos: fix build errors 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 --- ...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 00000000..43d4fb1d --- /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@linux.intel.com> +From: Frank Binns +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 + +Integrated-by: Tom Zanussi + +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 00000000..46a3e98c --- /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 +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 + +Applied and fixed up in Yocto by... + +Integrated-by: Tom Zanussi + +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 00000000..79537081 --- /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 +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 + +Applied and fixed up in Yocto by... + +Integrated-by: Tom Zanussi + +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 00000000..1894cb16 --- /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" -- cgit v1.2.3-54-g00ecf