Я хочу создать контекст OpenGL через EGL. Поскольку я не буду рисовать, я хочу использовать Pbuffers в сочетании с платформой GBM. Это код (C99):
#include <stdlib.h>
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <gbm.h>
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 , &config , 1 , &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;
}
Это не удается со следующей ошибкой:
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);
Это страница, которую я взял в качестве примера.
Я удивлен, потому что я построил Mesa с помощью --with-egl-platforms=drm,wayland,x11
, и хотя указано здесь, что EGL_DEFAULT_DISPLAY
сопоставляется с первой указанной платформой, это псевдоним для _XDisplay *
в моей системе.
--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.
Насколько мне известно, Уэстон создает EGLDisplay поверх GBM для рисования на чистом KMS. Я просмотрел его код и просмотрел соответствующие системные заголовки в поисках решения, но, похоже, его там нет.
FWIW, я использую Mesa 10.0 на Radeon HD 3200, Linux 3.12.6, GCC 4.8.2.