| From 453353a221de9c64479f4372565d2cd8591b36cc Mon Sep 17 00:00:00 2001 |
| From: Frank Binns <frank.binns@imgtec.com> |
| Date: Fri, 29 Jun 2012 11:26:04 +0100 |
| Subject: [PATCH 5/9] 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@imgtec.com> |
| |
| Applied and fixed up in Yocto by... |
| |
| Integrated-by: Tom Zanussi <tom.zanussi@linux.intel.com> |
| |
| Upstream-Status: Pending |
| --- |
| src/egl/eglut/eglut.c | 9 +++++++-- |
| src/egl/eglut/eglut_screen.c | 14 ++++++++++++++ |
| src/egl/opengl/demo1.c | 2 ++ |
| src/egl/opengl/demo2.c | 7 ++++++- |
| src/egl/opengl/demo3.c | 7 ++++++- |
| 5 files changed, 35 insertions(+), 4 deletions(-) |
| |
| diff --git a/src/egl/eglut/eglut.c b/src/egl/eglut/eglut.c |
| index 2ee6f15..f6a2ad4 100644 |
| --- a/src/egl/eglut/eglut.c |
| +++ b/src/egl/eglut/eglut.c |
| @@ -76,8 +76,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); |
| @@ -175,7 +176,9 @@ _eglutCreateWindow(const char *title, int x, int y, int w, int h) |
| 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: |
| @@ -289,8 +292,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); |
| diff --git a/src/egl/eglut/eglut_screen.c b/src/egl/eglut/eglut_screen.c |
| index 021a8f1..094a4e2 100644 |
| --- a/src/egl/eglut/eglut_screen.c |
| +++ b/src/egl/eglut/eglut_screen.c |
| @@ -35,26 +35,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) |
| { |
| @@ -94,19 +101,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; |
| @@ -128,14 +139,17 @@ _eglutNativeInitWindow(struct eglut_window *win, const char *title, |
| |
| 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 |
| diff --git a/src/egl/opengl/demo1.c b/src/egl/opengl/demo1.c |
| index d892734..3a3564c 100644 |
| --- a/src/egl/opengl/demo1.c |
| +++ b/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 |
| } |
| |
| /** |
| diff --git a/src/egl/opengl/demo2.c b/src/egl/opengl/demo2.c |
| index 505b474..bfef59e 100644 |
| --- a/src/egl/opengl/demo2.c |
| +++ b/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; |
| } |
| diff --git a/src/egl/opengl/demo3.c b/src/egl/opengl/demo3.c |
| index f84ca23..31b5d8b 100644 |
| --- a/src/egl/opengl/demo3.c |
| +++ b/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 GLubyte *buffer, int width, int height) |
| 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; |
| } |
| -- |
| 2.0.0 |
| |