Merge lp:~afrantzis/glmark2/update-mir into lp:glmark2/2011.11

Proposed by Alexandros Frantzis
Status: Merged
Merged at revision: 285
Proposed branch: lp:~afrantzis/glmark2/update-mir
Merge into: lp:glmark2/2011.11
Diff against target: 236 lines (+129/-38)
2 files modified
src/native-state-mir.cpp (+128/-37)
src/native-state-mir.h (+1/-1)
To merge this branch: bzr merge lp:~afrantzis/glmark2/update-mir
Reviewer Review Type Date Requested Status
Jesse Barker Approve
Review via email: mp+191824@code.launchpad.net

Commit message

NativeStateMir: Update for newest Mir client API

Description of the change

NativeStateMir: Update for newest Mir client API

To post a comment you must log in.
Revision history for this message
Jesse Barker (jesse-barker) wrote :

As long as you're happy with the first surface format that isn't 888[8] when you can't find an 888[8] format (I can't speak to ordering of such things for Mir), it looks fine to me.

cheers,
Jesse

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/native-state-mir.cpp'
2--- src/native-state-mir.cpp 2013-03-05 17:37:01 +0000
3+++ src/native-state-mir.cpp 2013-10-18 15:04:27 +0000
4@@ -29,25 +29,89 @@
5 namespace
6 {
7
8-void
9-connected_callback(MirConnection *connection, void *client_context)
10-{
11- MirConnection **con = static_cast<MirConnection**>(client_context);
12- *con = connection;
13-}
14-
15-void
16-surface_created_callback(MirSurface *surface, void *client_context)
17-{
18- MirSurface **surf = static_cast<MirSurface**>(client_context);
19- *surf = surface;
20-}
21-
22-void
23-null_surface_callback(MirSurface * /*obj*/, void * /*client_context*/)
24-{
25-}
26-
27+const MirDisplayOutput*
28+find_active_output(const MirDisplayConfiguration* conf)
29+{
30+ const MirDisplayOutput *output = NULL;
31+
32+ for (uint32_t d = 0; d < conf->num_outputs; d++)
33+ {
34+ const MirDisplayOutput* out = &conf->outputs[d];
35+
36+ if (out->used && out->connected &&
37+ out->num_modes && out->current_mode < out->num_modes)
38+ {
39+ output = out;
40+ break;
41+ }
42+ }
43+
44+ return output;
45+}
46+
47+MirPixelFormat
48+find_best_surface_format(MirConnection* connection)
49+{
50+ static const unsigned int formats_size = 10;
51+ MirPixelFormat formats[formats_size];
52+ unsigned int num_valid_formats = 0;
53+ MirPixelFormat best_format = mir_pixel_format_invalid;
54+
55+ mir_connection_get_available_surface_formats(connection,
56+ formats,
57+ formats_size,
58+ &num_valid_formats);
59+
60+ /*
61+ * Surface formats come sorted in largest active bits order.
62+ * Prefer opaque formats over formats with alpha, and largest
63+ * formats over smaller ones.
64+ */
65+ for (unsigned int i = 0; i < num_valid_formats; i++)
66+ {
67+ if (formats[i] == mir_pixel_format_xbgr_8888 ||
68+ formats[i] == mir_pixel_format_xrgb_8888 ||
69+ formats[i] == mir_pixel_format_bgr_888)
70+ {
71+ best_format = formats[i];
72+ break;
73+ }
74+ else if (best_format == mir_pixel_format_invalid)
75+ {
76+ best_format = formats[i];
77+ }
78+ }
79+
80+ return best_format;
81+}
82+
83+class DisplayConfiguration
84+{
85+public:
86+ DisplayConfiguration(MirConnection* connection)
87+ : display_config(mir_connection_create_display_config(connection))
88+ {
89+ }
90+
91+ ~DisplayConfiguration()
92+ {
93+ if (display_config)
94+ mir_display_config_destroy(display_config);
95+ }
96+
97+ bool is_valid()
98+ {
99+ return display_config != 0;
100+ }
101+
102+ operator MirDisplayConfiguration*() const
103+ {
104+ return display_config;
105+ }
106+
107+private:
108+ MirDisplayConfiguration* display_config;
109+};
110 }
111
112 volatile sig_atomic_t NativeStateMir::should_quit_(false);
113@@ -55,8 +119,8 @@
114 NativeStateMir::~NativeStateMir()
115 {
116 if (mir_surface_)
117- mir_wait_for(mir_surface_release(mir_surface_, null_surface_callback, 0));
118- if (mir_connection_is_valid(mir_connection_))
119+ mir_surface_release_sync(mir_surface_);
120+ if (mir_connection_)
121 mir_connection_release(mir_connection_);
122 }
123
124@@ -71,11 +135,10 @@
125 sigaction(SIGINT, &sa, NULL);
126 sigaction(SIGTERM, &sa, NULL);
127
128- mir_wait_for(mir_connect("/tmp/mir_socket", "glmark2",
129- connected_callback, &mir_connection_));
130+ mir_connection_ = mir_connect_sync(NULL, "glmark2");
131
132 if (!mir_connection_is_valid(mir_connection_)) {
133- Log::error("Failed to connect to mir\n");
134+ Log::error("Couldn't connect to the Mir display server\n");
135 return false;
136 }
137
138@@ -97,7 +160,8 @@
139 static const char *win_name("glmark2 "GLMARK_VERSION);
140
141 if (!mir_connection_is_valid(mir_connection_)) {
142- Log::error("No connection to mir!\n");
143+ Log::error("Cannot create a Mir surface without a valid connection "
144+ "to the Mir display server!\n");
145 return false;
146 }
147
148@@ -108,7 +172,7 @@
149 (properties_.width != properties.width ||
150 properties_.height != properties.height)))
151 {
152- mir_wait_for(mir_surface_release(mir_surface_, null_surface_callback, 0));
153+ mir_surface_release_sync(mir_surface_);
154 mir_surface_ = 0;
155 }
156 else
157@@ -117,28 +181,55 @@
158 }
159 }
160
161- MirDisplayInfo display_info;
162- mir_connection_get_display_info(mir_connection_, &display_info);
163+ uint32_t output_id = mir_display_output_id_invalid;
164
165 properties_ = properties;
166
167 if (properties_.fullscreen) {
168- properties_.width = display_info.width;
169- properties_.height = display_info.height;
170- }
171+ DisplayConfiguration display_config(mir_connection_);
172+ if (!display_config.is_valid()) {
173+ Log::error("Couldn't get display configuration from the Mir display server!\n");
174+ return false;
175+ }
176+
177+ const MirDisplayOutput* active_output = find_active_output(display_config);
178+ if (active_output == NULL) {
179+ Log::error("Couldn't find an active output in the Mir display server!\n");
180+ return false;
181+ }
182+
183+ const MirDisplayMode* current_mode =
184+ &active_output->modes[active_output->current_mode];
185+
186+ properties_.width = current_mode->horizontal_resolution;
187+ properties_.height = current_mode->vertical_resolution;
188+ output_id = active_output->output_id;
189+
190+ Log::debug("Making Mir surface fullscreen on output %u (%ux%u)\n",
191+ output_id, properties_.width, properties_.height);
192+ }
193+
194+ MirPixelFormat surface_format = find_best_surface_format(mir_connection_);
195+ if (surface_format == mir_pixel_format_invalid) {
196+ Log::error("Couldn't find a pixel format to use for the Mir surface!\n");
197+ return false;
198+ }
199+
200+ Log::debug("Using pixel format %u for the Mir surface\n", surface_format);
201
202 MirSurfaceParameters surface_parameters = {
203 win_name,
204 properties_.width, properties_.height,
205- display_info.supported_pixel_format[0],
206- mir_buffer_usage_hardware
207+ surface_format,
208+ mir_buffer_usage_hardware,
209+ output_id
210 };
211
212- mir_wait_for(mir_surface_create(mir_connection_, &surface_parameters,
213- surface_created_callback, &mir_surface_));
214+ mir_surface_ = mir_connection_create_surface_sync(mir_connection_,
215+ &surface_parameters);
216
217- if (!mir_surface_) {
218- Log::error("Failed to create mir surface!\n");
219+ if (!mir_surface_ || !mir_surface_is_valid(mir_surface_)) {
220+ Log::error("Failed to create Mir surface!\n");
221 return false;
222 }
223
224
225=== modified file 'src/native-state-mir.h'
226--- src/native-state-mir.h 2013-03-05 17:04:09 +0000
227+++ src/native-state-mir.h 2013-10-18 15:04:27 +0000
228@@ -23,7 +23,7 @@
229 #define GLMARK2_NATIVE_STATE_MIR_H_
230
231 #include "native-state.h"
232-#include <mir_client_library.h>
233+#include <mir_toolkit/mir_client_library.h>
234 #include <csignal>
235
236 class NativeStateMir : public NativeState

Subscribers

People subscribed via source and target branches