aboutsummaryrefslogtreecommitdiff
path: root/render/egl.c
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2017-10-08 10:04:33 -0400
committerGitHub <noreply@github.com>2017-10-08 10:04:33 -0400
commit1908d88fab23660e863928d8fc874bad4593b087 (patch)
tree6c04d433e9a1203554639d21fad3f1197cef5cee /render/egl.c
parent2f36e78de1da5ca8ef3a975674b02bcc988cd06a (diff)
parentc0e5feea37dbc95675face03bc4707ad09db20b8 (diff)
Merge pull request #236 from ascent12/gl-loader
Add GL/EGL extension loader generator
Diffstat (limited to 'render/egl.c')
-rw-r--r--render/egl.c61
1 files changed, 15 insertions, 46 deletions
diff --git a/render/egl.c b/render/egl.c
index 82dea50c..9815b923 100644
--- a/render/egl.c
+++ b/render/egl.c
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include <wlr/util/log.h>
#include <wlr/egl.h>
+#include "render/glapi.h"
// Extension documentation
// https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_image_base.txt.
@@ -46,27 +47,6 @@ const char *egl_error(void) {
}
}
-static bool egl_exts(struct wlr_egl *egl) {
- egl->get_platform_display = (PFNEGLGETPLATFORMDISPLAYEXTPROC)
- eglGetProcAddress("eglGetPlatformDisplayEXT");
-
- if (!egl->get_platform_display) {
- wlr_log(L_ERROR, "Failed to load EGL extension 'eglGetPlatformDisplayEXT'");
- return false;
- }
-
- egl->create_platform_window_surface = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)
- eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
-
- if (!egl->create_platform_window_surface) {
- wlr_log(L_ERROR,
- "Failed to load EGL extension 'eglCreatePlatformWindowSurfaceEXT'");
- return false;
- }
-
- return true;
-}
-
static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLint visual_id) {
EGLint count = 0, matched = 0, ret;
@@ -103,7 +83,7 @@ static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLint visual_id) {
bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, EGLint visual_id,
void *remote_display) {
- if (!egl_exts(egl)) {
+ if (!load_glapi()) {
return false;
}
@@ -112,7 +92,7 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, EGLint visual_id,
goto error;
}
- egl->display = egl->get_platform_display(platform, remote_display, NULL);
+ egl->display = eglGetPlatformDisplayEXT(platform, remote_display, NULL);
if (egl->display == EGL_NO_DISPLAY) {
wlr_log(L_ERROR, "Failed to create EGL display: %s", egl_error());
goto error;
@@ -142,22 +122,11 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, EGLint visual_id,
eglMakeCurrent(egl->display, EGL_NO_SURFACE, EGL_NO_SURFACE, egl->context);
egl->egl_exts = eglQueryString(egl->display, EGL_EXTENSIONS);
if (strstr(egl->egl_exts, "EGL_WL_bind_wayland_display") == NULL ||
- strstr(egl->egl_exts, "EGL_KHR_image_base") == NULL) {
+ strstr(egl->egl_exts, "EGL_KHR_image_base") == NULL) {
wlr_log(L_ERROR, "Required egl extensions not supported");
goto error;
}
- egl->eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC)
- eglGetProcAddress("eglCreateImageKHR");
- egl->eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)
- eglGetProcAddress("eglDestroyImageKHR");
- egl->eglQueryWaylandBufferWL = (PFNEGLQUERYWAYLANDBUFFERWL)
- (void*) eglGetProcAddress("eglQueryWaylandBufferWL");
- egl->eglBindWaylandDisplayWL = (PFNEGLBINDWAYLANDDISPLAYWL)
- (void*) eglGetProcAddress("eglBindWaylandDisplayWL");
- egl->eglUnbindWaylandDisplayWL = (PFNEGLUNBINDWAYLANDDISPLAYWL)
- (void*) eglGetProcAddress("eglUnbindWaylandDisplayWL");
-
egl->gl_exts = (const char*) glGetString(GL_EXTENSIONS);
wlr_log(L_INFO, "Using EGL %d.%d", (int)major, (int)minor);
wlr_log(L_INFO, "Supported EGL extensions: %s", egl->egl_exts);
@@ -174,8 +143,8 @@ error:
void wlr_egl_free(struct wlr_egl *egl) {
eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
- if (egl->wl_display && egl->eglUnbindWaylandDisplayWL) {
- egl->eglUnbindWaylandDisplayWL(egl->display, egl->wl_display);
+ if (egl->wl_display && eglUnbindWaylandDisplayWL) {
+ eglUnbindWaylandDisplayWL(egl->display, egl->wl_display);
}
eglDestroyContext(egl->display, egl->context);
@@ -184,11 +153,11 @@ void wlr_egl_free(struct wlr_egl *egl) {
}
bool wlr_egl_bind_display(struct wlr_egl *egl, struct wl_display *local_display) {
- if (!egl->eglBindWaylandDisplayWL) {
+ if (!eglBindWaylandDisplayWL) {
return false;
}
- if (egl->eglBindWaylandDisplayWL(egl->display, local_display)) {
+ if (eglBindWaylandDisplayWL(egl->display, local_display)) {
egl->wl_display = local_display;
return true;
}
@@ -198,33 +167,33 @@ bool wlr_egl_bind_display(struct wlr_egl *egl, struct wl_display *local_display)
bool wlr_egl_query_buffer(struct wlr_egl *egl, struct wl_resource *buf,
int attrib, int *value) {
- if (!egl->eglQueryWaylandBufferWL) {
+ if (!eglQueryWaylandBufferWL) {
return false;
}
- return egl->eglQueryWaylandBufferWL(egl->display, buf, attrib, value);
+ return eglQueryWaylandBufferWL(egl->display, buf, attrib, value);
}
EGLImage wlr_egl_create_image(struct wlr_egl *egl, EGLenum target,
EGLClientBuffer buffer, const EGLint *attribs) {
- if (!egl->eglCreateImageKHR) {
+ if (!eglCreateImageKHR) {
return false;
}
- return egl->eglCreateImageKHR(egl->display, egl->context, target,
+ return eglCreateImageKHR(egl->display, egl->context, target,
buffer, attribs);
}
bool wlr_egl_destroy_image(struct wlr_egl *egl, EGLImage image) {
- if (!egl->eglDestroyImageKHR) {
+ if (!eglDestroyImageKHR) {
return false;
}
- egl->eglDestroyImageKHR(egl->display, image);
+ eglDestroyImageKHR(egl->display, image);
return true;
}
EGLSurface wlr_egl_create_surface(struct wlr_egl *egl, void *window) {
- EGLSurface surf = egl->create_platform_window_surface(egl->display, egl->config,
+ EGLSurface surf = eglCreatePlatformWindowSurfaceEXT(egl->display, egl->config,
window, NULL);
if (surf == EGL_NO_SURFACE) {
wlr_log(L_ERROR, "Failed to create EGL surface: %s", egl_error());