summaryrefslogtreecommitdiff
path: root/tests/modetest/modetest.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/modetest/modetest.c')
-rw-r--r--tests/modetest/modetest.c92
1 files changed, 48 insertions, 44 deletions
diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
index 6eed564e..a73dab1d 100644
--- a/tests/modetest/modetest.c
+++ b/tests/modetest/modetest.c
@@ -272,8 +272,9 @@ struct connector {
drmModeModeInfo *mode;
drmModeEncoder *encoder;
int crtc;
- unsigned int fb_id;
+ unsigned int fb_id[2], current_fb_id;
struct timeval start;
+
int swap_count;
};
@@ -462,8 +463,8 @@ create_test_buffer(drm_intel_bufmgr *bufmgr,
#endif
static int
-create_black_buffer(drm_intel_bufmgr *bufmgr,
- int width, int height, int *stride_out, drm_intel_bo **bo_out)
+create_grey_buffer(drm_intel_bufmgr *bufmgr,
+ int width, int height, int *stride_out, drm_intel_bo **bo_out)
{
drm_intel_bo *bo;
unsigned int *fb_ptr;
@@ -488,7 +489,7 @@ create_black_buffer(drm_intel_bufmgr *bufmgr,
return -1;
}
- memset(bo->virtual, 0, size);
+ memset(bo->virtual, 0x77, size);
drm_intel_gem_bo_unmap_gtt(bo);
*bo_out = bo;
@@ -497,6 +498,39 @@ create_black_buffer(drm_intel_bufmgr *bufmgr,
return 0;
}
+void
+page_flip_handler(int fd, unsigned int frame,
+ unsigned int sec, unsigned int usec, void *data)
+{
+ struct connector *c;
+ unsigned int new_fb_id;
+ int len, ms;
+ struct drm_event_page_flip event;
+ struct timeval end;
+ double t;
+
+ fprintf(stderr, "flip done, frame %d, time %d.%03d\n",
+ frame, sec % 100, usec / 1000);
+
+ c = data;
+ if (c->current_fb_id == c->fb_id[0])
+ new_fb_id = c->fb_id[1];
+ else
+ new_fb_id = c->fb_id[0];
+
+ drmModePageFlip(fd, c->crtc, new_fb_id, c);
+ c->current_fb_id = new_fb_id;
+ c->swap_count++;
+ if (c->swap_count == 60) {
+ gettimeofday(&end, NULL);
+ t = end.tv_sec + end.tv_usec * 1e-6 -
+ (c->start.tv_sec + c->start.tv_usec * 1e-6);
+ fprintf(stderr, "freq: %.02fHz\n", c->swap_count / t);
+ c->swap_count = 0;
+ c->start = end;
+ }
+}
+
static void
set_mode(struct connector *c, int count, int page_flip)
{
@@ -507,6 +541,7 @@ set_mode(struct connector *c, int count, int page_flip)
drm_intel_bo *bo, *other_bo;
unsigned int fb_id, other_fb_id;
int i, j, ret, width, height, x, stride;
+ drmEventContext evctx;
width = 0;
height = 0;
@@ -546,7 +581,6 @@ set_mode(struct connector *c, int count, int page_flip)
ret = drmModeSetCrtc(fd, c[i].crtc, fb_id, x, 0,
&c[i].id, 1, c[i].mode);
x += c[i].mode->hdisplay;
- c[i].fb_id = fb_id;
if (ret) {
fprintf(stderr, "failed to set mode: %s\n", strerror(errno));
@@ -557,7 +591,7 @@ set_mode(struct connector *c, int count, int page_flip)
if (!page_flip)
return;
- if (create_black_buffer(bufmgr, width, height, &stride, &other_bo))
+ if (create_grey_buffer(bufmgr, width, height, &stride, &other_bo))
return;
ret = drmModeAddFB(fd, width, height, 32, 32, stride, other_bo->handle,
@@ -574,13 +608,16 @@ set_mode(struct connector *c, int count, int page_flip)
drmModePageFlip(fd, c[i].crtc, other_fb_id, &c[i]);
gettimeofday(&c[i].start, NULL);
c[i].swap_count = 0;
+ c[i].fb_id[0] = fb_id;
+ c[i].fb_id[1] = other_fb_id;
+ c[i].current_fb_id = fb_id;
}
+ memset(&evctx, 0, sizeof evctx);
+ evctx.version = DRM_EVENT_CONTEXT_VERSION;
+ evctx.page_flip_handler = page_flip_handler;
+
while (1) {
- struct connector *c;
- unsigned int new_fb_id;
- int len, ms;
- struct drm_event_page_flip event;
struct pollfd pfd[2];
pfd[0].fd = 0;
@@ -596,40 +633,7 @@ set_mode(struct connector *c, int count, int page_flip)
if (pfd[0].revents)
break;
- len = read(fd, &event, sizeof event);
-
- if (len < sizeof event)
- break;
- if (event.base.type != DRM_EVENT_MODE_PAGE_FLIP) {
- fprintf(stderr,
- "got unhandled event %d\n", event.base.type);
- continue;
- }
-
- fprintf(stderr, "flip done, frame %d, time %d.%03d\n",
- event.frame, event.tv_sec % 100,
- event.tv_usec / 1000);
-
- c = (struct connector *) (long) event.base.user_data;
- if (c->fb_id == fb_id)
- new_fb_id = other_fb_id;
- else
- new_fb_id = fb_id;
-
- drmModePageFlip(fd, c->crtc, new_fb_id, c);
- c->fb_id = new_fb_id;
- c->swap_count++;
- if (c->swap_count == 60) {
- struct timeval end;
- double t;
-
- gettimeofday(&end, NULL);
- t = end.tv_sec + end.tv_usec * 1e-6 -
- (c->start.tv_sec + c->start.tv_usec * 1e-6);
- fprintf(stderr, "freq: %.02fHz\n", c->swap_count / t);
- c->swap_count = 0;
- c->start = end;
- }
+ drmHandleEvent(fd, &evctx);
}
}