[Piglit] [v8 04/13] framework: automatic drm authentication for dma buffer support

Topi Pohjolainen topi.pohjolainen at intel.com
Wed Jul 10 01:24:03 PDT 2013


From: Chad Versace <chad.versace at linux.intel.com>

Fix tests to work as non-root user. Get DRM authentication before
calling intel_bufmgr_gem_init().

v2: refactored into its own patch and allowing the dma buffer
    support to be compiled even without this (change by Topi)

v3: use 'bool' instead of "zero for success, negative for failure"
    (review by Eric, change by Topi)

Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
Reviewed-by: Eric Anholt <eric at anholt.net>
---
 tests/util/CMakeLists.txt                          | 15 +++++++
 .../util/piglit-framework-gl/piglit_drm_dma_buf.c  | 50 ++++++++++++++++++++++
 2 files changed, 65 insertions(+)

diff --git a/tests/util/CMakeLists.txt b/tests/util/CMakeLists.txt
index 77b6fc5..8f1420c 100644
--- a/tests/util/CMakeLists.txt
+++ b/tests/util/CMakeLists.txt
@@ -52,6 +52,7 @@ set(UTIL_GL_LIBS
 
 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
 	pkg_check_modules(LIBDRM_INTEL QUIET libdrm_intel)
+	pkg_check_modules(XCB_DRI2 QUIET xcb-dri2)
 
 	# One needs to have at least one hardware driver present, otherwise
 	# there is no point compiling just the dispatcher.
@@ -77,6 +78,20 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
 				${LIBDRM_INTEL_LDFLAGS}
 			)
 		endif()
+
+		# xcb-dri2 is used to gain DRM authentication.
+		if(XCB_DRI2_FOUND)
+			add_definitions(-DHAVE_XCB_DRI2)
+
+			list(APPEND UTIL_GL_LIBS
+				${XCB_DRI2_LDFLAGS}
+			)
+
+			list(APPEND UTIL_GL_INCLUDES
+				${XCB_DRI2_INCLUDE_DIRS}
+			)
+		endif()
+
 	endif()
 
 	set(UTIL_GL_LIBS
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 cdfc7f1..9a7ff3b 100644
--- a/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
+++ b/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
@@ -32,6 +32,10 @@
 #include <string.h>
 #include <xf86drm.h>
 #include <stdbool.h>
+#ifdef HAVE_XCB_DRI2
+#include <xcb/dri2.h>
+#include <drm.h>
+#endif
 
 static const char *drm_device_filename = "/dev/dri/card0";
 
@@ -73,6 +77,47 @@ piglit_drm_device_get(void)
 	return fd;
 }
 
+#ifdef HAVE_XCB_DRI2
+static bool
+piglit_drm_x11_authenticate(void)
+{
+	drm_magic_t magic;
+	xcb_connection_t *conn;
+	int screen;
+	xcb_screen_iterator_t screen_iter;
+	xcb_dri2_authenticate_cookie_t auth_cookie;
+	xcb_dri2_authenticate_reply_t *auth_reply;
+	int ret = 0;
+
+	conn = xcb_connect(NULL, &screen);
+	if (!conn) {
+		printf("piglit: failed to connect to X server for DRI2 "
+		       "authentication\n");
+		return false;
+	}
+
+	ret = drmGetMagic(piglit_drm_device_get(), &magic);
+	if (ret) {
+		printf("piglit: failed to get DRM magic\n");
+		return false;
+	}
+
+	screen_iter = xcb_setup_roots_iterator(xcb_get_setup(conn));
+	auth_cookie = xcb_dri2_authenticate_unchecked(conn,
+	                                              screen_iter.data->root,
+	                                              magic);
+	auth_reply = xcb_dri2_authenticate_reply(conn, auth_cookie, NULL);
+
+	if (auth_reply == NULL || !auth_reply->authenticated) {
+		printf("piglit: failed to authenticate with DRI2\n");
+		return false;
+	}
+	free(auth_reply);
+
+	return true;
+}
+#endif /* HAVE_XCB_DRI2 */
+
 #ifdef HAVE_LIBDRM_INTEL
 static drm_intel_bufmgr *
 piglit_intel_bufmgr_get(void)
@@ -86,6 +131,11 @@ piglit_intel_bufmgr_get(void)
 	if (!piglit_drm_device_get())
 		return NULL;
 
+#ifdef HAVE_XCB_DRI2
+	if (!piglit_drm_x11_authenticate())
+		return NULL;
+#endif /* HAVE_XCB_DRI2 */
+
 	mgr = intel_bufmgr_gem_init(piglit_drm_device_get(), batch_sz);
 
 	return mgr;
-- 
1.8.1.2



More information about the Piglit mailing list