[PATCH 9/9] presentation-shm: Allow setting of delay before surface.commit
Mario Kleiner
mario.kleiner.de at gmail.com
Sun May 3 22:47:09 PDT 2015
A new optional parameter "-d msecs" allows to specify a
delay before the surface attach/damage/commit to shift
the point in time when a surface update is committed.
This allows to test how different client timings interact
with the compositors repaint timing.
Suggested by Pekka Paalanen.
Signed-off-by: Mario Kleiner <mario.kleiner.de at gmail.com>
---
clients/presentation-shm.c | 24 ++++++++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/clients/presentation-shm.c b/clients/presentation-shm.c
index e791b2b..e45b623 100644
--- a/clients/presentation-shm.c
+++ b/clients/presentation-shm.c
@@ -101,6 +101,7 @@ struct window {
int num_buffers;
int next;
int refresh_nsec;
+ int commit_delay_msecs;
struct wl_callback *callback;
struct wl_list feedback_list;
@@ -201,19 +202,21 @@ static const struct wl_shell_surface_listener shell_surface_listener = {
static struct window *
create_window(struct display *display, int width, int height,
- enum run_mode mode)
+ enum run_mode mode, int commit_delay_msecs)
{
struct window *window;
char title[128];
int ret;
snprintf(title, sizeof(title),
- "presentation-shm: %s", run_mode_name[mode]);
+ "presentation-shm: %s [Delay %i msecs]", run_mode_name[mode],
+ commit_delay_msecs);
window = calloc(1, sizeof *window);
if (!window)
return NULL;
+ window->commit_delay_msecs = commit_delay_msecs;
window->mode = mode;
window->callback = NULL;
wl_list_init(&window->feedback_list);
@@ -490,6 +493,13 @@ window_create_feedback(struct window *window, uint32_t frame_stamp)
&feedback_listener, feedback);
feedback->frame_no = seq;
+
+ /* Delay by given msecs to test effects of compositor scheduling */
+ if (window->commit_delay_msecs > 0) {
+ struct timespec delay = { 0, window->commit_delay_msecs * 1e6 };
+ clock_nanosleep(window->display->clk_id, 0, &delay, NULL);
+ }
+
clock_gettime(window->display->clk_id, &feedback->commit);
feedback->frame_stamp = frame_stamp;
feedback->target = feedback->commit;
@@ -810,7 +820,8 @@ usage(const char *prog, int exit_code)
" -f\trun in feedback mode (default)\n"
" -i\trun in feedback-idle mode; sleep 1s between frames\n"
" -p\trun in low-latency presentation mode\n"
- "and 'options' may include\n",
+ "and 'options' may include\n"
+ " -d msecs\tdelay by given milliseconds before commit\n\n",
prog);
fprintf(stderr, "Printed timing statistics, depending on mode:\n"
@@ -835,6 +846,7 @@ main(int argc, char **argv)
int ret = 0;
enum run_mode mode = RUN_MODE_FEEDBACK;
int i;
+ int commit_delay_msecs = 0;
for (i = 1; i < argc; i++) {
if (strcmp("-f", argv[i]) == 0)
@@ -843,12 +855,16 @@ main(int argc, char **argv)
mode = RUN_MODE_FEEDBACK_IDLE;
else if (strcmp("-p", argv[i]) == 0)
mode = RUN_MODE_PRESENT;
+ else if ((strcmp("-d", argv[i]) == 0) && (i + 1 < argc)) {
+ i++;
+ commit_delay_msecs = atoi(argv[i]);
+ }
else
usage(argv[0], EXIT_FAILURE);
}
display = create_display();
- window = create_window(display, 250, 250, mode);
+ window = create_window(display, 250, 250, mode, commit_delay_msecs);
if (!window)
return 1;
--
1.9.1
More information about the wayland-devel
mailing list