diff options
author | Kamil Debski <k.debski@samsung.com> | 2014-07-02 17:54:34 +0200 |
---|---|---|
committer | Kamil Debski <k.debski@samsung.com> | 2014-08-07 16:01:35 +0200 |
commit | 1aab95de7ce3e60d723a91707e5c7b926cfad4eb (patch) | |
tree | c0f0230f2a1611735be8e3c665cdc80ad3fa6857 /v4l2-mfc-example/drm.c | |
parent | c655913a3bdd7ef6413814482983c3beff00bdc0 (diff) |
v4l2-mfc-example: Add support for DMABUF buffer sharing
This patch adds support for buffer sharing with DMABUF. Now FIMC can take
DMABUF buffers from MFC and DRM.
Signed-off-by: Kamil Debski <k.debski@samsung.com>
Diffstat (limited to 'v4l2-mfc-example/drm.c')
-rw-r--r-- | v4l2-mfc-example/drm.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/v4l2-mfc-example/drm.c b/v4l2-mfc-example/drm.c index 188d394..d53a0b4 100644 --- a/v4l2-mfc-example/drm.c +++ b/v4l2-mfc-example/drm.c @@ -78,13 +78,25 @@ int drm_open(struct instance *i, char *name) return -1; } args.handle = i->drm.gem[n].handle; - i->drm.mmap[n].handle = i->drm.gem[n].handle; - i->drm.mmap[n].size = i->drm.gem[n].size; - ret = ioctl(i->drm.fd, DRM_IOCTL_EXYNOS_GEM_MMAP, &i->drm.mmap[n]); - if (ret < 0) { - ioctl(i->drm.fd, DRM_IOCTL_GEM_CLOSE, &args); - err("Failed to mmap gem"); - return -1; + + if (i->fimc.dmabuf) { + ret = drmPrimeHandleToFD(i->drm.fd, i->drm.gem[n].handle, DRM_CLOEXEC, &i->fimc.dbuf[n]); + if (ret < 0) { + ioctl(i->drm.fd, DRM_IOCTL_GEM_CLOSE, &args); + err("Failed to expbuf a gem object"); + return -1; + } + } else { + i->drm.mmap[n].handle = i->drm.gem[n].handle; + i->drm.mmap[n].size = i->drm.gem[n].size; + ret = ioctl(i->drm.fd, DRM_IOCTL_EXYNOS_GEM_MMAP, &i->drm.mmap[n]); + if (ret < 0) { + ioctl(i->drm.fd, DRM_IOCTL_GEM_CLOSE, &args); + err("Failed to mmap gem"); + return -1; + } + i->drm.p[n] = (char *)(unsigned int)i->drm.mmap[n].mapped; + i->fimc.p[n] = (char *)(unsigned int)i->drm.mmap[n].mapped; } ret = drmModeAddFB(i->drm.fd, i->drm.width, i->drm.height, 32, 32, 4 * i->drm.width, i->drm.gem[n].handle, &fb_id); @@ -96,8 +108,6 @@ int drm_open(struct instance *i, char *name) return -1; } i->drm.fb[n] = fb_id; - i->drm.p[n] = (char *)(unsigned int)i->drm.mmap[n].mapped; - i->fimc.p[n] = (char *)(unsigned int)i->drm.mmap[n].mapped; } snprintf(mode, 32, "%dx%d", crtc->width, crtc->height); |