diff options
author | Ross Burton <ross.burton@intel.com> | 2013-04-12 15:18:57 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-04-12 17:00:45 +0100 |
commit | f5c9b4813ca3a2fbe0a0b2e44075f1831a899067 (patch) | |
tree | c0f19d16d4f68c20203949a4aa53b80540500e60 /meta/recipes-graphics/mesa/mesa-demos | |
parent | 06cce092ec2a424dae7c0152443fb191306ba892 (diff) | |
download | poky-f5c9b4813ca3a2fbe0a0b2e44075f1831a899067.tar.gz |
mesa-demos: fix build with non-Mesa GL stacks
These patches from upstream allow mesa-demos to build and run against a non-Mesa
GL stack. Thanks to Tom Zanussi for doing this work for EMGD in meta-intel, and
Otavio Salvador for confirming it also works for Freescale.
[ YOCTO #3469 ]
(From OE-Core rev: 60fabb6ea0474b19ad57873b402a608a92c5a5d4)
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-graphics/mesa/mesa-demos')
3 files changed, 387 insertions, 0 deletions
diff --git a/meta/recipes-graphics/mesa/mesa-demos/0001-xeglgears-Make-EGL_KHR_image-usage-portable.patch b/meta/recipes-graphics/mesa/mesa-demos/0001-xeglgears-Make-EGL_KHR_image-usage-portable.patch new file mode 100644 index 0000000000..43d4fb1d60 --- /dev/null +++ b/meta/recipes-graphics/mesa/mesa-demos/0001-xeglgears-Make-EGL_KHR_image-usage-portable.patch | |||
@@ -0,0 +1,95 @@ | |||
1 | From 43c2122af1caa750531f29bf734c03d1f50801d1 Mon Sep 17 00:00:00 2001 | ||
2 | Message-Id: <43c2122af1caa750531f29bf734c03d1f50801d1.1365283761.git.tom.zanussi@linux.intel.com> | ||
3 | From: Frank Binns <frank.binns@imgtec.com> | ||
4 | Date: Fri, 29 Jun 2012 14:06:27 +0100 | ||
5 | Subject: [PATCH] xeglgears: Make EGL_KHR_image usage portable | ||
6 | |||
7 | EGL extension functions don't have to be exported which means | ||
8 | xeglgears was failing to link against implementations that | ||
9 | support EGL_KHR_image but were not exporting its related functions. | ||
10 | |||
11 | This has been fixed by using eglGetProcAddress to get a function | ||
12 | pointer instead of using the functions prototype. This is portable. | ||
13 | |||
14 | Signed-off-by: Frank Binns <frank.binns@imgtec.com> | ||
15 | |||
16 | Integrated-by: Tom Zanussi <tom.zanussi@linux.intel.com> | ||
17 | |||
18 | Upstream-Status: Backport | ||
19 | --- | ||
20 | src/egl/opengl/xeglgears.c | 37 +++++++++++++++++++++++++++++++------ | ||
21 | 1 file changed, 31 insertions(+), 6 deletions(-) | ||
22 | |||
23 | diff --git a/src/egl/opengl/xeglgears.c b/src/egl/opengl/xeglgears.c | ||
24 | index 513c587..866b89a 100644 | ||
25 | --- a/src/egl/opengl/xeglgears.c | ||
26 | +++ b/src/egl/opengl/xeglgears.c | ||
27 | @@ -51,6 +51,10 @@ | ||
28 | static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES_func; | ||
29 | #endif | ||
30 | |||
31 | +#ifdef EGL_KHR_image | ||
32 | +static PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR_func; | ||
33 | +#endif | ||
34 | + | ||
35 | |||
36 | #define BENCHMARK | ||
37 | |||
38 | @@ -405,6 +409,17 @@ egl_manager_new(EGLNativeDisplayType xdpy, const EGLint *attrib_list, | ||
39 | eglGetProcAddress("glEGLImageTargetTexture2DOES"); | ||
40 | #endif | ||
41 | |||
42 | +#ifdef EGL_KHR_image | ||
43 | + eglCreateImageKHR_func = (PFNEGLCREATEIMAGEKHRPROC) | ||
44 | + eglGetProcAddress("eglCreateImageKHR"); | ||
45 | + if (eglCreateImageKHR_func == NULL) { | ||
46 | + printf("failed to get eglCreateImageKHR\n"); | ||
47 | + eglTerminate(eman->dpy); | ||
48 | + free(eman); | ||
49 | + return NULL; | ||
50 | + } | ||
51 | +#endif | ||
52 | + | ||
53 | return eman; | ||
54 | } | ||
55 | |||
56 | @@ -850,10 +865,16 @@ main(int argc, char *argv[]) | ||
57 | case GEARS_PIXMAP: | ||
58 | case GEARS_PIXMAP_TEXTURE: | ||
59 | ret = egl_manager_create_pixmap(eman, eman->xwin, EGL_TRUE, NULL); | ||
60 | + | ||
61 | +#ifdef EGL_KHR_image | ||
62 | if (surface_type == GEARS_PIXMAP_TEXTURE) | ||
63 | - eman->image = eglCreateImageKHR (eman->dpy, eman->ctx, | ||
64 | - EGL_NATIVE_PIXMAP_KHR, | ||
65 | - (EGLClientBuffer) eman->xpix, NULL); | ||
66 | + eman->image = eglCreateImageKHR_func(eman->dpy, eman->ctx, | ||
67 | + EGL_NATIVE_PIXMAP_KHR, | ||
68 | + (EGLClientBuffer) eman->xpix, NULL); | ||
69 | +#else | ||
70 | + fprintf(stderr, "EGL_KHR_image not found at compile time.\n"); | ||
71 | +#endif | ||
72 | + | ||
73 | if (ret) | ||
74 | ret = eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx); | ||
75 | break; | ||
76 | @@ -892,9 +913,13 @@ main(int argc, char *argv[]) | ||
77 | GL_RENDERBUFFER_EXT, | ||
78 | color_rb); | ||
79 | |||
80 | - eman->image = eglCreateImageKHR(eman->dpy, eman->ctx, | ||
81 | - EGL_GL_RENDERBUFFER_KHR, | ||
82 | - (EGLClientBuffer) color_rb, NULL); | ||
83 | +#ifdef EGL_KHR_image | ||
84 | + eman->image = eglCreateImageKHR_func(eman->dpy, eman->ctx, | ||
85 | + EGL_GL_RENDERBUFFER_KHR, | ||
86 | + (EGLClientBuffer) color_rb, NULL); | ||
87 | +#else | ||
88 | + fprintf(stderr, "EGL_KHR_image not found at compile time.\n"); | ||
89 | +#endif | ||
90 | |||
91 | glGenRenderbuffers(1, &depth_rb); | ||
92 | glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_rb); | ||
93 | -- | ||
94 | 1.7.11.4 | ||
95 | |||
diff --git a/meta/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-build-fix.patch b/meta/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-build-fix.patch new file mode 100644 index 0000000000..46a3e98cfe --- /dev/null +++ b/meta/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-build-fix.patch | |||
@@ -0,0 +1,257 @@ | |||
1 | From ab76f645e29b0a603ff95d88f976bc35ab6301ee Mon Sep 17 00:00:00 2001 | ||
2 | From: Frank Binns <frank.binns@imgtec.com> | ||
3 | Date: Fri, 29 Jun 2012 11:26:04 +0100 | ||
4 | Subject: [PATCH 1/2] mesa-demos: Fix build when EGL_MESA_screen_surface | ||
5 | extension isn't present | ||
6 | |||
7 | The EGL demos won't build against EGL implementations that don't support | ||
8 | the EGL_MESA_screen_surface extension. Fix this, in most cases, by | ||
9 | wrapping relevant bits of code in #ifdef EGL_MESA_screen_surface. | ||
10 | |||
11 | Signed-off-by: Frank Binns <frank.binns@imgtec.com> | ||
12 | |||
13 | Applied and fixed up in Yocto by... | ||
14 | |||
15 | Integrated-by: Tom Zanussi <tom.zanussi@linux.intel.com> | ||
16 | |||
17 | Upstream-Status: Pending | ||
18 | |||
19 | Index: mesa-demos-8.0.1/src/egl/eglut/eglut.c | ||
20 | =================================================================== | ||
21 | --- mesa-demos-8.0.1.orig/src/egl/eglut/eglut.c | ||
22 | +++ mesa-demos-8.0.1/src/egl/eglut/eglut.c | ||
23 | @@ -51,8 +51,9 @@ _eglutNow(void) | ||
24 | static void | ||
25 | _eglutDestroyWindow(struct eglut_window *win) | ||
26 | { | ||
27 | - if (_eglut->surface_type != EGL_PBUFFER_BIT && | ||
28 | - _eglut->surface_type != EGL_SCREEN_BIT_MESA) | ||
29 | + | ||
30 | + if (_eglut->surface_type == EGL_WINDOW_BIT || | ||
31 | + _eglut->surface_type == EGL_PIXMAP_BIT) | ||
32 | eglDestroySurface(_eglut->dpy, win->surface); | ||
33 | |||
34 | _eglutNativeFiniWindow(win); | ||
35 | @@ -150,7 +151,9 @@ _eglutCreateWindow(const char *title, in | ||
36 | win->config, win->native.u.pixmap, NULL); | ||
37 | break; | ||
38 | case EGL_PBUFFER_BIT: | ||
39 | +#ifdef EGL_MESA_screen_surface | ||
40 | case EGL_SCREEN_BIT_MESA: | ||
41 | +#endif | ||
42 | win->surface = win->native.u.surface; | ||
43 | break; | ||
44 | default: | ||
45 | @@ -264,8 +267,10 @@ eglutDestroyWindow(int win) | ||
46 | if (window->index != win) | ||
47 | return; | ||
48 | |||
49 | +#ifdef EGL_MESA_screen_surface | ||
50 | /* XXX it causes some bug in st/egl KMS backend */ | ||
51 | if ( _eglut->surface_type != EGL_SCREEN_BIT_MESA) | ||
52 | +#endif | ||
53 | eglMakeCurrent(_eglut->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); | ||
54 | |||
55 | _eglutDestroyWindow(_eglut->current); | ||
56 | Index: mesa-demos-8.0.1/src/egl/eglut/eglut_screen.c | ||
57 | =================================================================== | ||
58 | --- mesa-demos-8.0.1.orig/src/egl/eglut/eglut_screen.c | ||
59 | +++ mesa-demos-8.0.1/src/egl/eglut/eglut_screen.c | ||
60 | @@ -10,26 +10,33 @@ | ||
61 | |||
62 | #define MAX_MODES 100 | ||
63 | |||
64 | +#ifdef EGL_MESA_screen_surface | ||
65 | static EGLScreenMESA kms_screen; | ||
66 | static EGLModeMESA kms_mode; | ||
67 | static EGLint kms_width, kms_height; | ||
68 | +#endif | ||
69 | |||
70 | void | ||
71 | _eglutNativeInitDisplay(void) | ||
72 | { | ||
73 | +#ifdef EGL_MESA_screen_surface | ||
74 | _eglut->native_dpy = EGL_DEFAULT_DISPLAY; | ||
75 | _eglut->surface_type = EGL_SCREEN_BIT_MESA; | ||
76 | +#endif | ||
77 | } | ||
78 | |||
79 | void | ||
80 | _eglutNativeFiniDisplay(void) | ||
81 | { | ||
82 | +#ifdef EGL_MESA_screen_surface | ||
83 | kms_screen = 0; | ||
84 | kms_mode = 0; | ||
85 | kms_width = 0; | ||
86 | kms_height = 0; | ||
87 | +#endif | ||
88 | } | ||
89 | |||
90 | +#ifdef EGL_MESA_screen_surface | ||
91 | static void | ||
92 | init_kms(void) | ||
93 | { | ||
94 | @@ -69,19 +76,23 @@ init_kms(void) | ||
95 | kms_width = width; | ||
96 | kms_height = height; | ||
97 | } | ||
98 | +#endif | ||
99 | |||
100 | void | ||
101 | _eglutNativeInitWindow(struct eglut_window *win, const char *title, | ||
102 | int x, int y, int w, int h) | ||
103 | { | ||
104 | +#ifdef EGL_MESA_screen_surface | ||
105 | EGLint surf_attribs[16]; | ||
106 | EGLint i; | ||
107 | +#endif | ||
108 | const char *exts; | ||
109 | |||
110 | exts = eglQueryString(_eglut->dpy, EGL_EXTENSIONS); | ||
111 | if (!exts || !strstr(exts, "EGL_MESA_screen_surface")) | ||
112 | _eglutFatal("EGL_MESA_screen_surface is not supported\n"); | ||
113 | |||
114 | +#ifdef EGL_MESA_screen_surface | ||
115 | init_kms(); | ||
116 | |||
117 | i = 0; | ||
118 | @@ -103,14 +114,17 @@ _eglutNativeInitWindow(struct eglut_wind | ||
119 | |||
120 | win->native.width = kms_width; | ||
121 | win->native.height = kms_height; | ||
122 | +#endif | ||
123 | } | ||
124 | |||
125 | void | ||
126 | _eglutNativeFiniWindow(struct eglut_window *win) | ||
127 | { | ||
128 | +#ifdef EGL_MESA_screen_surface | ||
129 | eglShowScreenSurfaceMESA(_eglut->dpy, | ||
130 | kms_screen, EGL_NO_SURFACE, 0); | ||
131 | eglDestroySurface(_eglut->dpy, win->native.u.surface); | ||
132 | +#endif | ||
133 | } | ||
134 | |||
135 | void | ||
136 | Index: mesa-demos-8.0.1/src/egl/opengl/demo1.c | ||
137 | =================================================================== | ||
138 | --- mesa-demos-8.0.1.orig/src/egl/opengl/demo1.c | ||
139 | +++ mesa-demos-8.0.1/src/egl/opengl/demo1.c | ||
140 | @@ -18,6 +18,7 @@ | ||
141 | static void | ||
142 | TestScreens(EGLDisplay dpy) | ||
143 | { | ||
144 | +#ifdef EGL_MESA_screen_surface | ||
145 | #define MAX 8 | ||
146 | EGLScreenMESA screens[MAX]; | ||
147 | EGLint numScreens; | ||
148 | @@ -28,6 +29,7 @@ TestScreens(EGLDisplay dpy) | ||
149 | for (i = 0; i < numScreens; i++) { | ||
150 | printf(" Screen %d handle: %d\n", i, (int) screens[i]); | ||
151 | } | ||
152 | +#endif | ||
153 | } | ||
154 | |||
155 | /** | ||
156 | Index: mesa-demos-8.0.1/src/egl/opengl/demo2.c | ||
157 | =================================================================== | ||
158 | --- mesa-demos-8.0.1.orig/src/egl/opengl/demo2.c | ||
159 | +++ mesa-demos-8.0.1/src/egl/opengl/demo2.c | ||
160 | @@ -16,6 +16,7 @@ | ||
161 | |||
162 | /*#define FRONTBUFFER*/ | ||
163 | |||
164 | +#ifdef EGL_MESA_screen_surface | ||
165 | static void _subset_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2, | ||
166 | GLfloat r, GLfloat g, GLfloat b) | ||
167 | { | ||
168 | @@ -95,12 +96,13 @@ TestScreens(EGLDisplay dpy) | ||
169 | printf(" Screen %d handle: %d\n", i, (int) screens[i]); | ||
170 | } | ||
171 | } | ||
172 | - | ||
173 | +#endif | ||
174 | |||
175 | int | ||
176 | main(int argc, char *argv[]) | ||
177 | { | ||
178 | int maj, min; | ||
179 | +#ifdef EGL_MESA_screen_surface | ||
180 | EGLContext ctx; | ||
181 | EGLSurface pbuffer, screen_surf; | ||
182 | EGLConfig configs[10]; | ||
183 | @@ -115,6 +117,7 @@ main(int argc, char *argv[]) | ||
184 | EGLModeMESA mode; | ||
185 | EGLScreenMESA screen; | ||
186 | EGLint count; | ||
187 | +#endif | ||
188 | |||
189 | EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY); | ||
190 | assert(d); | ||
191 | @@ -132,6 +135,7 @@ main(int argc, char *argv[]) | ||
192 | exit(1); | ||
193 | } | ||
194 | |||
195 | +#ifdef EGL_MESA_screen_surface | ||
196 | eglGetConfigs(d, configs, 10, &numConfigs); | ||
197 | printf("Got %d EGL configs:\n", numConfigs); | ||
198 | for (i = 0; i < numConfigs; i++) { | ||
199 | @@ -211,6 +215,7 @@ main(int argc, char *argv[]) | ||
200 | eglDestroySurface(d, pbuffer); | ||
201 | eglDestroyContext(d, ctx); | ||
202 | eglTerminate(d); | ||
203 | +#endif | ||
204 | |||
205 | return 0; | ||
206 | } | ||
207 | Index: mesa-demos-8.0.1/src/egl/opengl/demo3.c | ||
208 | =================================================================== | ||
209 | --- mesa-demos-8.0.1.orig/src/egl/opengl/demo3.c | ||
210 | +++ mesa-demos-8.0.1/src/egl/opengl/demo3.c | ||
211 | @@ -46,7 +46,7 @@ GLubyte OpenGL_bits[] = { | ||
212 | 0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00, | ||
213 | }; | ||
214 | |||
215 | - | ||
216 | +#ifdef EGL_MESA_screen_surface | ||
217 | static void Init(void) | ||
218 | { | ||
219 | |||
220 | @@ -551,11 +551,13 @@ write_ppm(const char *filename, const GL | ||
221 | fclose(f); | ||
222 | } | ||
223 | } | ||
224 | +#endif | ||
225 | |||
226 | int | ||
227 | main(int argc, char *argv[]) | ||
228 | { | ||
229 | int maj, min; | ||
230 | +#ifdef EGL_MESA_screen_surface | ||
231 | EGLContext ctx; | ||
232 | EGLSurface screen_surf; | ||
233 | EGLConfig configs[10]; | ||
234 | @@ -566,6 +568,7 @@ main(int argc, char *argv[]) | ||
235 | const GLubyte *bitmap; | ||
236 | EGLint screenAttribs[32]; | ||
237 | EGLint i; | ||
238 | +#endif | ||
239 | |||
240 | EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY); | ||
241 | assert(d); | ||
242 | @@ -583,6 +586,7 @@ main(int argc, char *argv[]) | ||
243 | exit(1); | ||
244 | } | ||
245 | |||
246 | +#ifdef EGL_MESA_screen_surface | ||
247 | eglGetConfigs(d, configs, 10, &numConfigs); | ||
248 | eglGetScreensMESA(d, &screen, 1, &count); | ||
249 | eglGetModesMESA(d, screen, &mode, 1, &count); | ||
250 | @@ -642,6 +646,7 @@ main(int argc, char *argv[]) | ||
251 | eglDestroySurface(d, screen_surf); | ||
252 | eglDestroyContext(d, ctx); | ||
253 | eglTerminate(d); | ||
254 | +#endif | ||
255 | |||
256 | return 0; | ||
257 | } | ||
diff --git a/meta/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-query.patch b/meta/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-query.patch new file mode 100644 index 0000000000..795370819b --- /dev/null +++ b/meta/recipes-graphics/mesa/mesa-demos/egl-mesa-screen-surface-query.patch | |||
@@ -0,0 +1,35 @@ | |||
1 | From cf90a5c0c173d017a80cde057da57c365b3b1a40 Mon Sep 17 00:00:00 2001 | ||
2 | From: Frank Binns <frank.binns@imgtec.com> | ||
3 | Date: Fri, 29 Jun 2012 12:00:26 +0100 | ||
4 | Subject: [PATCH 2/2] mesa-demos: Query display for EGL_MESA_screen_surface | ||
5 | extension before using it | ||
6 | |||
7 | This code makes heavy use of the EGL_MESA_screen_surface extension so | ||
8 | check the display to determine if it's supported by the underlying EGL | ||
9 | implementation. If it doesn't then bail. | ||
10 | |||
11 | Signed-off-by: Frank Binns <frank.binns@imgtec.com> | ||
12 | |||
13 | Applied and fixed up in Yocto by... | ||
14 | |||
15 | Integrated-by: Tom Zanussi <tom.zanussi@linux.intel.com> | ||
16 | |||
17 | Upstream-Status: Pending | ||
18 | |||
19 | Index: mesa-demos-8.0.1/src/egl/opengl/demo1.c | ||
20 | =================================================================== | ||
21 | --- mesa-demos-8.0.1.orig/src/egl/opengl/demo1.c | ||
22 | +++ mesa-demos-8.0.1/src/egl/opengl/demo1.c | ||
23 | @@ -110,6 +110,12 @@ main(int argc, char *argv[]) | ||
24 | printf("EGL version = %d.%d\n", maj, min); | ||
25 | printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR)); | ||
26 | |||
27 | + if (!strstr(eglQueryString(d, EGL_EXTENSIONS), | ||
28 | + "EGL_MESA_screen_surface")) { | ||
29 | + printf("EGL_MESA_screen_surface is not supported\n"); | ||
30 | + exit(1); | ||
31 | + } | ||
32 | + | ||
33 | eglGetConfigs(d, NULL, 0, &numConfigs); | ||
34 | configs = malloc(sizeof(*configs) *numConfigs); | ||
35 | eglGetConfigs(d, configs, numConfigs, &numConfigs); | ||