diff options
author | Rob Clark <robdclark@chromium.org> | 2020-03-07 09:34:40 -0800 |
---|---|---|
committer | Rob Clark <robdclark@chromium.org> | 2020-03-07 09:34:40 -0800 |
commit | 38986c1401b378086b8951e52c65e648cdc85e1f (patch) | |
tree | cf77b21ef526ed044d6fabccd3edc8db85ad9474 | |
parent | 301a556b8ece755bbf4f8ec3657e66e0a1dd327f (diff) | |
download | kmscube-38986c1401b378086b8951e52c65e648cdc85e1f.tar.gz |
kmscube: add option to run for specified # of frames
-rw-r--r-- | drm-atomic.c | 7 | ||||
-rw-r--r-- | drm-common.c | 4 | ||||
-rw-r--r-- | drm-common.h | 9 | ||||
-rw-r--r-- | drm-legacy.c | 7 | ||||
-rw-r--r-- | kmscube.c | 12 | ||||
-rw-r--r-- | texturator.c | 2 |
6 files changed, 27 insertions, 14 deletions
diff --git a/drm-atomic.c b/drm-atomic.c index d84dcfc..6cde343 100644 --- a/drm-atomic.c +++ b/drm-atomic.c @@ -195,7 +195,7 @@ static int atomic_run(const struct gbm *gbm, const struct egl *egl) start_time = report_time = get_time_ns(); - while (1) { + while (i < drm.count) { struct gbm_bo *next_bo; EGLSyncKHR gpu_fence = NULL; /* out-fence from gpu, in-fence to kms */ EGLSyncKHR kms_fence = NULL; /* in-fence to gpu, out-fence from kms */ @@ -369,12 +369,13 @@ static int get_plane_id(void) return ret; } -const struct drm * init_drm_atomic(const char *device, const char *mode_str, unsigned int vrefresh) +const struct drm * init_drm_atomic(const char *device, const char *mode_str, + unsigned int vrefresh, unsigned int count) { uint32_t plane_id; int ret; - ret = init_drm(&drm, device, mode_str, vrefresh); + ret = init_drm(&drm, device, mode_str, vrefresh, count); if (ret) return NULL; diff --git a/drm-common.c b/drm-common.c index b9d61c1..50a286d 100644 --- a/drm-common.c +++ b/drm-common.c @@ -208,7 +208,8 @@ static int find_drm_device(drmModeRes **resources) return fd; } -int init_drm(struct drm *drm, const char *device, const char *mode_str, unsigned int vrefresh) +int init_drm(struct drm *drm, const char *device, const char *mode_str, + unsigned int vrefresh, unsigned int count) { drmModeRes *resources; drmModeConnector *connector = NULL; @@ -323,6 +324,7 @@ int init_drm(struct drm *drm, const char *device, const char *mode_str, unsigned drmModeFreeResources(resources); drm->connector_id = connector->connector_id; + drm->count = count; return 0; } diff --git a/drm-common.h b/drm-common.h index c4eb886..32648b0 100644 --- a/drm-common.h +++ b/drm-common.h @@ -63,6 +63,9 @@ struct drm { uint32_t crtc_id; uint32_t connector_id; + /* number of frames to run for: */ + unsigned int count; + int (*run)(const struct gbm *gbm, const struct egl *egl); }; @@ -73,8 +76,8 @@ struct drm_fb { struct drm_fb * drm_fb_get_from_bo(struct gbm_bo *bo); -int init_drm(struct drm *drm, const char *device, const char *mode_str, unsigned int vrefresh); -const struct drm * init_drm_legacy(const char *device, const char *mode_str, unsigned int vrefresh); -const struct drm * init_drm_atomic(const char *device, const char *mode_str, unsigned int vrefresh); +int init_drm(struct drm *drm, const char *device, const char *mode_str, unsigned int vrefresh, unsigned int count); +const struct drm * init_drm_legacy(const char *device, const char *mode_str, unsigned int vrefresh, unsigned int count); +const struct drm * init_drm_atomic(const char *device, const char *mode_str, unsigned int vrefresh, unsigned int count); #endif /* _DRM_COMMON_H */ diff --git a/drm-legacy.c b/drm-legacy.c index e136c8a..9f37bc9 100644 --- a/drm-legacy.c +++ b/drm-legacy.c @@ -72,7 +72,7 @@ static int legacy_run(const struct gbm *gbm, const struct egl *egl) start_time = report_time = get_time_ns(); - while (1) { + while (i < drm.count) { struct gbm_bo *next_bo; int waiting_for_flip = 1; @@ -142,11 +142,12 @@ static int legacy_run(const struct gbm *gbm, const struct egl *egl) return 0; } -const struct drm * init_drm_legacy(const char *device, const char *mode_str, unsigned int vrefresh) +const struct drm * init_drm_legacy(const char *device, const char *mode_str, + unsigned int vrefresh, unsigned int count) { int ret; - ret = init_drm(&drm, device, mode_str, vrefresh); + ret = init_drm(&drm, device, mode_str, vrefresh, count); if (ret) return NULL; @@ -41,10 +41,11 @@ static const struct egl *egl; static const struct gbm *gbm; static const struct drm *drm; -static const char *shortopts = "AD:f:M:m:S:s:V:v:"; +static const char *shortopts = "Ac:D:f:M:m:S:s:V:v:"; static const struct option longopts[] = { {"atomic", no_argument, 0, 'A'}, + {"count", required_argument, 0, 'c'}, {"device", required_argument, 0, 'D'}, {"format", required_argument, 0, 'f'}, {"mode", required_argument, 0, 'M'}, @@ -61,6 +62,7 @@ static void usage(const char *name) "\n" "options:\n" " -A, --atomic use atomic modesetting and fencing\n" + " -c, --count run for the specified number of frames\n" " -D, --device=DEVICE use the given device\n" " -f, --format=FOURCC framebuffer format\n" " -M, --mode=MODE specify mode, one of:\n" @@ -92,6 +94,7 @@ int main(int argc, char *argv[]) int opt; unsigned int len; unsigned int vrefresh = 0; + unsigned int count = ~0; #ifdef HAVE_GST gst_init(&argc, &argv); @@ -103,6 +106,9 @@ int main(int argc, char *argv[]) case 'A': atomic = 1; break; + case 'c': + count = strtoul(optarg, NULL, 0); + break; case 'D': device = optarg; break; @@ -170,9 +176,9 @@ int main(int argc, char *argv[]) } if (atomic) - drm = init_drm_atomic(device, mode_str, vrefresh); + drm = init_drm_atomic(device, mode_str, vrefresh, count); else - drm = init_drm_legacy(device, mode_str, vrefresh); + drm = init_drm_legacy(device, mode_str, vrefresh, count); if (!drm) { printf("failed to initialize %s DRM\n", atomic ? "atomic" : "legacy"); return -1; diff --git a/texturator.c b/texturator.c index ba639e7..2675244 100644 --- a/texturator.c +++ b/texturator.c @@ -948,7 +948,7 @@ int main(int argc, char *argv[]) print_summary(); /* no real need for atomic here: */ - drm = init_drm_legacy(device, mode_str, vrefresh); + drm = init_drm_legacy(device, mode_str, vrefresh, ~0); if (!drm) { printf("failed to initialize DRM\n"); return -1; |