SEVirt

Make it secure

Mesa Generic Buffer Management (GBM)

Sep 162016

Introduction

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; }

 Reference

  1. EGL_MESA_platform_gbm

Atom

Powered by SeVirt