Home | History | Annotate | Download | only in planetest
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <sys/types.h>
      4 #include <sys/stat.h>
      5 #include <sys/select.h>
      6 #include <fcntl.h>
      7 #include <unistd.h>
      8 #include <string.h>
      9 #include <signal.h>
     10 #include <time.h>
     11 #include <errno.h>
     12 
     13 #include <xf86drm.h>
     14 
     15 #include "dev.h"
     16 #include "bo.h"
     17 #include "modeset.h"
     18 
     19 static int terminate = 0;
     20 
     21 static void sigint_handler(int arg)
     22 {
     23 	terminate = 1;
     24 }
     25 
     26 static void incrementor(int *inc, int *val, int increment, int lower, int upper)
     27 {
     28 	if(*inc > 0)
     29 		*inc = *val + increment >= upper ? -1 : 1;
     30 	else
     31 		*inc = *val - increment <= lower ? 1 : -1;
     32 	*val += *inc * increment;
     33 }
     34 
     35 int main(int argc, char *argv[])
     36 {
     37 	int ret, i, j, num_test_planes;
     38 	int x_inc = 1, x = 0, y_inc = 1, y = 0;
     39 	uint32_t plane_w = 128, plane_h = 128;
     40 	struct sp_dev *dev;
     41 	struct sp_plane **plane = NULL;
     42 	struct sp_crtc *test_crtc;
     43 	int card = 0, crtc = 0;
     44 
     45 	signal(SIGINT, sigint_handler);
     46 
     47 	parse_arguments(argc, argv, &card, &crtc);
     48 
     49 	dev = create_sp_dev(card);
     50 	if (!dev) {
     51 		printf("Failed to create sp_dev\n");
     52 		return -1;
     53 	}
     54 
     55 	if (crtc >= dev->num_crtcs) {
     56 		printf("Invalid crtc %d (num=%d)\n", crtc, dev->num_crtcs);
     57 		return -1;
     58 	}
     59 
     60 	ret = initialize_screens(dev);
     61 	if (ret) {
     62 		printf("Failed to initialize screens\n");
     63 		goto out;
     64 	}
     65 	test_crtc = &dev->crtcs[crtc];
     66 
     67 	plane = calloc(dev->num_planes, sizeof(*plane));
     68 	if (!plane) {
     69 		printf("Failed to allocate plane array\n");
     70 		goto out;
     71 	}
     72 
     73 	/* Create our planes */
     74 	num_test_planes = test_crtc->num_planes;
     75 	for (i = 0; i < num_test_planes; i++) {
     76 		plane[i] = get_sp_plane(dev, test_crtc);
     77 		if (!plane[i]) {
     78 			printf("no unused planes available\n");
     79 			goto out;
     80 		}
     81 
     82 		plane[i]->bo = create_sp_bo(dev, plane_w, plane_h, 16,
     83 				plane[i]->format, 0);
     84 		if (!plane[i]->bo) {
     85 			printf("failed to create plane bo\n");
     86 			goto out;
     87 		}
     88 
     89 		fill_bo(plane[i]->bo, 0xFF, 0xFF, 0xFF, 0xFF);
     90 	}
     91 
     92 	while (!terminate) {
     93 		incrementor(&x_inc, &x, 5, 0,
     94 			test_crtc->crtc->mode.hdisplay - plane_w);
     95 		incrementor(&y_inc, &y, 5, 0, test_crtc->crtc->mode.vdisplay -
     96 						plane_h * num_test_planes);
     97 
     98 		for (j = 0; j < num_test_planes; j++) {
     99 			ret = set_sp_plane(dev, plane[j], test_crtc,
    100 					x, y + j * plane_h);
    101 			if (ret) {
    102 				printf("failed to set plane %d %d\n", j, ret);
    103 				goto out;
    104 			}
    105 		}
    106 		usleep(15 * 1000);
    107 	}
    108 
    109 	for (i = 0; i < num_test_planes; i++)
    110 		put_sp_plane(plane[i]);
    111 
    112 out:
    113 	destroy_sp_dev(dev);
    114 	free(plane);
    115 	return ret;
    116 }
    117