EGLDisplay на GBM

Я хочу создать контекст 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.


person Kalrish    schedule 28.12.2013    source источник


Ответы (1)


Ты говоришь

Я хочу использовать Pbuffers вместе с платформой GBM.

EGL/GBM не поддерживает Pbuffers. Он также не поддерживает Pixmaps.

Чтобы создать внеэкранную поверхность с помощью EGL/GBM, вы должны передать gbm_surface в eglCreateWindowSurface. "Окно" - неправильное название. Никакого реального «окна» не создается. Результирующий буфер останется за пределами экрана, если только вы не используете KMS API ядра для публикации его на дисплее.

Но... не поэтому ваша программа не компилируется. При вызове eglGetDisplay и eglCreateWindowSurface вы должны выполнить приведение следующим образом:

eglGetDisplay((EGLNativeDisplayType)my_gbm_device);
eglCreateWindowSurface(egl_dpy, egl_config,
                       (EGLNativeWindowType)my_gbm_surface, NULL);

Если вы используете Mesa, содержащую коммит 468cc86, то вы можете избежать приведения, используя вместо этого eglGetPlatformDisplayEXT и eglCreatePlatformWindowSurface следующим образом:

eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA, my_gbm_device, NULL);
eglCreatePlatformWindowSurfaceEXT(egl_dpy, egl_config, my_gbm_surface, NULL);

Независимо от того, решите ли вы использовать стандартные функции EGL или функции EGL новой платформы, вам следует обратиться к примеру кода в файле EGL_MESA_platform_gbm в качестве руководства.

person Chadversary    schedule 19.04.2014
comment
Спасибо за информацию! Я не знал, что платформа GBM не поддерживает Pbuffers. Что касается расширений платформы EGL, то я на них уже перешел, и они идеально подходят для моего дизайна. - person Kalrish; 20.04.2014
comment
Вы начали использовать расширения платформы, прежде чем я ответил? Если да, то как вы узнали о них? Я спрашиваю, потому что я написал спецификации расширения платформы, а также их реализацию в Mesa, и я хотел бы знать, как знания о новых функциях EGL, подобных этой, доходят до таких пользователей, как вы. - person Chadversary; 23.04.2014
comment
Я просто продолжал искать. Извините, но я не могу вспомнить, какие условия поиска я использовал. Я задал здесь вопрос, на который вы ответили, но ресурсы, на которые вы ссылались, всегда были первыми в моих поисках. Мне помог сам код Mesa. Однако вот несколько хороших примеров: khronos.org/ реестр/egl/sdk/docs/man/html/eglIntro.xhtml phoronix.com/forums/ cgit.freedesktop.org/mesa/demos/tree/src/egl/eglut - person Kalrish; 24.04.2014