Mir

Merge lp:~vanvugt/mir/interval-0-is-not-an-error into lp:mir

Proposed by Daniel van Vugt
Status: Merged
Approved by: Daniel van Vugt
Approved revision: no longer in the source branch.
Merged at revision: 3796
Proposed branch: lp:~vanvugt/mir/interval-0-is-not-an-error
Merge into: lp:mir
Diff against target: 104 lines (+35/-2)
3 files modified
examples/eglapp.c (+9/-1)
examples/eglapp.h (+1/-0)
src/utils/vanity.c (+25/-1)
To merge this branch: bzr merge lp:~vanvugt/mir/interval-0-is-not-an-error
Reviewer Review Type Date Requested Status
Chris Halse Rogers Approve
Mir CI Bot continuous-integration Approve
Review via email: mp+309435@code.launchpad.net

Commit message

vanity: Add proper support for swap interval 0 (mirvanity -n)

Previously it would keep printing an error message that "your camera is
too slow" and also underestimate "expected range", but otherwise worked.

This change corrects all of that. The camera wasn't too slow, just that
the display is so fast with framedropping that the camera seems slow.
But it's still the same physical display so is only appropriate to get
the correct refresh rate from elsewhere. This also corrects the
"expected range" number.

I had to modify eglapp because I found there's no way for a user of
eglapp to get a SurfaceOutput event. The event has already arrived before
the app itself has initialized, so can only be acquired by the toolkit.

Bonus: This fix now lets us observe and measure the improvement provided by predictive bypass on the server (--composite-delay).

Description of the change

.

To post a comment you must log in.
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3790
https://mir-jenkins.ubuntu.com/job/mir-ci/2062/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/2649
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/2712
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2704
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2704
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2704
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2678
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2678/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2678
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2678/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2678
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2678/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/2678
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/2678/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2678
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2678/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2678
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2678/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2062/rebuild

review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3791
https://mir-jenkins.ubuntu.com/job/mir-ci/2064/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/2651/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/2714
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2706
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2706
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2706
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2680
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2680/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2680/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2680
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2680/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/2680
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/2680/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2680
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2680/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2680
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2680/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2064/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3792
https://mir-jenkins.ubuntu.com/job/mir-ci/2066/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/2653
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/2716
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/2708
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/2708
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/2708
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2682
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/2682/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2682
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/2682/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2682
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/2682/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/2682
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/2682/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2682
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/2682/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2682
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/2682/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2066/rebuild

review: Approve (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

Seems OK.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'examples/eglapp.c'
2--- examples/eglapp.c 2016-10-21 07:53:23 +0000
3+++ examples/eglapp.c 2016-10-27 08:46:44 +0000
4@@ -37,6 +37,7 @@
5 static EGLDisplay egldisplay;
6 static EGLSurface eglsurface;
7 static volatile sig_atomic_t running = 0;
8+static double refresh_rate = 0.0;
9
10 #define CHECK(_cond, _err) \
11 if (!(_cond)) \
12@@ -135,12 +136,19 @@
13 unsigned ff = mir_surface_output_event_get_form_factor(out);
14 char const* form_factor = (ff < 6) ? form_factor_name[ff] : "out-of-range";
15
16+ refresh_rate = mir_surface_output_event_get_refresh_rate(out);
17+
18 printf("Surface is on output %u: %d DPI, scale %.1fx, %s form factor, %.2fHz\n",
19 mir_surface_output_event_get_output_id(out),
20 mir_surface_output_event_get_dpi(out),
21 mir_surface_output_event_get_scale(out),
22 form_factor,
23- mir_surface_output_event_get_refresh_rate(out));
24+ refresh_rate);
25+}
26+
27+double mir_eglapp_display_hz(void)
28+{
29+ return refresh_rate;
30 }
31
32 void mir_eglapp_handle_event(MirSurface* surface, MirEvent const* ev, void* unused)
33
34=== modified file 'examples/eglapp.h'
35--- examples/eglapp.h 2016-10-21 07:53:23 +0000
36+++ examples/eglapp.h 2016-10-27 08:46:44 +0000
37@@ -47,6 +47,7 @@
38 mir_eglapp_bool mir_eglapp_running(void);
39 void mir_eglapp_cleanup(void);
40 void mir_eglapp_handle_event(struct MirSurface* surface, struct MirEvent const* ev, void* unused);
41+double mir_eglapp_display_hz(void);
42
43 struct MirConnection* mir_eglapp_native_connection();
44 struct MirSurface* mir_eglapp_native_surface();
45
46=== modified file 'src/utils/vanity.c'
47--- src/utils/vanity.c 2016-10-21 07:53:23 +0000
48+++ src/utils/vanity.c 2016-10-27 08:46:44 +0000
49@@ -74,6 +74,7 @@
50 bool resized;
51 Camera* camera;
52 Time last_change_time;
53+ Time last_change_time_error;
54 Time last_change_seen_time;
55 Time display_frame_time;
56 Buffer const* preview;
57@@ -492,6 +493,11 @@
58 )
59 {
60 Time latency = acquire_time - state->last_change_time;
61+
62+ // Correct for swap interval zero dropping buffers the camera
63+ // will never see:
64+ latency -= state->last_change_time_error;
65+
66 last_seen_value = see;
67 state->last_change_seen_time = acquire_time;
68 state->expected_direction = 0;
69@@ -713,6 +719,7 @@
70 0,
71 0,
72 0,
73+ 0,
74 NULL,
75 0,
76 false
77@@ -833,9 +840,26 @@
78 }
79 mir_eglapp_swap_buffers();
80
81+ double display_hz = mir_eglapp_display_hz();
82 Time swap_time = now();
83+ Time measured_swap_interval = swap_time - last_swap_time;
84 pthread_mutex_lock(&state.mutex);
85- state.display_frame_time = swap_time - last_swap_time;
86+ if (display_hz > 0.0) // More steady and works with all intervals:
87+ {
88+ state.display_frame_time = one_second / display_hz;
89+
90+ // Correct last_change_time for framedropping mode(s) where
91+ // we actually render many frames per display frame:
92+ if (measured_swap_interval < state.display_frame_time)
93+ state.last_change_time_error = state.display_frame_time -
94+ measured_swap_interval;
95+ else
96+ state.last_change_time_error = 0;
97+ }
98+ else
99+ {
100+ state.display_frame_time = measured_swap_interval;
101+ }
102 pthread_mutex_unlock(&state.mutex);
103 last_swap_time = swap_time;
104 }

Subscribers

People subscribed via source and target branches