Mir

Merge lp:~vanvugt/mir/unwanted-alpha into lp:mir

Proposed by Daniel van Vugt
Status: Work in progress
Proposed branch: lp:~vanvugt/mir/unwanted-alpha
Merge into: lp:mir
Diff against target: 509 lines (+168/-38)
26 files modified
debian/control (+4/-4)
debian/mir-client-platform-android4.install (+1/-1)
debian/mir-client-platform-mesa4.install (+1/-1)
examples/eglapp.c (+2/-1)
examples/scroll.cpp (+2/-1)
include/client/mir_toolkit/mir_connection.h (+6/-1)
src/client/mir_connection.cpp (+3/-2)
src/client/mir_connection.h (+2/-1)
src/client/mir_connection_api.cpp (+14/-2)
src/client/symbols.map (+7/-1)
src/include/client/mir/client_platform.h (+2/-1)
src/platforms/CMakeLists.txt (+1/-1)
src/platforms/android/client/android_client_platform.cpp (+1/-1)
src/platforms/android/client/android_client_platform.h (+2/-1)
src/platforms/android/client/symbols.map (+1/-1)
src/platforms/mesa/client/client_platform.cpp (+18/-2)
src/platforms/mesa/client/client_platform.h (+2/-1)
src/platforms/mesa/client/symbols.map (+1/-1)
tests/acceptance-tests/test_client_library_errors.cpp (+2/-1)
tests/mir_test_framework/stub_client_platform_factory.cpp (+2/-1)
tests/mir_test_framework/symbols-client.map (+1/-1)
tests/unit-tests/client/android/test_android_client_platform.cpp (+8/-4)
tests/unit-tests/client/mesa/test_client_platform.cpp (+79/-3)
tests/unit-tests/client/test_client_buffer_stream.cpp (+2/-1)
tests/unit-tests/client/test_client_mir_surface.cpp (+2/-1)
tests/unit-tests/client/test_mir_connection.cpp (+2/-2)
To merge this branch: bzr merge lp:~vanvugt/mir/unwanted-alpha
Reviewer Review Type Date Requested Status
Daniel van Vugt Needs Information
Kevin DuBois (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Alan Griffiths Abstain
Review via email: mp+266694@code.launchpad.net

Commit message

Extend mir_connection_get_egl_pixel_format to take additional hints
from the client's requested attribute list. This way the existence
of an alpha channel (chosen by the driver but unwanted by the client)
doesn't force Mir into a slower compositing mode (LP: #1480755).

Description of the change

I could have just hacked examples/eglapp.c and declared the bug fixed, but that would not suffice for other toolkits (particularly games). So this more long-winded solution solves the problem for everyone.

I also investigated the possibility that our dumb demo code was simply not finding the best EGLConfig by virtue of always truncating the list of configs to length one. But even if you look at the full list, the problem is present for every available EGLConfig (EGL_ALPHA_SIZE==8 even when I didn't ask for it).

Annoyingly the first version of mir_connection_get_egl_pixel_format
is actually returning the right result (the pixel format the driver
is using) so there's nothing immediately obvious to fix. But the right
pixel format is not necessarily the fastest one. If we can see the
client hasn't asked for an alpha channel then we should disable the
alpha channel. This way composite bypass can still be used on platforms
that always return an alpha channel (e.g. Mesa on Haswell always returns EGL_ALPHA_SIZE==8).

I'm fairly sure we only want to fix this on Mesa where the bug was
found. On Android we have a greater chance of supporting translucent
overlays in future so don't want to (and don't need to) use as big a
hammer (see TODOs in hwc_layerlist.cpp).

To post a comment you must log in.
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

395 +TEST_F(MesaClientPlatformTest, takes_opacity_hint_from_attribs)

This test checks for the correct result in several different scenarios (multiple unrelated EXPECT_EQs). I'd prefer a test for each of them.

review: Abstain
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Kevin DuBois (kdub) wrote :

+1 to separating out the test into its different expectations, but lgtm otherwise

review: Approve
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Chris suggested today that we should just fix Mesa instead. If Mesa returned RGBA of 8880 instead of 8888 when we are asking for 8880, then there would not be a bug to fix.

review: Needs Information

Unmerged revisions

2809. By Daniel van Vugt

Bump the client platform ABI, since it's now broken.

2808. By Daniel van Vugt

Restore ABI backward-compatibility

2807. By Daniel van Vugt

Extend the tests further

2806. By Daniel van Vugt

Enable the fix. Tests now pass.

2805. By Daniel van Vugt

Fix the test. Copy and paste stupidity.

2804. By Daniel van Vugt

Disable the fix and write some regression tests.

2803. By Daniel van Vugt

First working prototype

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'debian/control'
2--- debian/control 2015-07-28 22:27:27 +0000
3+++ debian/control 2015-08-03 08:59:59 +0000
4@@ -314,7 +314,7 @@
5 Contains the shared libraries required for the Mir server to interact with
6 the hardware platform using the Android drivers.
7
8-Package: mir-client-platform-mesa3
9+Package: mir-client-platform-mesa4
10 Section: libs
11 Architecture: linux-any
12 Multi-Arch: same
13@@ -342,7 +342,7 @@
14 Contains header files required to use the platform specific capabilities of
15 the Mir Mesa backend.
16
17-Package: mir-client-platform-android3
18+Package: mir-client-platform-android4
19 Section: libs
20 Architecture: i386 amd64 armhf
21 Multi-Arch: same
22@@ -363,7 +363,7 @@
23 Pre-Depends: ${misc:Pre-Depends}
24 Depends: ${misc:Depends},
25 mir-platform-graphics-mesa-kms4,
26- mir-client-platform-mesa3,
27+ mir-client-platform-mesa4,
28 Description: Display server for Ubuntu - desktop driver metapackage
29 Mir is a display server running on linux systems, with a focus on efficiency,
30 robust operation and a well-defined driver model.
31@@ -378,7 +378,7 @@
32 Pre-Depends: ${misc:Pre-Depends}
33 Depends: ${misc:Depends},
34 mir-platform-graphics-android4,
35- mir-client-platform-android3,
36+ mir-client-platform-android4,
37 Description: Display server for Ubuntu - android driver metapackage
38 Mir is a display server running on linux systems, with a focus on efficiency,
39 robust operation and a well-defined driver model.
40
41=== renamed file 'debian/mir-client-platform-android3.install' => 'debian/mir-client-platform-android4.install'
42--- debian/mir-client-platform-android3.install 2015-07-17 06:29:44 +0000
43+++ debian/mir-client-platform-android4.install 2015-08-03 08:59:59 +0000
44@@ -1,1 +1,1 @@
45-usr/lib/*/mir/client-platform/android.so.3
46+usr/lib/*/mir/client-platform/android.so.4
47
48=== renamed file 'debian/mir-client-platform-mesa3.install' => 'debian/mir-client-platform-mesa4.install'
49--- debian/mir-client-platform-mesa3.install 2015-07-17 06:29:44 +0000
50+++ debian/mir-client-platform-mesa4.install 2015-08-03 08:59:59 +0000
51@@ -1,1 +1,1 @@
52-usr/lib/*/mir/client-platform/mesa.so.3
53+usr/lib/*/mir/client-platform/mesa.so.4
54
55=== modified file 'examples/eglapp.c'
56--- examples/eglapp.c 2015-07-16 08:13:28 +0000
57+++ examples/eglapp.c 2015-08-03 08:59:59 +0000
58@@ -363,7 +363,8 @@
59 CHECK(neglconfigs > 0, "No EGL config available");
60
61 MirPixelFormat pixel_format =
62- mir_connection_get_egl_pixel_format(connection, egldisplay, eglconfig);
63+ mir_connection_get_egl_pixel_format(connection, egldisplay, eglconfig,
64+ attribs);
65
66 printf("Using Mir pixel format %d.\n", pixel_format);
67
68
69=== modified file 'examples/scroll.cpp'
70--- examples/scroll.cpp 2015-07-14 08:30:45 +0000
71+++ examples/scroll.cpp 2015-08-03 08:59:59 +0000
72@@ -66,7 +66,8 @@
73 assert(n == 1);
74
75 MirPixelFormat pixel_format =
76- mir_connection_get_egl_pixel_format(connection, disp, egl_config);
77+ mir_connection_get_egl_pixel_format(connection, disp, egl_config,
78+ attribs);
79
80 printf("Mir chose pixel format %d\n", pixel_format);
81
82
83=== modified file 'include/client/mir_toolkit/mir_connection.h'
84--- include/client/mir_toolkit/mir_connection.h 2015-07-29 09:35:16 +0000
85+++ include/client/mir_toolkit/mir_connection.h 2015-08-03 08:59:59 +0000
86@@ -189,10 +189,15 @@
87 * \param [in] connection The connection
88 * \param [in] egldisplay The EGLDisplay for the given config
89 * \param [in] eglconfig The EGLConfig you have chosen to use
90+ * \param [in] attribs (Optional) The attribute list used to choose the
91+ * above eglconfig (or NULL). If provided, this may
92+ * allow Mir to choose a higher performing pixel
93+ * format.
94 * \return The MirPixelFormat to use in surface creation
95 */
96 MirPixelFormat mir_connection_get_egl_pixel_format(
97- MirConnection *connection, void *egldisplay, void *eglconfig);
98+ MirConnection *connection, void *egldisplay, void *eglconfig,
99+ int const* attribs);
100
101 /**
102 * Get the list of possible formats that a surface can be created with.
103
104=== modified file 'src/client/mir_connection.cpp'
105--- src/client/mir_connection.cpp 2015-07-29 17:32:39 +0000
106+++ src/client/mir_connection.cpp 2015-08-03 08:59:59 +0000
107@@ -523,10 +523,11 @@
108 return *native_display;
109 }
110
111-MirPixelFormat MirConnection::egl_pixel_format(EGLDisplay disp, EGLConfig conf) const
112+MirPixelFormat MirConnection::egl_pixel_format(EGLDisplay disp, EGLConfig conf,
113+ EGLint const* attribs) const
114 {
115 std::lock_guard<decltype(mutex)> lock(mutex);
116- return platform->get_egl_pixel_format(disp, conf);
117+ return platform->get_egl_pixel_format(disp, conf, attribs);
118 }
119
120 void MirConnection::on_stream_created(int id, mcl::ClientBufferStream* stream)
121
122=== modified file 'src/client/mir_connection.h'
123--- src/client/mir_connection.h 2015-07-29 17:32:39 +0000
124+++ src/client/mir_connection.h 2015-08-03 08:59:59 +0000
125@@ -152,7 +152,8 @@
126 static bool is_valid(MirConnection *connection);
127
128 EGLNativeDisplayType egl_native_display();
129- MirPixelFormat egl_pixel_format(EGLDisplay, EGLConfig) const;
130+ MirPixelFormat egl_pixel_format(EGLDisplay, EGLConfig,
131+ EGLint const*) const;
132
133 void on_surface_created(int id, MirSurface* surface);
134 void on_stream_created(int id, mir::client::ClientBufferStream* stream);
135
136=== modified file 'src/client/mir_connection_api.cpp'
137--- src/client/mir_connection_api.cpp 2015-07-25 08:10:48 +0000
138+++ src/client/mir_connection_api.cpp 2015-08-03 08:59:59 +0000
139@@ -253,12 +253,24 @@
140 return connection->egl_native_display();
141 }
142
143-MirPixelFormat mir_connection_get_egl_pixel_format(MirConnection* connection,
144+extern "C" {
145+
146+__asm__(".symver mir_connection_get_egl_pixel_format4,mir_connection_get_egl_pixel_format@@MIR_CLIENT_9.2");
147+MirPixelFormat mir_connection_get_egl_pixel_format4(MirConnection* connection,
148+ EGLDisplay disp, EGLConfig conf, EGLint const* attribs)
149+{
150+ return connection->egl_pixel_format(disp, conf, attribs);
151+}
152+
153+__asm__(".symver mir_connection_get_egl_pixel_format3,mir_connection_get_egl_pixel_format@MIR_CLIENT_9.1");
154+MirPixelFormat mir_connection_get_egl_pixel_format3(MirConnection* connection,
155 EGLDisplay disp, EGLConfig conf)
156 {
157- return connection->egl_pixel_format(disp, conf);
158+ return mir_connection_get_egl_pixel_format4(connection, disp, conf, nullptr);
159 }
160
161+} // extern "C"
162+
163 void mir_connection_get_available_surface_formats(
164 MirConnection* connection,
165 MirPixelFormat* formats,
166
167=== modified file 'src/client/symbols.map'
168--- src/client/symbols.map 2015-07-28 02:44:07 +0000
169+++ src/client/symbols.map 2015-08-03 08:59:59 +0000
170@@ -172,10 +172,16 @@
171 mir_touch_event_input_event;
172 mir_surface_spec_attach_to_foreign_parent;
173 mir_surface_spec_set_input_shape;
174- mir_connection_get_egl_pixel_format;
175+ mir_connection_get_egl_pixel_format; # 3 parameter version
176 local: *;
177 } MIR_CLIENT_9;
178
179+MIR_CLIENT_9.2 { # New functions in Mir 0.16
180+ global:
181+ mir_connection_get_egl_pixel_format; # 4 parameter version
182+ local: *;
183+} MIR_CLIENT_9.1;
184+
185 MIR_CLIENT_DETAIL_9 {
186 global:
187 extern "C++" {
188
189=== modified file 'src/include/client/mir/client_platform.h'
190--- src/include/client/mir/client_platform.h 2015-07-13 10:10:42 +0000
191+++ src/include/client/mir/client_platform.h 2015-08-03 08:59:59 +0000
192@@ -65,7 +65,8 @@
193 virtual std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) = 0;
194 virtual std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() = 0;
195 virtual MirNativeBuffer* convert_native_buffer(graphics::NativeBuffer*) const = 0;
196- virtual MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig) const = 0;
197+ virtual MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig,
198+ EGLint const*) const = 0;
199 };
200
201 }
202
203=== modified file 'src/platforms/CMakeLists.txt'
204--- src/platforms/CMakeLists.txt 2015-07-23 02:39:20 +0000
205+++ src/platforms/CMakeLists.txt 2015-08-03 08:59:59 +0000
206@@ -20,7 +20,7 @@
207 PARENT_SCOPE
208 )
209
210-set(MIR_CLIENT_PLATFORM_ABI 3)
211+set(MIR_CLIENT_PLATFORM_ABI 4)
212 set(MIR_CLIENT_PLATFORM_ABI ${MIR_CLIENT_PLATFORM_ABI} PARENT_SCOPE)
213 set(MIR_CLIENT_PLATFORM_VERSION "MIR_CLIENT_PLATFORM_${MIR_CLIENT_PLATFORM_ABI}")
214 set(MIR_CLIENT_PLATFORM_VERSION ${MIR_CLIENT_PLATFORM_VERSION} PARENT_SCOPE)
215
216=== modified file 'src/platforms/android/client/android_client_platform.cpp'
217--- src/platforms/android/client/android_client_platform.cpp 2015-07-21 04:30:03 +0000
218+++ src/platforms/android/client/android_client_platform.cpp 2015-08-03 08:59:59 +0000
219@@ -138,7 +138,7 @@
220 __attribute__((weak));
221
222 MirPixelFormat mcla::AndroidClientPlatform::get_egl_pixel_format(
223- EGLDisplay disp, EGLConfig conf) const
224+ EGLDisplay disp, EGLConfig conf, EGLint const*) const
225 {
226 MirPixelFormat mir_format = mir_pixel_format_invalid;
227
228
229=== modified file 'src/platforms/android/client/android_client_platform.h'
230--- src/platforms/android/client/android_client_platform.h 2015-07-13 10:10:42 +0000
231+++ src/platforms/android/client/android_client_platform.h 2015-08-03 08:59:59 +0000
232@@ -40,7 +40,8 @@
233 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;
234 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;
235 MirNativeBuffer* convert_native_buffer(graphics::NativeBuffer*) const override;
236- MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig) const override;
237+ MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig,
238+ EGLint const*) const override;
239
240 private:
241 ClientContext* const context;
242
243=== modified file 'src/platforms/android/client/symbols.map'
244--- src/platforms/android/client/symbols.map 2015-07-17 06:31:02 +0000
245+++ src/platforms/android/client/symbols.map 2015-08-03 08:59:59 +0000
246@@ -1,4 +1,4 @@
247-MIR_CLIENT_PLATFORM_3 {
248+MIR_CLIENT_PLATFORM_4 {
249 global:
250 create_client_platform;
251 is_appropriate_module;
252
253=== modified file 'src/platforms/mesa/client/client_platform.cpp'
254--- src/platforms/mesa/client/client_platform.cpp 2015-07-17 08:08:44 +0000
255+++ src/platforms/mesa/client/client_platform.cpp 2015-08-03 08:59:59 +0000
256@@ -193,10 +193,25 @@
257 __attribute__((weak));
258
259 MirPixelFormat mclm::ClientPlatform::get_egl_pixel_format(
260- EGLDisplay disp, EGLConfig conf) const
261+ EGLDisplay disp, EGLConfig conf, EGLint const* attribs) const
262 {
263 MirPixelFormat mir_format = mir_pixel_format_invalid;
264
265+ bool force_opaque = false; // Don't guess attribs if unavailable
266+ if (attribs)
267+ {
268+ // Optimize our choice of pixel format for the best chance of enabling
269+ // composite bypass/overlays... (LP: #1480755)
270+ force_opaque = true;
271+ EGLint const* a = attribs;
272+ while (a[0] != EGL_NONE)
273+ {
274+ if (a[0] == EGL_ALPHA_SIZE && a[1] > 0)
275+ force_opaque = false;
276+ a += 2;
277+ }
278+ }
279+
280 /*
281 * This is based on gbm_dri_is_format_supported() however we can't call it
282 * via the public API gbm_device_is_format_supported because that is
283@@ -217,7 +232,8 @@
284 {
285 // GBM is very limited, which at least makes this simple...
286 if (a == 8)
287- mir_format = mir_pixel_format_argb_8888;
288+ mir_format = force_opaque ? mir_pixel_format_xrgb_8888 :
289+ mir_pixel_format_argb_8888;
290 else if (a == 0)
291 mir_format = mir_pixel_format_xrgb_8888;
292 }
293
294=== modified file 'src/platforms/mesa/client/client_platform.h'
295--- src/platforms/mesa/client/client_platform.h 2015-07-13 10:10:42 +0000
296+++ src/platforms/mesa/client/client_platform.h 2015-08-03 08:59:59 +0000
297@@ -48,7 +48,8 @@
298 std::shared_ptr<EGLNativeWindowType> create_egl_native_window(EGLNativeSurface *surface) override;
299 std::shared_ptr<EGLNativeDisplayType> create_egl_native_display() override;
300 MirNativeBuffer* convert_native_buffer(graphics::NativeBuffer*) const override;
301- MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig) const override;
302+ MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig,
303+ EGLint const*) const override;
304
305 private:
306 ClientContext* const context;
307
308=== modified file 'src/platforms/mesa/client/symbols.map'
309--- src/platforms/mesa/client/symbols.map 2015-07-17 06:31:02 +0000
310+++ src/platforms/mesa/client/symbols.map 2015-08-03 08:59:59 +0000
311@@ -1,4 +1,4 @@
312-MIR_CLIENT_PLATFORM_3 {
313+MIR_CLIENT_PLATFORM_4 {
314 global:
315 create_client_platform;
316 is_appropriate_module;
317
318=== modified file 'tests/acceptance-tests/test_client_library_errors.cpp'
319--- tests/acceptance-tests/test_client_library_errors.cpp 2015-07-22 02:54:31 +0000
320+++ tests/acceptance-tests/test_client_library_errors.cpp 2015-08-03 08:59:59 +0000
321@@ -104,7 +104,8 @@
322 BOOST_THROW_EXCEPTION(std::runtime_error{exception_text});
323 return nullptr;
324 }
325- MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig) const override
326+ MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig,
327+ EGLint const*) const override
328 {
329 return mir_pixel_format_invalid;
330 }
331
332=== modified file 'tests/mir_test_framework/stub_client_platform_factory.cpp'
333--- tests/mir_test_framework/stub_client_platform_factory.cpp 2015-07-17 07:07:33 +0000
334+++ tests/mir_test_framework/stub_client_platform_factory.cpp 2015-08-03 08:59:59 +0000
335@@ -84,7 +84,8 @@
336 #endif
337 }
338
339- MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig) const override
340+ MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig,
341+ EGLint const*) const override
342 {
343 return mir_pixel_format_argb_8888;
344 }
345
346=== modified file 'tests/mir_test_framework/symbols-client.map'
347--- tests/mir_test_framework/symbols-client.map 2015-07-17 06:44:08 +0000
348+++ tests/mir_test_framework/symbols-client.map 2015-08-03 08:59:59 +0000
349@@ -1,4 +1,4 @@
350-MIR_CLIENT_PLATFORM_3 {
351+MIR_CLIENT_PLATFORM_4 {
352 global:
353 create_client_platform;
354 is_appropriate_module;
355
356=== modified file 'tests/unit-tests/client/android/test_android_client_platform.cpp'
357--- tests/unit-tests/client/android/test_android_client_platform.cpp 2015-07-16 10:11:49 +0000
358+++ tests/unit-tests/client/android/test_android_client_platform.cpp 2015-08-03 08:59:59 +0000
359@@ -74,8 +74,12 @@
360 .WillOnce(DoAll(SetArgPointee<3>(0),
361 Return(EGL_FALSE)));
362
363- EXPECT_EQ(mir_pixel_format_rgb_565, platform->get_egl_pixel_format(d, c));
364- EXPECT_EQ(mir_pixel_format_rgb_888, platform->get_egl_pixel_format(d, c));
365- EXPECT_EQ(mir_pixel_format_argb_8888, platform->get_egl_pixel_format(d, c));
366- EXPECT_EQ(mir_pixel_format_invalid, platform->get_egl_pixel_format(d, c));
367+ EXPECT_EQ(mir_pixel_format_rgb_565,
368+ platform->get_egl_pixel_format(d, c, nullptr));
369+ EXPECT_EQ(mir_pixel_format_rgb_888,
370+ platform->get_egl_pixel_format(d, c, nullptr));
371+ EXPECT_EQ(mir_pixel_format_argb_8888,
372+ platform->get_egl_pixel_format(d, c, nullptr));
373+ EXPECT_EQ(mir_pixel_format_invalid,
374+ platform->get_egl_pixel_format(d, c, nullptr));
375 }
376
377=== modified file 'tests/unit-tests/client/mesa/test_client_platform.cpp'
378--- tests/unit-tests/client/mesa/test_client_platform.cpp 2015-07-16 10:45:52 +0000
379+++ tests/unit-tests/client/mesa/test_client_platform.cpp 2015-08-03 08:59:59 +0000
380@@ -147,7 +147,83 @@
381 .WillOnce(DoAll(SetArgPointee<3>(0), Return(EGL_TRUE)))
382 .WillOnce(DoAll(SetArgPointee<3>(666), Return(EGL_FALSE)));
383
384- EXPECT_EQ(mir_pixel_format_argb_8888, platform->get_egl_pixel_format(d, c));
385- EXPECT_EQ(mir_pixel_format_xrgb_8888, platform->get_egl_pixel_format(d, c));
386- EXPECT_EQ(mir_pixel_format_invalid, platform->get_egl_pixel_format(d, c));
387+ EXPECT_EQ(mir_pixel_format_argb_8888,
388+ platform->get_egl_pixel_format(d, c, nullptr));
389+ EXPECT_EQ(mir_pixel_format_xrgb_8888,
390+ platform->get_egl_pixel_format(d, c, nullptr));
391+ EXPECT_EQ(mir_pixel_format_invalid,
392+ platform->get_egl_pixel_format(d, c, nullptr));
393+}
394+
395+TEST_F(MesaClientPlatformTest, takes_opacity_hint_from_attribs)
396+{ // Regression test for LP: #1480755
397+ using namespace testing;
398+
399+ auto const d = reinterpret_cast<EGLDisplay>(0x1234);
400+ auto const c = reinterpret_cast<EGLConfig>(0x5678);
401+
402+ // Emulate the i915 Haswell driver which likes to return 8888 always
403+ EXPECT_CALL(mock_egl, eglGetConfigAttrib(d, c, EGL_RED_SIZE, _))
404+ .WillRepeatedly(DoAll(SetArgPointee<3>(8), Return(EGL_TRUE)));
405+ EXPECT_CALL(mock_egl, eglGetConfigAttrib(d, c, EGL_GREEN_SIZE, _))
406+ .WillRepeatedly(DoAll(SetArgPointee<3>(8), Return(EGL_TRUE)));
407+ EXPECT_CALL(mock_egl, eglGetConfigAttrib(d, c, EGL_BLUE_SIZE, _))
408+ .WillRepeatedly(DoAll(SetArgPointee<3>(8), Return(EGL_TRUE)));
409+ EXPECT_CALL(mock_egl, eglGetConfigAttrib(d, c, EGL_ALPHA_SIZE, _))
410+ .WillRepeatedly(DoAll(SetArgPointee<3>(8), Return(EGL_TRUE)));
411+
412+ EGLint const opaque_request[] =
413+ {
414+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
415+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
416+ EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
417+ EGL_RED_SIZE, 5,
418+ EGL_GREEN_SIZE, 5,
419+ EGL_BLUE_SIZE, 5,
420+ EGL_ALPHA_SIZE, 0,
421+ EGL_NONE
422+ };
423+ EXPECT_EQ(mir_pixel_format_xrgb_8888,
424+ platform->get_egl_pixel_format(d, c, opaque_request));
425+
426+ EGLint const translucent_request[] =
427+ {
428+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
429+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
430+ EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
431+ EGL_RED_SIZE, 4,
432+ EGL_GREEN_SIZE, 4,
433+ EGL_BLUE_SIZE, 4,
434+ EGL_ALPHA_SIZE, 4,
435+ EGL_NONE
436+ };
437+ EXPECT_EQ(mir_pixel_format_argb_8888,
438+ platform->get_egl_pixel_format(d, c, translucent_request));
439+
440+ EGLint const dontcare_request[] =
441+ {
442+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
443+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
444+ EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
445+ EGL_RED_SIZE, 5,
446+ EGL_GREEN_SIZE, 5,
447+ EGL_BLUE_SIZE, 5,
448+ EGL_ALPHA_SIZE, EGL_DONT_CARE,
449+ EGL_NONE
450+ };
451+ EXPECT_EQ(mir_pixel_format_xrgb_8888,
452+ platform->get_egl_pixel_format(d, c, dontcare_request));
453+
454+ EGLint const missing_request[] =
455+ {
456+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
457+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
458+ EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
459+ EGL_RED_SIZE, 5,
460+ EGL_GREEN_SIZE, 5,
461+ EGL_BLUE_SIZE, 5,
462+ EGL_NONE
463+ };
464+ EXPECT_EQ(mir_pixel_format_xrgb_8888,
465+ platform->get_egl_pixel_format(d, c, missing_request));
466 }
467
468=== modified file 'tests/unit-tests/client/test_client_buffer_stream.cpp'
469--- tests/unit-tests/client/test_client_buffer_stream.cpp 2015-07-28 23:05:14 +0000
470+++ tests/unit-tests/client/test_client_buffer_stream.cpp 2015-08-03 08:59:59 +0000
471@@ -103,7 +103,8 @@
472 {
473 return nullptr;
474 }
475- MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig) const override
476+ MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig,
477+ EGLint const*) const override
478 {
479 return mir_pixel_format_invalid;
480 }
481
482=== modified file 'tests/unit-tests/client/test_client_mir_surface.cpp'
483--- tests/unit-tests/client/test_client_mir_surface.cpp 2015-07-29 01:39:52 +0000
484+++ tests/unit-tests/client/test_client_mir_surface.cpp 2015-08-03 08:59:59 +0000
485@@ -244,7 +244,8 @@
486 return nullptr;
487 }
488
489- MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig) const override
490+ MirPixelFormat get_egl_pixel_format(EGLDisplay, EGLConfig,
491+ EGLint const*) const override
492 {
493 return mir_pixel_format_invalid;
494 }
495
496=== modified file 'tests/unit-tests/client/test_mir_connection.cpp'
497--- tests/unit-tests/client/test_mir_connection.cpp 2015-07-29 01:39:52 +0000
498+++ tests/unit-tests/client/test_mir_connection.cpp 2015-08-03 08:59:59 +0000
499@@ -134,8 +134,8 @@
500 MOCK_METHOD0(create_buffer_factory, std::shared_ptr<mcl::ClientBufferFactory>());
501 MOCK_METHOD1(create_egl_native_window, std::shared_ptr<EGLNativeWindowType>(mcl::EGLNativeSurface*));
502 MOCK_METHOD0(create_egl_native_display, std::shared_ptr<EGLNativeDisplayType>());
503- MOCK_CONST_METHOD2(get_egl_pixel_format,
504- MirPixelFormat(EGLDisplay, EGLConfig));
505+ MOCK_CONST_METHOD3(get_egl_pixel_format,
506+ MirPixelFormat(EGLDisplay, EGLConfig, EGLint const*));
507
508 mcl::ClientContext* client_context = nullptr;
509 };

Subscribers

People subscribed via source and target branches