title: EGLDisplay on GBM
body: <p>I want to create an OpenGL context through EGL. As I won't actually draw, I want to use Pbuffers in conjunction with the GBM platform. This is the code (C99):</p>
  
  <pre><code>#include &lt;stdlib.h&gt;
  #include &lt;assert.h&gt;
  
  #include &lt;fcntl.h&gt;
  #include &lt;unistd.h&gt;
  
  #include &lt;EGL/egl.h&gt;
  #include &lt;EGL/eglext.h&gt;
  
  #include &lt;gbm.h&gt;
  
  
  int main( void )
  {
      assert( eglBindAPI( EGL_OPENGL_API ) == EGL_TRUE );
  
      int fd = open("/dev/dri/card0", O_RDWR);
      struct gbm_device * gbm = gbm_create_device( fd );
  
      EGLDisplay dpy = eglGetDisplay( gbm );
      eglInitialize( dpy , NULL , NULL );
  
      EGLConfig config;
      EGLint n_of_configs;
      assert( eglGetConfigs( dpy , &amp;config , 1 , &amp;n_of_configs ) == EGL_TRUE );
  
      EGLSurface srf = eglCreatePbufferSurface( dpy , config , NULL );
      assert( srf != EGL_NO_SURFACE );
  
      EGLContext ctx = eglCreateContext( dpy , config , EGL_NO_CONTEXT , NULL );
      assert( ctx != EGL_NO_CONTEXT );
  
      assert( eglMakeCurrent( dpy , srf , srf , ctx ) == EGL_TRUE );
  
      eglDestroySurface( dpy , srf );
      eglDestroyContext( dpy , ctx );
      eglTerminate( dpy );
  
      gbm_device_destroy( gbm );
      close( fd );
  
      return EXIT_SUCCESS;
  }
  </code></pre>
  
  <p>It fails with the following error:</p>
  
  <pre><code>test.c: In function ‘main’:
  test.c:20:2: error: passing argument 1 of ‘eglGetDisplay’ from incompatible pointer type [-Werror]
    EGLDisplay dpy = eglGetDisplay( gbm );
    ^
  In file included from test.c:7:0:
  /usr/include/EGL/egl.h:251:31: note: expected ‘EGLNativeDisplayType’ but argument is of type ‘struct gbm_device *’
   EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id);
  </code></pre>
  
  <p><a href="http://virtuousgeek.org/blog/index.php/jbarnes/2011/10/31/writing_stanalone_programs_with_egl_and_" rel="noreferrer">This</a> is the page I took as example.</p>
  
  <p>I'm surprised, because I built Mesa with <code>--with-egl-platforms=drm,wayland,x11</code>, and, even though it is stated <a href="http://www.mesa3d.org/egl.html" rel="noreferrer">here</a> that <code>EGL_DEFAULT_DISPLAY</code> maps to the first platform specified, it is an alias for <code>_XDisplay *</code> on my system.</p>
  
  <pre><code>--with-egl-platforms
  List the platforms (window systems) to support. Its argument is a comma seprated string such as --with-egl-platforms=x11,drm. It decides the platforms a driver may support. The first listed platform is also used by the main library to decide the native platform: the platform the EGL native types such as EGLNativeDisplayType or EGLNativeWindowType defined for.
  </code></pre>
  
  <p>AFAIK, Weston creates an EGLDisplay on top of GBM for drawing on bare KMS. I've looked at its code, and I've grepped the pertinent system headers looking for a solution, but it seems to not be there.</p>
  
  <p>FWIW, I'm using Mesa 10.0 on a Radeon HD 3200, Linux 3.12.6, GCC 4.8.2.</p>