aboutsummaryrefslogtreecommitdiffstats
path: root/drmtest.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2019-12-02 12:21:04 +0100
committerGerd Hoffmann <kraxel@redhat.com>2019-12-02 12:21:04 +0100
commit98e80ffc82aa732a0a87c5b3af9bbb6c7d52fac0 (patch)
tree12fa05365e209a51780143c81500c2b25dc99d32 /drmtest.c
parent55a27b58035f9ae644913a3feb337315b17f86e2 (diff)
downloaddrminfo-98e80ffc82aa732a0a87c5b3af9bbb6c7d52fac0.tar.gz
vgem code restruction
Diffstat (limited to 'drmtest.c')
-rw-r--r--drmtest.c57
1 files changed, 38 insertions, 19 deletions
diff --git a/drmtest.c b/drmtest.c
index b0c2907..a834dd9 100644
--- a/drmtest.c
+++ b/drmtest.c
@@ -33,6 +33,7 @@
/* device caps */
bool have_export;
+bool have_import;
/* dumb fb */
static struct drm_mode_create_dumb creq;
@@ -112,6 +113,7 @@ static void drm_get_caps(void)
exit(1);
}
have_export = prime & DRM_PRIME_CAP_EXPORT;
+ have_import = prime & DRM_PRIME_CAP_IMPORT;
}
static void drm_draw(bool autotest, int updatetest)
@@ -217,23 +219,44 @@ static void drm_zap_mappings(void)
/* ------------------------------------------------------------------ */
-static void drm_init_dumb_fb(bool use_pixman, bool create_dmabuf)
+static void drm_init_dumb_obj(int fd)
{
struct drm_mode_map_dumb mreq;
- uint32_t zero = 0;
int rc;
- /* create framebuffer */
+ /* create gem object */
memset(&creq, 0, sizeof(creq));
creq.width = drm_mode->hdisplay;
creq.height = drm_mode->vdisplay;
creq.bpp = fmt->bpp;
- rc = drmIoctl(drm_fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq);
+ rc = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq);
if (rc < 0) {
fprintf(stderr, "DRM_IOCTL_MODE_CREATE_DUMB: %s\n", strerror(errno));
exit(1);
}
+ /* map gem object */
+ memset(&mreq, 0, sizeof(mreq));
+ mreq.handle = creq.handle;
+ rc = drmIoctl(drm_fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq);
+ if (rc < 0) {
+ fprintf(stderr, "DRM_IOCTL_MODE_MAP_DUMB: %s\n", strerror(errno));
+ exit(1);
+ }
+ fbmem = mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, drm_fd, mreq.offset);
+ if (fbmem == MAP_FAILED) {
+ fprintf(stderr, "framebuffer mmap: %s\n", strerror(errno));
+ exit(1);
+ }
+}
+
+static void drm_init_dumb_fb(bool use_pixman, bool create_dmabuf)
+{
+ uint32_t zero = 0;
+ int rc;
+
+ drm_init_dumb_obj(drm_fd);
+
if (fmt->fourcc) {
rc = drmModeAddFB2(drm_fd, creq.width, creq.height, fmt->fourcc,
&creq.handle, &creq.pitch, &zero,
@@ -256,21 +279,7 @@ static void drm_init_dumb_fb(bool use_pixman, bool create_dmabuf)
}
}
- /* map framebuffer */
- memset(&mreq, 0, sizeof(mreq));
- mreq.handle = creq.handle;
- rc = drmIoctl(drm_fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq);
- if (rc < 0) {
- fprintf(stderr, "DRM_IOCTL_MODE_MAP_DUMB: %s\n", strerror(errno));
- exit(1);
- }
- fbmem = mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, drm_fd, mreq.offset);
- if (fbmem == MAP_FAILED) {
- fprintf(stderr, "framebuffer mmap: %s\n", strerror(errno));
- exit(1);
- }
-
- if (have_export && create_dmabuf) {
+ if (create_dmabuf) {
print_head("create dma-buf");
rc = drmPrimeHandleToFD(drm_fd, creq.handle, 0, &dmabuf_fd);
print_test_errno("dma-buf export", rc < 0, errno);
@@ -441,6 +450,16 @@ int main(int argc, char **argv)
drm_init_dev(card, output, modename, false, lease_fd);
drm_get_caps();
+ if (dmabuf && !have_export) {
+ fprintf(stderr, "dambuf export not supported by %s\n", version->name);
+ exit(1);
+ }
+
+ if (vgem && !have_import) {
+ fprintf(stderr, "dambuf import not supported by %s\n", version->name);
+ exit(1);
+ }
+
if (vgem) {
vgem_fd = drm_init_vgem();
}