我想通过EGL创建一个OpenGL上下文。由于我不会实际绘制,所以我希望结合GBM平台使用Pbuffers。这是代码(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);这是我举的页面为例。
我很惊讶,因为我用--with-egl-platforms=drm,wayland,x11构建了Mesa,尽管这里声明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.AFAIK,Weston在GBM之上创建一个EGLDisplay,用于绘制裸KMS。我已经看过它的代码,我已经在相关的系统头上寻找解决方案,但是它似乎不在那里。
FWIW,我在Radeon HD 3200,Linux 3.12.6,GCC 4.8.2上使用Mesa 10.0。
发布于 2014-04-19 06:04:57
你说
我想结合GBM平台使用Pbuffers。
EGL/GBM不支持Pbuffers。它也不支持Pixmap。
若要使用EGL/GBM创建屏幕外界面,必须将gbm_surface传递给eglCreateWindowSurface。“窗口”是用词不当。没有真正的“窗口”被创建。除非使用内核的KMS API将其发布到显示,否则生成的缓冲区将保持在屏幕外。
但是..。这不是你的程序无法编译的原因。当调用eglGetDisplay和eglCreateWindowSurface时,必须像这样进行强制转换:
eglGetDisplay((EGLNativeDisplayType)my_gbm_device);
eglCreateWindowSurface(egl_dpy, egl_config,
(EGLNativeWindowType)my_gbm_surface, NULL);如果您使用的是包含commit 468cc86的Mesa,那么可以通过使用eglGetPlatformDisplayEXT和eglCreatePlatformWindowSurface来避免转换,如下所示:
eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA, my_gbm_device, NULL);
eglCreatePlatformWindowSurfaceEXT(egl_dpy, egl_config, my_gbm_surface, NULL);无论您选择使用普通的EGL函数还是更新的平台EGL函数,您都应该参考gbm规范中的示例代码作为指南。
https://stackoverflow.com/questions/20816844
复制相似问题