Ecore_X(cb): Make vsync code behave like xlib version and link against
authordevilhorns <devilhorns@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 21 Sep 2011 11:41:25 +0000 (11:41 +0000)
committerdevilhorns <devilhorns@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 21 Sep 2011 11:41:25 +0000 (11:41 +0000)
libdri/libGL/etc. Remove use of xcb_dri2 extension (for now).

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@63517 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_x/xcb/Makefile.am
src/lib/ecore_x/xcb/ecore_xcb_extensions.c
src/lib/ecore_x/xcb/ecore_xcb_vsync.c

index b5ca362..09f492d 100644 (file)
@@ -18,7 +18,6 @@ AM_CPPFLAGS = \
   @XCB_XTEST_CFLAGS@ \
   @XCB_XINPUT_CFLAGS@ \
   @XCB_CURSOR_CFLAGS@ \
-  @XCB_DRI_CFLAGS@ \
   @XCB_CFLAGS@ \
   @PIXMAN_CFLAGS@ \
   -I$(top_srcdir)/src/lib/ecore \
@@ -85,7 +84,6 @@ libecore_x_xcb_la_LIBADD = \
   @XCB_XTEST_LIBS@ \
   @XCB_XINPUT_LIBS@ \
   @XCB_CURSOR_LIBS@ \
-  @XCB_DRI_LIBS@ \
   @XCB_LIBS@ \
   @PIXMAN_LIBS@ \
   $(top_builddir)/src/lib/ecore/libecore.la \
index cd24997..7a73f2b 100644 (file)
@@ -60,9 +60,9 @@ _ecore_xcb_extensions_init(void)
    _ecore_xcb_input_init();
 #endif
 
-#ifdef ECORE_XCB_DRI
-   _ecore_xcb_dri_init();
-#endif
+/* #ifdef ECORE_XCB_DRI */
+/*    _ecore_xcb_dri_init(); */
+/* #endif */
 
 #ifdef ECORE_XCB_XTEST
    _ecore_xcb_xtest_init();
@@ -127,9 +127,9 @@ _ecore_xcb_extensions_finalize(void)
    _ecore_xcb_input_finalize();
 #endif
 
-#ifdef ECORE_XCB_DRI
-   _ecore_xcb_dri_finalize();
-#endif
+/* #ifdef ECORE_XCB_DRI */
+/*    _ecore_xcb_dri_finalize(); */
+/* #endif */
 
 #ifdef ECORE_XCB_XTEST
    _ecore_xcb_xtest_finalize();
index 9f18d51..22a4444 100644 (file)
@@ -1,14 +1,12 @@
 #include "ecore_xcb_private.h"
-#ifdef ECORE_XCB_DRI
 # include <fcntl.h>
 # include <dlfcn.h>
-# include <xcb/dri2.h>
-#endif
+# include <X11/Xlib-xcb.h>
 
 #define ECORE_XCB_VSYNC_DRI2 1
 #define DRM_EVENT_CONTEXT_VERSION 2
 
-#ifdef ECORE_XCB_DRI
+#ifdef ECORE_XCB_VSYNC_DRI2
 
 /* relevant header bits of dri/drm inlined here to avoid needing external */
 /* headers to build drm */
@@ -57,7 +55,11 @@ static int (*sym_drmGetMagic) (int fd, drm_magic_t * magic) = NULL;
 static int (*sym_drmWaitVBlank) (int fd, drmVBlank *vbl) = NULL;
 static int (*sym_drmHandleEvent) (int fd, drmEventContext *evctx) = NULL;
 
-#endif
+/* dri */
+static Bool (*sym_DRI2QueryExtension) (Display *display, int *eventBase, int *errorBase) = NULL;
+static Bool (*sym_DRI2QueryVersion) (Display *display, int *major, int *minor) = NULL;
+static Bool (*sym_DRI2Connect) (Display *display, XID window, char **driverName, char **deviceName) = NULL;
+static Bool (*sym_DRI2Authenticate) (Display *display, XID window, drm_magic_t magic) = NULL;
 
 /* local function prototypes */
 static Eina_Bool _ecore_xcb_dri_link(void);
@@ -71,14 +73,13 @@ static void _ecore_xcb_dri_tick_schedule(void);
 static void _ecore_xcb_dri_vblank_handler(int fd __UNUSED__, unsigned int frame __UNUSED__, unsigned int sec __UNUSED__, unsigned int usec __UNUSED__, void *data __UNUSED__);
 
 /* local variables */
-static Eina_Bool _dri2_avail = EINA_FALSE;
 static Ecore_X_Window _vsync_root = 0;
 static int _drm_fd = -1;
 static Ecore_Fd_Handler *_drm_fdh = NULL;
 static unsigned int _drm_magic = 0;
 static Eina_Bool _drm_event_busy = EINA_FALSE;
 static void *_drm_lib = NULL;
-#ifdef ECORE_XCB_DRI
+static void *_dri_lib = NULL;
 static drmEventContext _drm_evctx;
 #endif
 
@@ -86,55 +87,25 @@ void
 _ecore_xcb_dri_init(void) 
 {
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
-
-#ifdef ECORE_XCB_DRI
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_dri2_id);
-#endif
 }
 
 void 
 _ecore_xcb_dri_finalize(void) 
 {
-#ifdef ECORE_XCB_DRI
-   const xcb_query_extension_reply_t *ext_reply;
-#endif
-
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
-
-#ifdef ECORE_XCB_DRI
-   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_dri2_id);
-   if ((ext_reply) && (ext_reply->present))
-     {
-        xcb_dri2_query_version_cookie_t dcookie;
-        xcb_dri2_query_version_reply_t *dreply;
-
-        dcookie = 
-          xcb_dri2_query_version_unchecked(_ecore_xcb_conn, 
-                                           XCB_DRI2_MAJOR_VERSION, 
-                                           XCB_DRI2_MINOR_VERSION);
-        dreply = xcb_dri2_query_version_reply(_ecore_xcb_conn, dcookie, NULL);
-        if (dreply) 
-          {
-             if (dreply->major_version >= 2) _dri2_avail = EINA_TRUE;
-             free(dreply);
-          }
-     }
-#endif
 }
 
 EAPI Eina_Bool 
 ecore_x_vsync_animator_tick_source_set(Ecore_X_Window win) 
 {
-#ifdef ECORE_XCB_DRI
+#ifdef ECORE_XCB_VSYNC_DRI2
    Ecore_X_Window root;
 #endif
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
    CHECK_XCB_CONN;
 
-   if (!_dri2_avail) return EINA_FALSE;
-
-#ifdef ECORE_XCB_DRI
+#ifdef ECORE_XCB_VSYNC_DRI2
    root = ecore_x_window_root_get(win);
    if (root != _vsync_root) 
      {
@@ -180,10 +151,10 @@ ecore_x_vsync_animator_tick_source_set(Ecore_X_Window win)
 }
 
 /* local functions */
+#ifdef ECORE_XCB_VSYNC_DRI2
 static Eina_Bool 
 _ecore_xcb_dri_link(void) 
 {
-#ifdef ECORE_XCB_DRI
    const char *_drm_libs[] = 
      {
         "libdrm.so.2", 
@@ -192,12 +163,24 @@ _ecore_xcb_dri_link(void)
         "libdrm.so", 
         NULL,
      };
+   const char *_dri_libs[] = 
+     {
+        "libdri2.so.2",
+        "libdri2.so.1",
+        "libdri2.so.0",
+        "libdri2.so",
+        "libGL.so.4",
+        "libGL.so.3",
+        "libGL.so.2",
+        "libGL.so.1",
+        "libGL.so.0",
+        "libGL.so",
+        NULL,
+     };
    int i = 0, fail = 0;
-#endif
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-#ifdef ECORE_XCB_DRI
 # define SYM(lib, xx) \
    do { \
       sym_## xx = dlsym(lib, #xx); \
@@ -229,53 +212,61 @@ _ecore_xcb_dri_link(void)
           }
      }
    if (!_drm_lib) return EINA_FALSE;
+   for (i = 0; _dri_libs[i]; i++) 
+     {
+        if ((_dri_lib = dlopen(_dri_libs[i], (RTLD_LOCAL | RTLD_LAZY)))) 
+          {
+             fail = 0;
+             SYM(_dri_lib, DRI2QueryExtension);
+             SYM(_dri_lib, DRI2QueryVersion);
+             SYM(_dri_lib, DRI2Connect);
+             SYM(_dri_lib, DRI2Authenticate);
+             if (fail) 
+               {
+                  dlclose(_dri_lib);
+                  _dri_lib = NULL;
+               }
+             else
+               break;
+          }
+     }
+   if (!_dri_lib) 
+     {
+        dlclose(_drm_lib);
+        _drm_lib = NULL;
+        return EINA_FALSE;
+     }
+
    return EINA_TRUE;
-#endif
-   return EINA_FALSE;
 }
 
 static Eina_Bool 
 _ecore_xcb_dri_start(void) 
 {
-#ifdef ECORE_XCB_DRI
-   xcb_dri2_connect_cookie_t cookie;
-   xcb_dri2_connect_reply_t *reply;
-   xcb_dri2_authenticate_cookie_t acookie;
-   xcb_dri2_authenticate_reply_t *areply;
-   char *device = NULL;
-#endif
-
-   LOGFN(__FILE__, __LINE__, __FUNCTION__);
-   CHECK_XCB_CONN;
-
-   if (!_dri2_avail) return EINA_FALSE;
-
-#ifdef ECORE_XCB_DRI
-   cookie = xcb_dri2_connect_unchecked(_ecore_xcb_conn, 
-                                       _vsync_root, XCB_DRI2_DRIVER_TYPE_DRI);
-   reply = xcb_dri2_connect_reply(_ecore_xcb_conn, cookie, NULL);
-   if (!reply) return EINA_FALSE;
-   device = xcb_dri2_connect_device_name(reply);
-   free(reply);
-
-   if (!(_drm_fd = open(device, O_RDWR))) 
-     {
-        _drm_fd = -1;
-        return EINA_FALSE;
-     }
+   Ecore_X_Display *disp;
+   int _dri2_event = 0, _dri2_error = 0;
+   int _dri2_major = 0, _dri2_minor = 0;
+   char *device = NULL, *driver = NULL;
+
+   disp = ecore_x_display_get();
+   if (!sym_DRI2QueryExtension(disp, &_dri2_event, &_dri2_error))
+     return 0;
+   if (!sym_DRI2QueryVersion(disp, &_dri2_major, &_dri2_minor))
+     return 0;
+   if (_dri2_major < 2) return 0;
+   if (!sym_DRI2Connect(disp, _vsync_root, &driver, &device))
+     return 0;
+
+   _drm_fd = open(device, O_RDWR);
+   if (_drm_fd < 0) return 0;
 
    sym_drmGetMagic(_drm_fd, &_drm_magic);
-
-   acookie = 
-     xcb_dri2_authenticate_unchecked(_ecore_xcb_conn, _vsync_root, _drm_magic);
-   areply = xcb_dri2_authenticate_reply(_ecore_xcb_conn, acookie, NULL);
-   if (!areply) 
+   if (!sym_DRI2Authenticate(disp, _vsync_root, _drm_magic))
      {
         close(_drm_fd);
         _drm_fd = -1;
         return EINA_FALSE;
      }
-   free(areply);
 
    memset(&_drm_evctx, 0, sizeof(_drm_evctx));
    _drm_evctx.version = DRM_EVENT_CONTEXT_VERSION;
@@ -292,9 +283,6 @@ _ecore_xcb_dri_start(void)
      }
 
    return EINA_TRUE;
-#endif
-
-   return EINA_FALSE;
 }
 
 static void 
@@ -315,9 +303,7 @@ _ecore_xcb_dri_shutdown(void)
 static Eina_Bool 
 _ecore_xcb_dri_cb(void *data __UNUSED__, Ecore_Fd_Handler *fdh __UNUSED__) 
 {
-#ifdef ECORE_XCB_DRI
    sym_drmHandleEvent(_drm_fd, &_drm_evctx);
-#endif
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -337,20 +323,16 @@ _ecore_xcb_dri_tick_end(void *data __UNUSED__)
 static void 
 _ecore_xcb_dri_tick_schedule(void) 
 {
-#ifdef ECORE_XCB_DRI
    drmVBlank vbl;
-#endif
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
    CHECK_XCB_CONN;
 
-#ifdef ECORE_XCB_DRI
    vbl.request.type = (DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT);
    vbl.request.sequence = 1;
    vbl.request.signal = 0;
 
    sym_drmWaitVBlank(_drm_fd, &vbl);
-#endif
 }
 
 static void 
@@ -359,3 +341,4 @@ _ecore_xcb_dri_vblank_handler(int fd __UNUSED__, unsigned int frame __UNUSED__,
    ecore_animator_custom_tick();
    if (_drm_event_busy) _ecore_xcb_dri_tick_schedule();
 }
+#endif