simple-dmabuf-drm: support etnaviv drm as well
Reviewed-by: Derek Foreman <derekf@osg.samsung.com> Signed-off-by: Guido Günther <agx@sigxcpu.org> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
committed by
Pekka Paalanen
parent
f9f5953b2d
commit
bff906304f
@@ -629,6 +629,7 @@ nodist_weston_simple_dmabuf_drm_SOURCES = \
|
|||||||
weston_simple_dmabuf_drm_CFLAGS = $(AM_CFLAGS) $(SIMPLE_DMABUF_DRM_CLIENT_CFLAGS)
|
weston_simple_dmabuf_drm_CFLAGS = $(AM_CFLAGS) $(SIMPLE_DMABUF_DRM_CLIENT_CFLAGS)
|
||||||
weston_simple_dmabuf_drm_LDADD = $(SIMPLE_DMABUF_DRM_CLIENT_LIBS) \
|
weston_simple_dmabuf_drm_LDADD = $(SIMPLE_DMABUF_DRM_CLIENT_LIBS) \
|
||||||
$(LIBDRM_PLATFORM_FREEDRENO_LIBS) \
|
$(LIBDRM_PLATFORM_FREEDRENO_LIBS) \
|
||||||
|
$(LIBDRM_PLATFORM_ETNAVIV_LIBS) \
|
||||||
$(LIBDRM_PLATFORM_INTEL_LIBS) \
|
$(LIBDRM_PLATFORM_INTEL_LIBS) \
|
||||||
libshared.la
|
libshared.la
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -39,6 +39,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <xf86drm.h>
|
#include <xf86drm.h>
|
||||||
|
|
||||||
@@ -49,6 +50,9 @@
|
|||||||
#ifdef HAVE_LIBDRM_FREEDRENO
|
#ifdef HAVE_LIBDRM_FREEDRENO
|
||||||
#include <freedreno/freedreno_drmif.h>
|
#include <freedreno/freedreno_drmif.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_LIBDRM_ETNAVIV
|
||||||
|
#include <etnaviv_drmif.h>
|
||||||
|
#endif
|
||||||
#include <drm_fourcc.h>
|
#include <drm_fourcc.h>
|
||||||
|
|
||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
@@ -108,6 +112,10 @@ struct buffer {
|
|||||||
struct fd_device *fd_dev;
|
struct fd_device *fd_dev;
|
||||||
struct fd_bo *fd_bo;
|
struct fd_bo *fd_bo;
|
||||||
#endif /* HAVE_LIBDRM_FREEDRENO */
|
#endif /* HAVE_LIBDRM_FREEDRENO */
|
||||||
|
#if HAVE_LIBDRM_ETNAVIV
|
||||||
|
struct etna_device *etna_dev;
|
||||||
|
struct etna_bo *etna_bo;
|
||||||
|
#endif /* HAVE_LIBDRM_ETNAVIV */
|
||||||
|
|
||||||
uint32_t gem_handle;
|
uint32_t gem_handle;
|
||||||
int dmabuf_fd;
|
int dmabuf_fd;
|
||||||
@@ -265,6 +273,56 @@ fd_device_destroy(struct buffer *buf)
|
|||||||
fd_device_del(buf->fd_dev);
|
fd_device_del(buf->fd_dev);
|
||||||
}
|
}
|
||||||
#endif /* HAVE_LIBDRM_FREEDRENO */
|
#endif /* HAVE_LIBDRM_FREEDRENO */
|
||||||
|
#ifdef HAVE_LIBDRM_ETNAVIV
|
||||||
|
|
||||||
|
static int
|
||||||
|
etna_alloc_bo(struct buffer *buf)
|
||||||
|
{
|
||||||
|
int flags = DRM_ETNA_GEM_CACHE_WC;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
buf->stride = ALIGN(buf->width, 32) * buf->bpp / 8;
|
||||||
|
size = buf->stride * buf->height;
|
||||||
|
buf->etna_dev = etna_device_new(buf->drm_fd);
|
||||||
|
buf->etna_bo = etna_bo_new(buf->etna_dev, size, flags);
|
||||||
|
|
||||||
|
return buf->etna_bo != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
etna_free_bo(struct buffer *buf)
|
||||||
|
{
|
||||||
|
etna_bo_del(buf->etna_bo);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
etna_bo_export_to_prime(struct buffer *buf)
|
||||||
|
{
|
||||||
|
buf->dmabuf_fd = etna_bo_dmabuf(buf->etna_bo);
|
||||||
|
return buf->dmabuf_fd < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
etna_map_bo(struct buffer *buf)
|
||||||
|
{
|
||||||
|
buf->mmap = etna_bo_map(buf->etna_bo);
|
||||||
|
return buf->mmap != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
etna_unmap_bo(struct buffer *buf)
|
||||||
|
{
|
||||||
|
if (munmap(buf->mmap, buf->stride * buf->height) < 0)
|
||||||
|
fprintf(stderr, "Failed to unmap buffer: %s", strerror(errno));
|
||||||
|
buf->mmap = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
etna_device_destroy(struct buffer *buf)
|
||||||
|
{
|
||||||
|
etna_device_del(buf->etna_dev);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_LIBDRM_ENTAVIV */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fill_content(struct buffer *my_buf)
|
fill_content(struct buffer *my_buf)
|
||||||
@@ -332,6 +390,16 @@ drm_device_init(struct buffer *buf)
|
|||||||
dev->unmap_bo = fd_unmap_bo;
|
dev->unmap_bo = fd_unmap_bo;
|
||||||
dev->device_destroy = fd_device_destroy;
|
dev->device_destroy = fd_device_destroy;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LIBDRM_ETNAVIV
|
||||||
|
else if (!strcmp(dev->name, "etnaviv")) {
|
||||||
|
dev->alloc_bo = etna_alloc_bo;
|
||||||
|
dev->free_bo = etna_free_bo;
|
||||||
|
dev->export_bo_to_prime = etna_bo_export_to_prime;
|
||||||
|
dev->map_bo = etna_map_bo;
|
||||||
|
dev->unmap_bo = etna_unmap_bo;
|
||||||
|
dev->device_destroy = etna_device_destroy;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
else {
|
else {
|
||||||
fprintf(stderr, "Error: drm device %s unsupported.\n",
|
fprintf(stderr, "Error: drm device %s unsupported.\n",
|
||||||
|
|||||||
+4
-1
@@ -400,11 +400,14 @@ if ! test "x$enable_simple_dmabuf_drm_client" = "xno"; then
|
|||||||
PKG_CHECK_MODULES(LIBDRM_PLATFORM_INTEL, [libdrm_intel],
|
PKG_CHECK_MODULES(LIBDRM_PLATFORM_INTEL, [libdrm_intel],
|
||||||
AC_DEFINE([HAVE_LIBDRM_INTEL], [1], [Build intel dmabuf client]) have_simple_dmabuf_drm_client=yes,
|
AC_DEFINE([HAVE_LIBDRM_INTEL], [1], [Build intel dmabuf client]) have_simple_dmabuf_drm_client=yes,
|
||||||
[true])
|
[true])
|
||||||
|
PKG_CHECK_MODULES(LIBDRM_PLATFORM_ETNAVIV, [libdrm_etnaviv],
|
||||||
|
AC_DEFINE([HAVE_LIBDRM_ETNAVIV], [1], [Build etnaviv dmabuf client]) have_simple_dmabuf_drm_client=yes,
|
||||||
|
[true])
|
||||||
|
|
||||||
if test "x$have_simple_dmabuf_drm_client" != "xyes" -o \
|
if test "x$have_simple_dmabuf_drm_client" != "xyes" -o \
|
||||||
"x$have_simple_dmabuf_libs" = "xno" && \
|
"x$have_simple_dmabuf_libs" = "xno" && \
|
||||||
test "x$enable_simple_dmabuf_drm_client" = "xyes"; then
|
test "x$enable_simple_dmabuf_drm_client" = "xyes"; then
|
||||||
AC_MSG_ERROR([DRM dmabuf client explicitly enabled, but libdrm_intel or libdrm_freedreno not found])
|
AC_MSG_ERROR([DRM dmabuf client explicitly enabled, but none of libdrm_{intel,freedreno,etnaviv} found])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$have_simple_dmabuf_drm_client" = "xyes" -a "x$have_simple_dmabuf_libs" = "xyes"; then
|
if test "x$have_simple_dmabuf_drm_client" = "xyes" -a "x$have_simple_dmabuf_libs" = "xyes"; then
|
||||||
|
|||||||
Reference in New Issue
Block a user