Created
October 20, 2019 17:49
-
-
Save sfalexrog/b0957dc8f6fc0b04e6e724ce4a09e769 to your computer and use it in GitHub Desktop.
Windowless EGL on a Raspberry Pi 4 using GBM
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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