Skip to content

Instantly share code, notes, and snippets.

@sfalexrog
Created October 20, 2019 17:49
Show Gist options
  • Save sfalexrog/b0957dc8f6fc0b04e6e724ce4a09e769 to your computer and use it in GitHub Desktop.
Save sfalexrog/b0957dc8f6fc0b04e6e724ce4a09e769 to your computer and use it in GitHub Desktop.
Windowless EGL on a Raspberry Pi 4 using GBM
#include <iostream>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <GLES2/gl2.h>
#include <assert.h>
#include <fcntl.h>
#include <gbm.h>
#include <unistd.h>
#define CHECK_EGL_ERROR() { EGLint error = eglGetError(); if (error != EGL_SUCCESS) {std::cerr << "EGL error at " << __LINE__ << ": " << std::hex << error << std::dec << std::endl;} }
int main(int argc, char** argv)
{
EGLDisplay display;
const int MAX_NUM_CONFIG = 50;
EGLConfig config[MAX_NUM_CONFIG];
EGLContext context;
EGLSurface surface;
EGLint numConfig;
EGLint major, minor;
EGLint attribList[] = {
// EGL_CONFORMANT, EGL_OPENGL_ES2_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
// EGL_RED_SIZE, 8,
// EGL_GREEN_SIZE, 8,
// EGL_BLUE_SIZE, 8,
EGL_NONE
};
EGLint ctxAttribList[] = {
EGL_CONTEXT_MAJOR_VERSION, 2,
EGL_CONTEXT_MINOR_VERSION, 0,
EGL_NONE
};
std::cerr << "client EGL_EXTENSIONS: " << eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS) << std::endl;
std::cerr << "=============" << std::endl;
int32_t fd = open("/dev/dri/renderD128", O_RDWR);
assert(fd > 0);
struct gbm_device *gbm = gbm_create_device(fd);
assert(gbm != NULL);
//display = eglGetDisplay(EGL_DEFAULT_DISPLAY); CHECK_EGL_ERROR();
//EGLAttrib display_attr[] = {EGL_NONE};
display = eglGetPlatformDisplay(EGL_PLATFORM_GBM_MESA, gbm, NULL);
std::cerr << "display: " << std::hex << display << std::endl;
assert(display != NULL);
EGLBoolean result = eglInitialize(display, &major, &minor); CHECK_EGL_ERROR();
if (result == EGL_FALSE)
{
std::cerr << "eglInitialize failed" << std::endl;
}
std::cout << "Initialized EGL context version " << major << "." << minor << std::endl;
std::cerr << "EGL_VERSION: " << eglQueryString(display, EGL_VERSION) << std::endl;
std::cerr << "EGL_CLIENT_APIS: " << eglQueryString(display, EGL_CLIENT_APIS) << std::endl;
std::cerr << "EGL_VENDOR: " << eglQueryString(display, EGL_VENDOR) << std::endl;
std::cerr << "display EGL_EXTENSIONS: " << eglQueryString(display, EGL_EXTENSIONS) << std::endl;
eglChooseConfig(display, attribList, config, MAX_NUM_CONFIG, &numConfig); CHECK_EGL_ERROR();
std::cout << "numConfig:" << numConfig << std::endl;
eglBindAPI(EGL_OPENGL_ES_API); CHECK_EGL_ERROR();
context = eglCreateContext(display, config[0], EGL_NO_CONTEXT, ctxAttribList); CHECK_EGL_ERROR();
eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, context); CHECK_EGL_ERROR();
std::cout << "Context created and ready to be used!" << std::endl;
std::cout << "Vendor: " << glGetString(GL_VENDOR) << std::endl;
std::cout << "Version: " << glGetString(GL_VERSION) << std::endl;
std::cout << "Renderer: " << glGetString(GL_RENDERER) << std::endl;
std::cout << "Shading language version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
std::cout << "Extensions: " << glGetString(GL_EXTENSIONS) << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment