You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
3.2 KiB
151 lines
3.2 KiB
#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; |
|
}
|
|
|