mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-10 09:26:10 +00:00
tests/flip_test: check -EBUSY and -EINVAL behaviour
We want -EBUSY for a pending flip and -EINVAL if the pipe is off (either dpms off or completely off). With the small exception that someone thought it would be funny to return -EBUSY when the crtc is fully off.
This commit is contained in:
parent
1422c22e89
commit
dc5d76e2bf
@ -46,6 +46,8 @@
|
||||
#define TEST_PAN (1 << 2)
|
||||
#define TEST_MODESET (1 << 3)
|
||||
#define TEST_CHECK_TS (1 << 4)
|
||||
#define TEST_EBUSY (1 << 5)
|
||||
#define TEST_EINVAL (1 << 6)
|
||||
|
||||
drmModeRes *resources;
|
||||
int drm_fd;
|
||||
@ -171,6 +173,8 @@ static void page_flip_handler(int fd, unsigned int frame, unsigned int sec,
|
||||
unsigned int new_fb_id;
|
||||
struct timeval now, diff, pageflip_ts;
|
||||
double usec_interflip;
|
||||
/* for funny reasons page_flip returns -EBUSY on disabled crtcs ... */
|
||||
int expected_einval = o->flags & TEST_MODESET ? -EBUSY : -EINVAL;
|
||||
|
||||
pageflip_ts.tv_sec = sec;
|
||||
pageflip_ts.tv_usec = usec;
|
||||
@ -187,6 +191,9 @@ static void page_flip_handler(int fd, unsigned int frame, unsigned int sec,
|
||||
|
||||
if (!timercmp(&o->last_flip_received, &pageflip_ts, <)) {
|
||||
fprintf(stderr, "pageflip ts before the pageflip was issued!\n");
|
||||
timersub(&pageflip_ts, &o->last_flip_received, &diff);
|
||||
fprintf(stderr, "timerdiff %is, %ius\n",
|
||||
(int) diff.tv_sec, (int) diff.tv_usec);
|
||||
exit(6);
|
||||
}
|
||||
|
||||
@ -203,15 +210,17 @@ static void page_flip_handler(int fd, unsigned int frame, unsigned int sec,
|
||||
}
|
||||
}
|
||||
|
||||
o->count++;
|
||||
if (o->flags & TEST_WITH_DUMMY_LOAD)
|
||||
emit_dummy_load(o);
|
||||
|
||||
|
||||
o->current_fb_id = !o->current_fb_id;
|
||||
new_fb_id = o->fb_ids[o->current_fb_id];
|
||||
|
||||
if (o->flags & TEST_WITH_DUMMY_LOAD)
|
||||
emit_dummy_load(o);
|
||||
if (o->flags & TEST_EINVAL && o->count > 1)
|
||||
assert(drmModePageFlip(drm_fd, o->crtc, new_fb_id,
|
||||
DRM_MODE_PAGE_FLIP_EVENT, o) == expected_einval);
|
||||
|
||||
printf("."); fflush(stdout);
|
||||
if (o->flags & TEST_MODESET) {
|
||||
if (drmModeSetCrtc(drm_fd, o->crtc,
|
||||
o->fb_ids[o->current_fb_id],
|
||||
@ -226,9 +235,16 @@ static void page_flip_handler(int fd, unsigned int frame, unsigned int sec,
|
||||
if (o->flags & TEST_DPMS)
|
||||
do_or_die(set_dpms(o, DRM_MODE_DPMS_ON));
|
||||
|
||||
o->count++;
|
||||
printf("."); fflush(stdout);
|
||||
|
||||
do_or_die(drmModePageFlip(drm_fd, o->crtc, new_fb_id,
|
||||
DRM_MODE_PAGE_FLIP_EVENT, o));
|
||||
|
||||
if (o->flags & TEST_EBUSY)
|
||||
assert(drmModePageFlip(drm_fd, o->crtc, new_fb_id,
|
||||
DRM_MODE_PAGE_FLIP_EVENT, o) == -EBUSY);
|
||||
|
||||
if (o->flags & TEST_DPMS)
|
||||
do_or_die(set_dpms(o, DRM_MODE_DPMS_OFF));
|
||||
|
||||
@ -243,6 +259,10 @@ static void page_flip_handler(int fd, unsigned int frame, unsigned int sec,
|
||||
}
|
||||
}
|
||||
|
||||
if (o->flags & TEST_EINVAL)
|
||||
assert(drmModePageFlip(drm_fd, o->crtc, new_fb_id,
|
||||
DRM_MODE_PAGE_FLIP_EVENT, o) == expected_einval);
|
||||
|
||||
o->last_flip_received = now;
|
||||
o->last_flip_ts = pageflip_ts;
|
||||
}
|
||||
@ -541,12 +561,12 @@ int main(int argc, char **argv)
|
||||
int flags;
|
||||
const char *name;
|
||||
} tests[] = {
|
||||
{ 15, TEST_CHECK_TS , "plain flip" },
|
||||
{ 30, TEST_DPMS, "flip vs dpms" },
|
||||
{ 15, TEST_CHECK_TS | TEST_EBUSY , "plain flip" },
|
||||
{ 30, TEST_DPMS | TEST_EINVAL, "flip vs dpms" },
|
||||
{ 30, TEST_DPMS | TEST_WITH_DUMMY_LOAD, "delayed flip vs. dpms" },
|
||||
{ 5, TEST_PAN, "flip vs panning" },
|
||||
{ 30, TEST_PAN | TEST_WITH_DUMMY_LOAD, "delayed flip vs panning" },
|
||||
{ 30, TEST_MODESET, "flip vs modeset" },
|
||||
{ 30, TEST_MODESET | TEST_EINVAL, "flip vs modeset" },
|
||||
{ 30, TEST_MODESET | TEST_WITH_DUMMY_LOAD, "delayed flip vs modeset" },
|
||||
};
|
||||
int i;
|
||||
|
Loading…
x
Reference in New Issue
Block a user