From: Chad Versace <chad.vers...@linux.intel.com>

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

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

Signed-off-by: Chad Versace <chad.vers...@linux.intel.com>
---
 tests/util/CMakeLists.txt                          | 15 +++++++
 .../util/piglit-framework-gl/piglit_drm_dma_buf.c  | 48 ++++++++++++++++++++++
 2 files changed, 63 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 21add02..3cdf1dd 100644
--- a/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
+++ b/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
@@ -31,6 +31,8 @@
 #include <fcntl.h>
 #include <string.h>
 #include <xf86drm.h>
+#include <xcb/dri2.h>
+#include <drm.h>
 
 static const char *drm_device_filename = "/dev/dri/card0";
 
@@ -72,6 +74,47 @@ piglit_drm_device_get(void)
        return fd;
 }
 
+#ifdef HAVE_XCB_DRI2
+static int
+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 -1;
+       }
+
+       ret = drmGetMagic(piglit_drm_device_get(), &magic);
+       if (ret) {
+               printf("piglit: failed to get DRM magic\n");
+               return -1;
+       }
+
+       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 -1;
+       }
+       free(auth_reply);
+
+       return 0;
+}
+#endif /* HAVE_XCB_DRI2 */
+
 #ifdef HAVE_LIBDRM_INTEL
 static drm_intel_bufmgr *
 piglit_intel_bufmgr_get(void)
@@ -85,6 +128,11 @@ piglit_intel_bufmgr_get(void)
        if (!piglit_drm_device_get())
                return NULL;
 
+#ifdef HAVE_XCB_DRI2
+       if (piglit_drm_x11_authenticate() < 0)
+               return NULL;
+#endif /* HAVE_XCB_DRI2 */
+
        mgr = intel_bufmgr_gem_init(piglit_drm_device_get(), batch_sz);
 
        return mgr;
-- 
1.8.1.2

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to