#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/select.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <time.h> #include <errno.h> #include <xf86drm.h> #include "dev.h" #include "bo.h" #include "modeset.h" static int terminate = 0; static void sigint_handler(int arg) { terminate = 1; } static void page_flip_handler(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data) { } static void incrementor(int *inc, int *val, int increment, int lower, int upper) { if(*inc > 0) *inc = *val + increment >= upper ? -1 : 1; else *inc = *val - increment <= lower ? 1 : -1; *val += *inc * increment; } int main(int argc, char *argv[]) { int ret, i, j, num_test_planes; int x_inc = 1, x = 0, y_inc = 1, y = 0; uint32_t plane_w = 128, plane_h = 128; struct sp_dev *dev; struct sp_plane **plane = NULL; struct sp_crtc *test_crtc; fd_set fds; drmModePropertySetPtr pset; drmEventContext event_context = { .version = DRM_EVENT_CONTEXT_VERSION, .page_flip_handler = page_flip_handler, }; int card = 0, crtc = 0; signal(SIGINT, sigint_handler); parse_arguments(argc, argv, &card, &crtc); dev = create_sp_dev(card); if (!dev) { printf("Failed to create sp_dev\n"); return -1; } if (crtc >= dev->num_crtcs) { printf("Invalid crtc %d (num=%d)\n", crtc, dev->num_crtcs); return -1; } ret = initialize_screens(dev); if (ret) { printf("Failed to initialize screens\n"); goto out; } test_crtc = &dev->crtcs[crtc]; plane = calloc(dev->num_planes, sizeof(*plane)); if (!plane) { printf("Failed to allocate plane array\n"); goto out; } /* Create our planes */ num_test_planes = test_crtc->num_planes; for (i = 0; i < num_test_planes; i++) { plane[i] = get_sp_plane(dev, test_crtc); if (!plane[i]) { printf("no unused planes available\n"); goto out; } plane[i]->bo = create_sp_bo(dev, plane_w, plane_h, 16, plane[i]->format, 0); if (!plane[i]->bo) { printf("failed to create plane bo\n"); goto out; } fill_bo(plane[i]->bo, 0xFF, 0xFF, 0xFF, 0xFF); } pset = drmModePropertySetAlloc(); if (!pset) { printf("Failed to allocate the property set\n"); goto out; } while (!terminate) { FD_ZERO(&fds); FD_SET(dev->fd, &fds); incrementor(&x_inc, &x, 5, 0, test_crtc->crtc->mode.hdisplay - plane_w); incrementor(&y_inc, &y, 5, 0, test_crtc->crtc->mode.vdisplay - plane_h * num_test_planes); for (j = 0; j < num_test_planes; j++) { ret = set_sp_plane_pset(dev, plane[j], pset, test_crtc, x, y + j * plane_h); if (ret) { printf("failed to move plane %d\n", ret); goto out; } } ret = drmModePropertySetCommit(dev->fd, DRM_MODE_PAGE_FLIP_EVENT, NULL, pset); if (ret) { printf("failed to commit properties ret=%d\n", ret); goto out; } do { ret = select(dev->fd + 1, &fds, NULL, NULL, NULL); } while (ret == -1 && errno == EINTR); if (FD_ISSET(dev->fd, &fds)) drmHandleEvent(dev->fd, &event_context); } drmModePropertySetFree(pset); for (i = 0; i < num_test_planes; i++) put_sp_plane(plane[i]); out: destroy_sp_dev(dev); free(plane); return ret; }