Mesa Generic Buffer Management (GBM)
Sep 162016Introduction
GBM is an minimalist API which provides a mechanism for allocating buffers for graphics rendering tied to Mesa. GBM is intended to be used as a native platform for EGL on drm. The handle it creates can be used to initialize EGL and to create render target buffers.
Traits
EGL/GBM does not support Pbuffers and Pixmaps.
Off-screen surface should be created by invocation of eglCreateWindowSurface and it would be always off-screen since GBM does not provide window management.
If you want to move it to the display you would need to use kernel KMS API.
Basic code
There is a simple example of application using DRM, GBM and EGL for initialization and cleanup of graphics state.
#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()
{
assert( eglBindAPI( EGL_OPENGL_API ) == EGL_TRUE );
int fd = open("/dev/dri/card0", O_RDWR);
struct gbm_device * gbm = gbm_create_device( fd );
struct gbm_surface * gbm_surf = gbm_surface_create( gbm, 256, 256, GBM_FORMAT_XRGB8888, GBM_BO_USE_RENDERING);
EGLDisplay dpy = eglGetPlatformDisplayEXT( EGL_PLATFORM_GBM_MESA, gbm, NULL );
eglInitialize( dpy , NULL , NULL );
EGLConfig config;
EGLint n_of_configs;
assert( eglGetConfigs( dpy , &config , 1 , &n_of_configs ) == EGL_TRUE );
EGLSurface srf = eglCreatePlatformWindowSurfaceEXT( dpy, config, gbm_surf, 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;
}