[Piglit] [PATCH 1/8] piglit-framework-gl: Use GBM on non-intel for dmabuf creation.
Eric Anholt
eric at anholt.net
Tue Jul 26 00:43:37 UTC 2016
Previously the dmabuf tests only worked on the intel driver. However,
thanks to the new GBM BO mapping interface by Rob Herring, we can make
a generic framework for other drivers.
---
CMakeLists.txt | 7 +-
.../util/piglit-framework-gl/piglit_drm_dma_buf.c | 101 +++++++++++++++++++++
2 files changed, 107 insertions(+), 1 deletion(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8e2abbad6730..55cfc4541df0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -141,6 +141,10 @@ IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
if(GBM_FOUND)
set(PIGLIT_HAS_GBM True)
add_definitions(-DPIGLIT_HAS_GBM)
+ if (GBM_VERSION VERSION_GREATER "11.1")
+ set(PIGLIT_HAS_GBM_BO_MAP True)
+ add_definitions(-DPIGLIT_HAS_GBM_BO_MAP)
+ endif()
endif(GBM_FOUND)
pkg_check_modules(WAYLAND QUIET wayland-client wayland-egl)
@@ -177,7 +181,8 @@ ENDIF()
# drm-prime arrived in that version.
#
if(LIBDRM_FOUND AND XCB_DRI2_FOUND AND
- (LIBDRM_INTEL_VERSION VERSION_GREATER "2.4.37"))
+ ((LIBDRM_INTEL_VERSION VERSION_GREATER "2.4.37") OR
+ PIGLIT_HAS_GBM_BO_MAP))
set(PIGLIT_BUILD_DMA_BUF_TESTS_IS_VALID true)
else()
set(PIGLIT_BUILD_DMA_BUF_TESTS_IS_VALID false)
diff --git a/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c b/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
index 479592c3a4db..3d1dc2422b30 100644
--- a/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
+++ b/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
@@ -26,6 +26,9 @@
#ifdef HAVE_LIBDRM_INTEL
#include <libdrm/intel_bufmgr.h>
#endif
+#ifdef PIGLIT_HAS_GBM_BO_MAP
+#include <gbm.h>
+#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -182,6 +185,97 @@ piglit_intel_buf_destroy(struct piglit_dma_buf *buf)
}
#endif /* HAVE_LIBDRM_INTEL */
+#ifdef PIGLIT_HAS_GBM_BO_MAP
+static struct gbm_device *
+piglit_gbm_get(void)
+{
+ const struct piglit_drm_driver *drv = piglit_drm_get_driver();
+ static struct gbm_device *gbm = NULL;
+
+ if (gbm)
+ return gbm;
+
+ gbm = gbm_create_device(drv->fd);
+
+ return gbm;
+}
+
+static bool
+piglit_gbm_buf_create(unsigned w, unsigned h, unsigned cpp,
+ const unsigned char *src_data, unsigned src_stride,
+ struct piglit_dma_buf *buf)
+{
+ unsigned i;
+ struct gbm_bo *bo;
+ uint32_t dst_stride;
+ struct gbm_device *gbm = piglit_gbm_get();
+ void *dst_data;
+ void *map_data = NULL;
+ enum gbm_bo_format format;
+
+ if (!gbm || h % 2)
+ return false;
+
+ /* It would be nice if we took in a fourcc instead of a cpp */
+ switch (cpp) {
+ case 1:
+ format = GBM_FORMAT_C8;
+ break;
+ case 4:
+ format = GBM_BO_FORMAT_ARGB8888;
+ break;
+ default:
+ fprintf(stderr, "Unknown cpp %d\n", cpp);
+ return false;
+ }
+
+ bo = gbm_bo_create(gbm, w, h, format, GBM_BO_USE_RENDERING);
+ if (!bo)
+ return false;
+
+ dst_data = gbm_bo_map(bo, 0, 0, w, h, GBM_BO_TRANSFER_WRITE,
+ &dst_stride, &map_data);
+ if (!dst_data) {
+ fprintf(stderr, "Failed to map GBM bo\n");
+ gbm_bo_destroy(bo);
+ return NULL;
+ }
+
+ for (i = 0; i < h; ++i) {
+ memcpy((char *)dst_data + i * dst_stride,
+ src_data + i * src_stride,
+ w * cpp);
+ }
+ gbm_bo_unmap(bo, map_data);
+
+ buf->w = w;
+ buf->h = h;
+ buf->stride = dst_stride;
+ buf->fd = 0;
+ buf->priv = bo;
+
+ return true;
+}
+
+static bool
+piglit_gbm_buf_export(struct piglit_dma_buf *buf)
+{
+ struct gbm_bo *bo = buf->priv;
+
+ buf->fd = gbm_bo_get_fd(bo);
+
+ return buf->fd >= 0;
+}
+
+static void
+piglit_gbm_buf_destroy(struct piglit_dma_buf *buf)
+{
+ struct gbm_bo *bo = buf->priv;
+
+ gbm_bo_destroy(bo);
+}
+#endif /* PIGLIT_HAS_GBM_BO_MAP */
+
static const struct piglit_drm_driver *
piglit_drm_get_driver(void)
{
@@ -228,6 +322,13 @@ piglit_drm_get_driver(void)
drv.destroy = piglit_intel_buf_destroy;
}
#endif
+#ifdef PIGLIT_HAS_GBM_BO_MAP
+ else if (true) {
+ drv.create = piglit_gbm_buf_create;
+ drv.export = piglit_gbm_buf_export;
+ drv.destroy = piglit_gbm_buf_destroy;
+ }
+#endif
else {
fprintf(stderr, "error: unrecognized DRM driver name %s\n",
version->name);
--
2.8.1
More information about the Piglit
mailing list