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
=== modified file 'examples/eglapp.c'
--- examples/eglapp.c 2016-10-21 07:53:23 +0000
+++ examples/eglapp.c 2016-10-27 08:46:44 +0000
@@ -37,6 +37,7 @@
37static EGLDisplay egldisplay;37static EGLDisplay egldisplay;
38static EGLSurface eglsurface;38static EGLSurface eglsurface;
39static volatile sig_atomic_t running = 0;39static volatile sig_atomic_t running = 0;
40static double refresh_rate = 0.0;
4041
41#define CHECK(_cond, _err) \42#define CHECK(_cond, _err) \
42 if (!(_cond)) \43 if (!(_cond)) \
@@ -135,12 +136,19 @@
135 unsigned ff = mir_surface_output_event_get_form_factor(out);136 unsigned ff = mir_surface_output_event_get_form_factor(out);
136 char const* form_factor = (ff < 6) ? form_factor_name[ff] : "out-of-range";137 char const* form_factor = (ff < 6) ? form_factor_name[ff] : "out-of-range";
137138
139 refresh_rate = mir_surface_output_event_get_refresh_rate(out);
140
138 printf("Surface is on output %u: %d DPI, scale %.1fx, %s form factor, %.2fHz\n",141 printf("Surface is on output %u: %d DPI, scale %.1fx, %s form factor, %.2fHz\n",
139 mir_surface_output_event_get_output_id(out),142 mir_surface_output_event_get_output_id(out),
140 mir_surface_output_event_get_dpi(out),143 mir_surface_output_event_get_dpi(out),
141 mir_surface_output_event_get_scale(out),144 mir_surface_output_event_get_scale(out),
142 form_factor,145 form_factor,
143 mir_surface_output_event_get_refresh_rate(out));146 refresh_rate);
147}
148
149double mir_eglapp_display_hz(void)
150{
151 return refresh_rate;
144}152}
145153
146void mir_eglapp_handle_event(MirSurface* surface, MirEvent const* ev, void* unused)154void mir_eglapp_handle_event(MirSurface* surface, MirEvent const* ev, void* unused)
147155
=== modified file 'examples/eglapp.h'
--- examples/eglapp.h 2016-10-21 07:53:23 +0000
+++ examples/eglapp.h 2016-10-27 08:46:44 +0000
@@ -47,6 +47,7 @@
47mir_eglapp_bool mir_eglapp_running(void);47mir_eglapp_bool mir_eglapp_running(void);
48void mir_eglapp_cleanup(void);48void mir_eglapp_cleanup(void);
49void mir_eglapp_handle_event(struct MirSurface* surface, struct MirEvent const* ev, void* unused);49void mir_eglapp_handle_event(struct MirSurface* surface, struct MirEvent const* ev, void* unused);
50double mir_eglapp_display_hz(void);
5051
51struct MirConnection* mir_eglapp_native_connection();52struct MirConnection* mir_eglapp_native_connection();
52struct MirSurface* mir_eglapp_native_surface();53struct MirSurface* mir_eglapp_native_surface();
5354
=== modified file 'src/utils/vanity.c'
--- src/utils/vanity.c 2016-10-21 07:53:23 +0000
+++ src/utils/vanity.c 2016-10-27 08:46:44 +0000
@@ -74,6 +74,7 @@
74 bool resized;74 bool resized;
75 Camera* camera;75 Camera* camera;
76 Time last_change_time;76 Time last_change_time;
77 Time last_change_time_error;
77 Time last_change_seen_time;78 Time last_change_seen_time;
78 Time display_frame_time;79 Time display_frame_time;
79 Buffer const* preview;80 Buffer const* preview;
@@ -492,6 +493,11 @@
492 )493 )
493 {494 {
494 Time latency = acquire_time - state->last_change_time;495 Time latency = acquire_time - state->last_change_time;
496
497 // Correct for swap interval zero dropping buffers the camera
498 // will never see:
499 latency -= state->last_change_time_error;
500
495 last_seen_value = see;501 last_seen_value = see;
496 state->last_change_seen_time = acquire_time;502 state->last_change_seen_time = acquire_time;
497 state->expected_direction = 0;503 state->expected_direction = 0;
@@ -713,6 +719,7 @@
713 0,719 0,
714 0,720 0,
715 0,721 0,
722 0,
716 NULL,723 NULL,
717 0,724 0,
718 false725 false
@@ -833,9 +840,26 @@
833 }840 }
834 mir_eglapp_swap_buffers();841 mir_eglapp_swap_buffers();
835842
843 double display_hz = mir_eglapp_display_hz();
836 Time swap_time = now();844 Time swap_time = now();
845 Time measured_swap_interval = swap_time - last_swap_time;
837 pthread_mutex_lock(&state.mutex);846 pthread_mutex_lock(&state.mutex);
838 state.display_frame_time = swap_time - last_swap_time;847 if (display_hz > 0.0) // More steady and works with all intervals:
848 {
849 state.display_frame_time = one_second / display_hz;
850
851 // Correct last_change_time for framedropping mode(s) where
852 // we actually render many frames per display frame:
853 if (measured_swap_interval < state.display_frame_time)
854 state.last_change_time_error = state.display_frame_time -
855 measured_swap_interval;
856 else
857 state.last_change_time_error = 0;
858 }
859 else
860 {
861 state.display_frame_time = measured_swap_interval;
862 }
839 pthread_mutex_unlock(&state.mutex);863 pthread_mutex_unlock(&state.mutex);
840 last_swap_time = swap_time;864 last_swap_time = swap_time;
841 }865 }

Subscribers

People subscribed via source and target branches