Merge branch 'texformat-rework'
[mesa.git] / src / egl / drivers / glx / egl_glx.c
index e09cbe744e3e381dc4acff87699a1a076775376f..96292b0e9e867f8479980a32c01777d495ee9f8c 100644 (file)
@@ -37,7 +37,6 @@
 #include <string.h>
 #include <X11/Xlib.h>
 #include <GL/glx.h>
-#include <dlfcn.h>
 
 #include "eglconfigutil.h"
 #include "eglconfig.h"
@@ -616,8 +615,7 @@ GLX_eglCreateContext(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
       return NULL;
    }
 
-#ifdef GLX_VERSION_1_3
-   if (GLX_dpy->fbconfigs)
+   if (GLX_dpy->have_fbconfig)
       GLX_ctx->context =
          glXCreateNewContext(GLX_dpy->dpy,
                              GLX_dpy->fbconfigs[GLX_egl_config_index(conf)],
@@ -625,7 +623,6 @@ GLX_eglCreateContext(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
                              GLX_ctx_shared ? GLX_ctx_shared->context : NULL,
                              GL_TRUE);
    else
-#endif
       GLX_ctx->context =
          glXCreateContext(GLX_dpy->dpy,
                           &GLX_dpy->visuals[GLX_egl_config_index(conf)],
@@ -636,15 +633,6 @@ GLX_eglCreateContext(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
       return NULL;
    }
 
-#if 1
-   /* (maybe?) need to have a direct rendering context */
-   if (!glXIsDirect(GLX_dpy->dpy, GLX_ctx->context)) {
-      glXDestroyContext(GLX_dpy->dpy, GLX_ctx->context);
-      free(GLX_ctx);
-      return NULL;
-   }
-#endif
-
    return &GLX_ctx->Base;
 }
 
@@ -670,13 +658,10 @@ GLX_eglMakeCurrent(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
    rdraw = (GLX_rsurf) ? GLX_rsurf->glx_drawable : None;
    cctx = (GLX_ctx) ? GLX_ctx->context : NULL;
 
-#ifdef GLX_VERSION_1_3
-   if (glXMakeContextCurrent(GLX_dpy->dpy, ddraw, rdraw, cctx))
-      return EGL_TRUE;
-#endif
-
-   if (ddraw == rdraw && glXMakeCurrent(GLX_dpy->dpy, ddraw, cctx))
-      return EGL_TRUE;
+   if (GLX_dpy->have_make_current_read)
+      return glXMakeContextCurrent(GLX_dpy->dpy, ddraw, rdraw, cctx);
+   else if (ddraw == rdraw)
+      return glXMakeCurrent(GLX_dpy->dpy, ddraw, cctx);
 
    return EGL_FALSE;
 }
@@ -916,23 +901,24 @@ GLX_eglSwapBuffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
 static _EGLProc
 GLX_eglGetProcAddress(const char *procname)
 {
-   /* This is a bit of a hack to get at the gallium/Mesa state tracker
-    * function st_get_proc_address().  This will probably change at
-    * some point.
-    */
-   _EGLProc (*get_proc_addr)(const char *procname);
-   _EGLProc proc_addr;
-   get_proc_addr = dlsym(NULL, "st_get_proc_address");
-   if (get_proc_addr)
-      return get_proc_addr(procname);
-
-   proc_addr = glXGetProcAddress((const GLubyte *)procname);
-   if (proc_addr)
-      return proc_addr;
-
-   return (_EGLProc)dlsym(NULL, procname);
+   return (_EGLProc) glXGetProcAddress((const GLubyte *) procname);
 }
 
+static EGLBoolean
+GLX_eglWaitClient(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
+{
+   glXWaitGL();
+   return EGL_TRUE;
+}
+
+static EGLBoolean
+GLX_eglWaitNative(_EGLDriver *drv, _EGLDisplay *dpy, EGLint engine)
+{
+   if (engine != EGL_CORE_NATIVE_ENGINE)
+      return _eglError(EGL_BAD_PARAMETER, "eglWaitNative");
+   glXWaitX();
+   return EGL_TRUE;
+}
 
 static void
 GLX_Unload(_EGLDriver *drv)
@@ -965,6 +951,8 @@ _eglMain(const char *args)
    GLX_drv->Base.API.DestroySurface = GLX_eglDestroySurface;
    GLX_drv->Base.API.SwapBuffers = GLX_eglSwapBuffers;
    GLX_drv->Base.API.GetProcAddress = GLX_eglGetProcAddress;
+   GLX_drv->Base.API.WaitClient = GLX_eglWaitClient;
+   GLX_drv->Base.API.WaitNative = GLX_eglWaitNative;
 
    GLX_drv->Base.Name = "GLX";
    GLX_drv->Base.Unload = GLX_Unload;