mirror of
https://github.com/hyprwm/hyprlock.git
synced 2024-11-17 07:15:57 +01:00
80 lines
2.6 KiB
C++
80 lines
2.6 KiB
C++
|
#include "Egl.hpp"
|
||
|
#include "../helpers/Log.hpp"
|
||
|
|
||
|
PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT;
|
||
|
|
||
|
const EGLint config_attribs[] = {
|
||
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE,
|
||
|
};
|
||
|
|
||
|
const EGLint context_attribs[] = {
|
||
|
EGL_CONTEXT_CLIENT_VERSION,
|
||
|
2,
|
||
|
EGL_NONE,
|
||
|
};
|
||
|
|
||
|
CEGL::CEGL(wl_display* display) {
|
||
|
const char* _EXTS = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
|
||
|
if (!_EXTS) {
|
||
|
if (eglGetError() == EGL_BAD_DISPLAY)
|
||
|
throw std::runtime_error("EGL_EXT_client_extensions not supported");
|
||
|
else
|
||
|
throw std::runtime_error("Failed to query EGL client extensions");
|
||
|
}
|
||
|
|
||
|
std::string EXTS = _EXTS;
|
||
|
|
||
|
if (!EXTS.contains("EGL_EXT_platform_base"))
|
||
|
throw std::runtime_error("EGL_EXT_platform_base not supported");
|
||
|
|
||
|
if (!EXTS.contains("EGL_EXT_platform_wayland"))
|
||
|
throw std::runtime_error("EGL_EXT_platform_wayland not supported");
|
||
|
|
||
|
eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT");
|
||
|
if (eglGetPlatformDisplayEXT == NULL)
|
||
|
throw std::runtime_error("Failed to get eglGetPlatformDisplayEXT");
|
||
|
|
||
|
eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
|
||
|
if (eglCreatePlatformWindowSurfaceEXT == NULL)
|
||
|
throw std::runtime_error("Failed to get eglCreatePlatformWindowSurfaceEXT");
|
||
|
|
||
|
eglDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_WAYLAND_EXT, display, NULL);
|
||
|
EGLint matched = 0;
|
||
|
if (eglDisplay == EGL_NO_DISPLAY) {
|
||
|
Debug::log(CRIT, "Failed to create EGL display");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (eglInitialize(eglDisplay, NULL, NULL) == EGL_FALSE) {
|
||
|
Debug::log(CRIT, "Failed to initialize EGL");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (!eglChooseConfig(eglDisplay, config_attribs, &eglConfig, 1, &matched)) {
|
||
|
Debug::log(CRIT, "eglChooseConfig failed");
|
||
|
goto error;
|
||
|
}
|
||
|
if (matched == 0) {
|
||
|
Debug::log(CRIT, "Failed to match an EGL config");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, context_attribs);
|
||
|
if (eglContext == EGL_NO_CONTEXT) {
|
||
|
Debug::log(CRIT, "Failed to create EGL context");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
|
||
|
error:
|
||
|
eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||
|
if (eglDisplay)
|
||
|
eglTerminate(eglDisplay);
|
||
|
|
||
|
eglReleaseThread();
|
||
|
}
|
||
|
|
||
|
void CEGL::makeCurrent(EGLSurface surf) {
|
||
|
eglMakeCurrent(eglDisplay, surf, surf, eglContext);
|
||
|
}
|