summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robdclark@chromium.org>2020-03-07 09:34:40 -0800
committerRob Clark <robdclark@chromium.org>2020-03-07 09:34:40 -0800
commit38986c1401b378086b8951e52c65e648cdc85e1f (patch)
treecf77b21ef526ed044d6fabccd3edc8db85ad9474
parent301a556b8ece755bbf4f8ec3657e66e0a1dd327f (diff)
kmscube: add option to run for specified # of frames
-rw-r--r--drm-atomic.c7
-rw-r--r--drm-common.c4
-rw-r--r--drm-common.h9
-rw-r--r--drm-legacy.c7
-rw-r--r--kmscube.c12
-rw-r--r--texturator.c2
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;
diff --git a/kmscube.c b/kmscube.c
index b2d959f..9244d15 100644
--- a/kmscube.c
+++ b/kmscube.c
@@ -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;