aboutsummaryrefslogtreecommitdiffstats
path: root/prime.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2019-01-09 11:44:11 +0100
committerGerd Hoffmann <kraxel@redhat.com>2019-01-09 11:44:11 +0100
commit4286c34012e736f44f7ebf4aec9208deeacc7e0a (patch)
tree3eb99eeb1589d47fb5d35a3ffda1fdf9139544ce /prime.c
parent22aa9544dc826dc4c70af0ac1d47596ac6fc3d77 (diff)
downloaddrminfo-4286c34012e736f44f7ebf4aec9208deeacc7e0a.tar.gz
prime test tweaks
Diffstat (limited to 'prime.c')
-rw-r--r--prime.c132
1 files changed, 123 insertions, 9 deletions
diff --git a/prime.c b/prime.c
index 8a11656..a5fbb57 100644
--- a/prime.c
+++ b/prime.c
@@ -16,9 +16,13 @@
#include <gbm.h>
+#define TEST_WIDTH 640
+#define TEST_HEIGHT 480
+#define TEST_SIZE (TEST_WIDTH * TEST_HEIGHT * 4)
+
/* ------------------------------------------------------------------ */
-int drm_init_dev(const char *devname)
+int drm_init_dev(const char *devname, bool *import, bool *export)
{
uint64_t prime, dumb;
int fd, rc;
@@ -40,18 +44,114 @@ int drm_init_dev(const char *devname)
fprintf(stderr, "drmGetCap(DRM_CAP_PRIME): %s\n", strerror(errno));
exit(1);
}
+ *import = prime & DRM_PRIME_CAP_IMPORT;
+ *export = prime & DRM_PRIME_CAP_EXPORT;
fprintf(stderr, "%s:\n", devname);
- fprintf(stderr, " dumb buffers: %s\n",
- dumb ? "yes" : "no");
- fprintf(stderr, " prime import: %s\n",
- prime & DRM_PRIME_CAP_IMPORT ? "yes" : "no");
- fprintf(stderr, " prime export: %s\n",
- prime & DRM_PRIME_CAP_EXPORT ? "yes" : "no");
+ fprintf(stderr, " device capabilities\n");
+ fprintf(stderr, " dumb buffers: %s\n", dumb ? "yes" : "no");
+ fprintf(stderr, " prime import: %s\n", *import ? "yes" : "no");
+ fprintf(stderr, " prime export: %s\n", *export ? "yes" : "no");
return fd;
}
+int drm_dumb_buf(int fd)
+{
+ struct drm_mode_create_dumb creq = {
+ .width = TEST_WIDTH,
+ .height = TEST_HEIGHT,
+ .bpp = 32,
+ };
+ int rc;
+
+ rc = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq);
+ if (rc < 0) {
+ fprintf(stderr, " create buffer: FAILED (%s)\n",
+ strerror(errno));
+ return rc;
+ } else {
+ fprintf(stderr, " create buffer: OK\n");
+ return creq.handle;
+ }
+}
+
+int drm_export_buf(int fd, int handle)
+{
+ int dmabuf;
+ int rc;
+
+ rc = drmPrimeHandleToFD(fd, handle, 0, &dmabuf);
+ if (rc < 0) {
+ fprintf(stderr, " export buffer: FAILED (%s)\n",
+ strerror(errno));
+ return rc;
+ } else {
+ fprintf(stderr, " export buffer: OK\n");
+ return dmabuf;
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+void dmabuf_mmap(int dmabuf)
+{
+ void *ptr;
+
+ ptr = mmap(NULL, TEST_SIZE, PROT_READ, MAP_SHARED, dmabuf, 0);
+ if (ptr == MAP_FAILED) {
+ fprintf(stderr, " mmap dmabuf: FAILED (%s)\n",
+ strerror(errno));
+ } else {
+ fprintf(stderr, " mmap dmabuf: OK\n");
+ munmap(ptr, TEST_SIZE);
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+void gbm_test(int card, bool export)
+{
+ struct gbm_device *gbm;
+ struct gbm_bo *bo;
+ int dmabuf;
+
+ fprintf(stderr, " test gdm buffer (mesa-libgbm)\n");
+ gbm = gbm_create_device(card);
+ if (!gbm) {
+ fprintf(stderr, " create gbm dev: FAILED\n");
+ return;
+ }
+ fprintf(stderr, " create gbm dev: OK (backend: %s)\n",
+ gbm_device_get_backend_name(gbm));
+
+ bo = gbm_bo_create(gbm, TEST_WIDTH, TEST_HEIGHT,
+ GBM_FORMAT_XRGB8888,
+ 0);
+ if (!bo) {
+ fprintf(stderr, " create gbm bo: FAILED\n");
+ goto done_gbm;
+ }
+ fprintf(stderr, " create gbm bo: OK\n");
+
+ if (!export)
+ goto done_bo;
+ dmabuf = gbm_bo_get_fd(bo);
+ if (dmabuf < 0) {
+ fprintf(stderr, " gbm bo export: FAILED\n");
+ goto done_bo;
+ }
+ fprintf(stderr, " gbm bo export: OK\n");
+
+ dmabuf_mmap(dmabuf);
+ close(dmabuf);
+
+done_bo:
+ gbm_bo_destroy(bo);
+done_gbm:
+ gbm_device_destroy(gbm);
+}
+
/* ------------------------------------------------------------------ */
static void usage(FILE *fp)
@@ -68,7 +168,8 @@ static void usage(FILE *fp)
int main(int argc, char **argv)
{
char devname[64];
- int card, c, i;
+ bool import, export;
+ int card, handle, dmabuf, c, i;
for (;;) {
c = getopt(argc, argv, "h");
@@ -88,7 +189,20 @@ int main(int argc, char **argv)
snprintf(devname, sizeof(devname), DRM_DEV_NAME, DRM_DIR_NAME, i);
if (access(devname, R_OK | W_OK) != 0)
break;
- card = drm_init_dev(devname);
+ card = drm_init_dev(devname, &import, &export);
+
+ fprintf(stderr, " test dumb buffer (ioctl)\n");
+ handle = drm_dumb_buf(card);
+ if (handle >= 0 && export) {
+ dmabuf = drm_export_buf(card, handle);
+ if (dmabuf >= 0) {
+ dmabuf_mmap(dmabuf);
+ close(dmabuf);
+ }
+ }
+
+ gbm_test(card, export);
+
close(card);
}