examples: remove dependency on wlr_egl from clients

The specified clients in this commit used to rely on wlr_egl and
some of its related functions in order to render surfaces.

This is no longer the case as of this commit.
This commit is contained in:
Brandon Dowdy 2021-01-28 23:13:53 +00:00 committed by Simon Ser
parent 50b9921642
commit 34e7f69d69
11 changed files with 212 additions and 66 deletions

127
examples/egl_common.c Normal file
View file

@ -0,0 +1,127 @@
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include <wayland-client.h>
#include <wlr/util/log.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include "egl_common.h"
EGLDisplay egl_display;
EGLConfig egl_config;
EGLContext egl_context;
PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT;
PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC eglCreatePlatformWindowSurfaceEXT;
EGLint config_attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RED_SIZE, 1,
EGL_GREEN_SIZE, 1,
EGL_BLUE_SIZE, 1,
EGL_ALPHA_SIZE, 1,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE,
};
EGLint context_attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE,
};
bool egl_init(struct wl_display *display) {
const char *client_exts_str =
eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
if (client_exts_str == NULL) {
if (eglGetError() == EGL_BAD_DISPLAY) {
wlr_log(WLR_ERROR,
"EGL_EXT_client_extensions not supported");
} else {
wlr_log(WLR_ERROR,
"Failed to query EGL client extensions");
}
return false;
}
if (!strstr(client_exts_str, "EGL_EXT_platform_base")) {
wlr_log(WLR_ERROR, "EGL_EXT_platform_base not supported");
return false;
}
if (!strstr(client_exts_str, "EGL_EXT_platform_wayland")) {
wlr_log(WLR_ERROR, "EGL_EXT_platform_wayland not supported");
return false;
}
eglGetPlatformDisplayEXT =
(void *)eglGetProcAddress("eglGetPlatformDisplayEXT");
if (eglGetPlatformDisplayEXT == NULL) {
wlr_log(WLR_ERROR, "Failed to get eglGetPlatformDisplayEXT");
return false;
}
eglCreatePlatformWindowSurfaceEXT =
(void *)eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
if (eglCreatePlatformWindowSurfaceEXT == NULL) {
wlr_log(WLR_ERROR,
"Failed to get eglCreatePlatformWindowSurfaceEXT");
return false;
}
egl_display =
eglGetPlatformDisplayEXT(EGL_PLATFORM_WAYLAND_EXT,
display, NULL);
if (egl_display == EGL_NO_DISPLAY) {
wlr_log(WLR_ERROR, "Failed to create EGL display");
goto error;
}
EGLint major, minor;
if (eglInitialize(egl_display, &major, &minor) == EGL_FALSE) {
wlr_log(WLR_ERROR, "Failed to initialize EGL");
goto error;
}
EGLint matched = 0;
if (!eglChooseConfig(egl_display, config_attribs,
&egl_config, 1, &matched)) {
wlr_log(WLR_ERROR, "eglChooseConfig failed");
goto error;
}
if (matched == 0) {
wlr_log(WLR_ERROR, "Failed to match an EGL config");
goto error;
}
egl_context =
eglCreateContext(egl_display, egl_config,
EGL_NO_CONTEXT, context_attribs);
if (egl_context == EGL_NO_CONTEXT) {
wlr_log(WLR_ERROR, "Failed to create EGL context");
goto error;
}
return true;
error:
eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE,
EGL_NO_SURFACE, EGL_NO_CONTEXT);
if (egl_display) {
eglTerminate(egl_display);
}
eglReleaseThread();
return false;
}
void egl_finish(void) {
eglMakeCurrent(egl_display, EGL_NO_SURFACE,
EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(egl_display, egl_context);
eglTerminate(egl_display);
eglReleaseThread();
}

19
examples/egl_common.h Normal file
View file

@ -0,0 +1,19 @@
#ifndef _EGL_COMMON_H
#define _EGL_COMMON_H
#endif
#include <stdbool.h>
#include <wayland-client.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
extern EGLDisplay egl_display;
extern EGLConfig egl_config;
extern EGLContext egl_context;
extern PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC eglCreatePlatformWindowSurfaceEXT;
bool egl_init(struct wl_display *display);
void egl_finish(void);

View file

@ -5,6 +5,7 @@
#include <wayland-client.h> #include <wayland-client.h>
#include <wayland-egl.h> #include <wayland-egl.h>
#include <wlr/render/egl.h> #include <wlr/render/egl.h>
#include "egl_common.h"
#include "idle-inhibit-unstable-v1-client-protocol.h" #include "idle-inhibit-unstable-v1-client-protocol.h"
#include "xdg-shell-client-protocol.h" #include "xdg-shell-client-protocol.h"
@ -27,12 +28,11 @@ static struct xdg_wm_base *wm_base = NULL;
static struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = NULL; static struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = NULL;
static struct zwp_idle_inhibitor_v1 *idle_inhibitor = NULL; static struct zwp_idle_inhibitor_v1 *idle_inhibitor = NULL;
struct wlr_egl *egl;
struct wl_egl_window *egl_window; struct wl_egl_window *egl_window;
struct wlr_egl_surface *egl_surface; struct wlr_egl_surface *egl_surface;
static void draw(void) { static void draw(void) {
eglMakeCurrent(egl->display, egl_surface, egl_surface, egl->context); eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context);
float color[] = {1.0, 1.0, 0.0, 1.0}; float color[] = {1.0, 1.0, 0.0, 1.0};
if (idle_inhibitor) { if (idle_inhibitor) {
@ -43,7 +43,7 @@ static void draw(void) {
glClearColor(color[0], color[1], color[2], 1.0); glClearColor(color[0], color[1], color[2], 1.0);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(egl->display, egl_surface); eglSwapBuffers(egl_display, egl_surface);
} }
static void pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial, static void pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial,
@ -192,8 +192,7 @@ int main(int argc, char **argv) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
EGLint attribs[] = { EGL_NONE }; egl_init(display);
egl = wlr_egl_create(EGL_PLATFORM_WAYLAND_EXT, display, attribs);
struct wl_surface *surface = wl_compositor_create_surface(compositor); struct wl_surface *surface = wl_compositor_create_surface(compositor);
struct xdg_surface *xdg_surface = struct xdg_surface *xdg_surface =
@ -214,7 +213,8 @@ int main(int argc, char **argv) {
wl_surface_commit(surface); wl_surface_commit(surface);
egl_window = wl_egl_window_create(surface, width, height); egl_window = wl_egl_window_create(surface, width, height);
egl_surface = wlr_egl_create_surface(egl, egl_window); egl_surface = eglCreatePlatformWindowSurfaceEXT(
egl_display, egl_config, egl_window, NULL);
wl_display_roundtrip(display); wl_display_roundtrip(display);

View file

@ -6,6 +6,7 @@
#include <wayland-client.h> #include <wayland-client.h>
#include <wayland-egl.h> #include <wayland-egl.h>
#include <wlr/render/egl.h> #include <wlr/render/egl.h>
#include "egl_common.h"
#include "wlr-input-inhibitor-unstable-v1-client-protocol.h" #include "wlr-input-inhibitor-unstable-v1-client-protocol.h"
#include "xdg-shell-client-protocol.h" #include "xdg-shell-client-protocol.h"
@ -18,12 +19,11 @@ static struct xdg_wm_base *wm_base = NULL;
static struct zwlr_input_inhibit_manager_v1 *input_inhibit_manager = NULL; static struct zwlr_input_inhibit_manager_v1 *input_inhibit_manager = NULL;
static struct zwlr_input_inhibitor_v1 *input_inhibitor = NULL; static struct zwlr_input_inhibitor_v1 *input_inhibitor = NULL;
struct wlr_egl *egl;
struct wl_egl_window *egl_window; struct wl_egl_window *egl_window;
struct wlr_egl_surface *egl_surface; struct wlr_egl_surface *egl_surface;
static void render_frame(void) { static void render_frame(void) {
eglMakeCurrent(egl->display, egl_surface, egl_surface, egl->context); eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context);
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
if (keys) { if (keys) {
@ -33,7 +33,7 @@ static void render_frame(void) {
} }
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(egl->display, egl_surface); eglSwapBuffers(egl_display, egl_surface);
} }
static void xdg_surface_handle_configure(void *data, static void xdg_surface_handle_configure(void *data,
@ -157,8 +157,7 @@ int main(int argc, char **argv) {
input_inhibit_manager); input_inhibit_manager);
assert(input_inhibitor); assert(input_inhibitor);
EGLint attribs[] = { EGL_NONE }; egl_init(display);
egl = wlr_egl_create(EGL_PLATFORM_WAYLAND_EXT, display, attribs);
struct wl_surface *surface = wl_compositor_create_surface(compositor); struct wl_surface *surface = wl_compositor_create_surface(compositor);
assert(surface); assert(surface);
@ -174,7 +173,8 @@ int main(int argc, char **argv) {
wl_surface_commit(surface); wl_surface_commit(surface);
egl_window = wl_egl_window_create(surface, width, height); egl_window = wl_egl_window_create(surface, width, height);
egl_surface = wlr_egl_create_surface(egl, egl_window); egl_surface = eglCreatePlatformWindowSurfaceEXT(
egl_display, egl_config, egl_window, NULL);
wl_display_roundtrip(display); wl_display_roundtrip(display);

View file

@ -5,6 +5,7 @@
#include <wayland-client.h> #include <wayland-client.h>
#include <wayland-egl.h> #include <wayland-egl.h>
#include <wlr/render/egl.h> #include <wlr/render/egl.h>
#include "egl_common.h"
#include "keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h" #include "keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h"
#include "xdg-shell-client-protocol.h" #include "xdg-shell-client-protocol.h"
@ -33,12 +34,11 @@ static struct zwp_keyboard_shortcuts_inhibitor_v1 *
keyboard_shortcuts_inhibitor = NULL; keyboard_shortcuts_inhibitor = NULL;
static bool active = false; static bool active = false;
struct wlr_egl *egl;
struct wl_egl_window *egl_window; struct wl_egl_window *egl_window;
struct wlr_egl_surface *egl_surface; struct wlr_egl_surface *egl_surface;
static void draw(void) { static void draw(void) {
eglMakeCurrent(egl->display, egl_surface, egl_surface, egl->context); eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context);
float color[] = {1.0, 1.0, 0.0, 1.0}; float color[] = {1.0, 1.0, 0.0, 1.0};
if (keyboard_shortcuts_inhibitor) { if (keyboard_shortcuts_inhibitor) {
@ -49,7 +49,7 @@ static void draw(void) {
glClearColor(color[0], color[1], color[2], 1.0); glClearColor(color[0], color[1], color[2], 1.0);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(egl->display, egl_surface); eglSwapBuffers(egl_display, egl_surface);
} }
static void keyboard_shortcuts_inhibit_handle_active(void *data, static void keyboard_shortcuts_inhibit_handle_active(void *data,
@ -224,8 +224,7 @@ int main(int argc, char **argv) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
EGLint attribs[] = { EGL_NONE }; egl_init(display);
egl = wlr_egl_create(EGL_PLATFORM_WAYLAND_EXT, display, attribs);
struct wl_surface *surface = wl_compositor_create_surface(compositor); struct wl_surface *surface = wl_compositor_create_surface(compositor);
struct xdg_surface *xdg_surface = struct xdg_surface *xdg_surface =
@ -241,7 +240,8 @@ int main(int argc, char **argv) {
wl_surface_commit(surface); wl_surface_commit(surface);
egl_window = wl_egl_window_create(surface, width, height); egl_window = wl_egl_window_create(surface, width, height);
egl_surface = wlr_egl_create_surface(egl, egl_window); egl_surface = eglCreatePlatformWindowSurfaceEXT(
egl_display, egl_config, egl_window, NULL);
wl_display_roundtrip(display); wl_display_roundtrip(display);

View file

@ -13,6 +13,7 @@
#include <wayland-egl.h> #include <wayland-egl.h>
#include <wlr/render/egl.h> #include <wlr/render/egl.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include "egl_common.h"
#include "wlr-layer-shell-unstable-v1-client-protocol.h" #include "wlr-layer-shell-unstable-v1-client-protocol.h"
#include "xdg-shell-client-protocol.h" #include "xdg-shell-client-protocol.h"
@ -29,7 +30,6 @@ struct zwlr_layer_surface_v1 *layer_surface;
static struct wl_output *wl_output; static struct wl_output *wl_output;
struct wl_surface *wl_surface; struct wl_surface *wl_surface;
struct wlr_egl *egl;
struct wl_egl_window *egl_window; struct wl_egl_window *egl_window;
struct wlr_egl_surface *egl_surface; struct wlr_egl_surface *egl_surface;
struct wl_callback *frame_callback; struct wl_callback *frame_callback;
@ -94,7 +94,7 @@ static struct wl_callback_listener popup_frame_listener = {
}; };
static void draw(void) { static void draw(void) {
eglMakeCurrent(egl->display, egl_surface, egl_surface, egl->context); eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context);
struct timespec ts; struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts); clock_gettime(CLOCK_MONOTONIC, &ts);
@ -143,7 +143,7 @@ static void draw(void) {
frame_callback = wl_surface_frame(wl_surface); frame_callback = wl_surface_frame(wl_surface);
wl_callback_add_listener(frame_callback, &frame_listener, NULL); wl_callback_add_listener(frame_callback, &frame_listener, NULL);
eglSwapBuffers(egl->display, egl_surface); eglSwapBuffers(egl_display, egl_surface);
demo.last_frame = ts; demo.last_frame = ts;
} }
@ -151,7 +151,7 @@ static void draw(void) {
static void draw_popup(void) { static void draw_popup(void) {
static float alpha_mod = -0.01; static float alpha_mod = -0.01;
eglMakeCurrent(egl->display, popup_egl_surface, popup_egl_surface, egl->context); eglMakeCurrent(egl_display, popup_egl_surface, popup_egl_surface, egl_context);
glViewport(0, 0, popup_width, popup_height); glViewport(0, 0, popup_width, popup_height);
glClearColor(popup_red, 0.5f, 0.5f, popup_alpha); glClearColor(popup_red, 0.5f, 0.5f, popup_alpha);
popup_alpha += alpha_mod; popup_alpha += alpha_mod;
@ -163,7 +163,7 @@ static void draw_popup(void) {
popup_frame_callback = wl_surface_frame(popup_wl_surface); popup_frame_callback = wl_surface_frame(popup_wl_surface);
assert(popup_frame_callback); assert(popup_frame_callback);
wl_callback_add_listener(popup_frame_callback, &popup_frame_listener, NULL); wl_callback_add_listener(popup_frame_callback, &popup_frame_listener, NULL);
eglSwapBuffers(egl->display, popup_egl_surface); eglSwapBuffers(egl_display, popup_egl_surface);
wl_surface_commit(popup_wl_surface); wl_surface_commit(popup_wl_surface);
} }
@ -188,7 +188,7 @@ static void xdg_popup_configure(void *data, struct xdg_popup *xdg_popup,
} }
static void popup_destroy(void) { static void popup_destroy(void) {
wlr_egl_destroy_surface(egl, popup_egl_surface); eglDestroySurface(egl_display, popup_egl_surface);
wl_egl_window_destroy(popup_egl_window); wl_egl_window_destroy(popup_egl_window);
xdg_popup_destroy(popup); xdg_popup_destroy(popup);
wl_surface_destroy(popup_wl_surface); wl_surface_destroy(popup_wl_surface);
@ -242,8 +242,9 @@ static void create_popup(uint32_t serial) {
popup_wl_surface = surface; popup_wl_surface = surface;
popup_egl_window = wl_egl_window_create(surface, popup_width, popup_height); popup_egl_window = wl_egl_window_create(surface, popup_width, popup_height);
assert(popup_egl_window); assert(popup_egl_window);
popup_egl_surface = wlr_egl_create_surface(egl, popup_egl_window); popup_egl_surface = eglCreatePlatformWindowSurfaceEXT(
assert(popup_egl_surface); egl_display, egl_config, popup_egl_window, NULL);
assert(popup_egl_surface != EGL_NO_SURFACE);
draw_popup(); draw_popup();
} }
@ -260,7 +261,7 @@ static void layer_surface_configure(void *data,
static void layer_surface_closed(void *data, static void layer_surface_closed(void *data,
struct zwlr_layer_surface_v1 *surface) { struct zwlr_layer_surface_v1 *surface) {
wlr_egl_destroy_surface(egl, egl_surface); eglDestroySurface(egl_display, egl_surface);
wl_egl_window_destroy(egl_window); wl_egl_window_destroy(egl_window);
zwlr_layer_surface_v1_destroy(surface); zwlr_layer_surface_v1_destroy(surface);
wl_surface_destroy(wl_surface); wl_surface_destroy(wl_surface);
@ -631,8 +632,7 @@ int main(int argc, char **argv) {
cursor_surface = wl_compositor_create_surface(compositor); cursor_surface = wl_compositor_create_surface(compositor);
assert(cursor_surface); assert(cursor_surface);
EGLint attribs[] = { EGL_ALPHA_SIZE, 8, EGL_NONE }; egl_init(display);
egl = wlr_egl_create(EGL_PLATFORM_WAYLAND_EXT, display, attribs);
wl_surface = wl_compositor_create_surface(compositor); wl_surface = wl_compositor_create_surface(compositor);
assert(wl_surface); assert(wl_surface);
@ -654,8 +654,9 @@ int main(int argc, char **argv) {
egl_window = wl_egl_window_create(wl_surface, width, height); egl_window = wl_egl_window_create(wl_surface, width, height);
assert(egl_window); assert(egl_window);
egl_surface = wlr_egl_create_surface(egl, egl_window); egl_surface = eglCreatePlatformWindowSurfaceEXT(
assert(egl_surface); egl_display, egl_config, egl_window, NULL);
assert(egl_surface != EGL_NO_SURFACE);
wl_display_roundtrip(display); wl_display_roundtrip(display);
draw(); draw();

View file

@ -54,7 +54,7 @@ clients = {
'proto': ['kde-idle'], 'proto': ['kde-idle'],
}, },
'idle-inhibit': { 'idle-inhibit': {
'src': 'idle-inhibit.c', 'src': ['idle-inhibit.c', 'egl_common.c'],
'dep': [wayland_egl, wlroots], 'dep': [wayland_egl, wlroots],
'proto': [ 'proto': [
'idle-inhibit-unstable-v1', 'idle-inhibit-unstable-v1',
@ -62,7 +62,7 @@ clients = {
], ],
}, },
'keyboard-shortcuts-inhibit': { 'keyboard-shortcuts-inhibit': {
'src': 'keyboard-shortcuts-inhibit.c', 'src': ['keyboard-shortcuts-inhibit.c', 'egl_common.c'],
'dep': [wayland_egl, wayland_cursor, wlroots], 'dep': [wayland_egl, wayland_cursor, wlroots],
'proto': [ 'proto': [
'keyboard-shortcuts-inhibit-unstable-v1', 'keyboard-shortcuts-inhibit-unstable-v1',
@ -70,7 +70,7 @@ clients = {
], ],
}, },
'layer-shell': { 'layer-shell': {
'src': 'layer-shell.c', 'src': ['layer-shell.c', 'egl_common.c'],
'dep': [wayland_egl, wayland_cursor, wlroots], 'dep': [wayland_egl, wayland_cursor, wlroots],
'proto': [ 'proto': [
'wlr-layer-shell-unstable-v1', 'wlr-layer-shell-unstable-v1',
@ -78,7 +78,7 @@ clients = {
], ],
}, },
'input-inhibitor': { 'input-inhibitor': {
'src': 'input-inhibitor.c', 'src': ['input-inhibitor.c', 'egl_common.c'],
'dep': [wayland_egl, wayland_cursor, wlroots], 'dep': [wayland_egl, wayland_cursor, wlroots],
'proto': [ 'proto': [
'wlr-input-inhibitor-unstable-v1', 'wlr-input-inhibitor-unstable-v1',
@ -96,7 +96,7 @@ clients = {
'proto': ['wlr-output-power-management-unstable-v1'], 'proto': ['wlr-output-power-management-unstable-v1'],
}, },
'pointer-constraints': { 'pointer-constraints': {
'src': 'pointer-constraints.c', 'src': ['pointer-constraints.c', 'egl_common.c'],
'dep': [wayland_egl, wlroots], 'dep': [wayland_egl, wlroots],
'proto': [ 'proto': [
'pointer-constraints-unstable-v1', 'pointer-constraints-unstable-v1',
@ -104,7 +104,7 @@ clients = {
], ],
}, },
'relative-pointer': { 'relative-pointer': {
'src': 'relative-pointer-unstable-v1.c', 'src': ['relative-pointer-unstable-v1.c', 'egl_common.c'],
'dep': [wayland_egl, wlroots], 'dep': [wayland_egl, wlroots],
'proto': [ 'proto': [
'pointer-constraints-unstable-v1', 'pointer-constraints-unstable-v1',
@ -137,7 +137,7 @@ clients = {
], ],
}, },
'toplevel-decoration': { 'toplevel-decoration': {
'src': 'toplevel-decoration.c', 'src': ['toplevel-decoration.c', 'egl_common.c'],
'dep': [wayland_egl, wlroots], 'dep': [wayland_egl, wlroots],
'proto': [ 'proto': [
'xdg-decoration-unstable-v1', 'xdg-decoration-unstable-v1',
@ -154,7 +154,7 @@ clients = {
], ],
}, },
'text-input': { 'text-input': {
'src': 'text-input.c', 'src': ['text-input.c', 'egl_common.c'],
'dep': [wayland_egl, wayland_cursor, wlroots], 'dep': [wayland_egl, wayland_cursor, wlroots],
'proto': [ 'proto': [
'text-input-unstable-v3', 'text-input-unstable-v3',

View file

@ -6,6 +6,7 @@
#include <wayland-client.h> #include <wayland-client.h>
#include <wayland-egl.h> #include <wayland-egl.h>
#include <wlr/render/egl.h> #include <wlr/render/egl.h>
#include "egl_common.h"
#include "xdg-shell-client-protocol.h" #include "xdg-shell-client-protocol.h"
#include "pointer-constraints-unstable-v1-client-protocol.h" #include "pointer-constraints-unstable-v1-client-protocol.h"
@ -16,7 +17,6 @@ static struct wl_seat *seat = NULL;
static struct xdg_wm_base *wm_base = NULL; static struct xdg_wm_base *wm_base = NULL;
static struct zwp_pointer_constraints_v1 *pointer_constraints = NULL; static struct zwp_pointer_constraints_v1 *pointer_constraints = NULL;
struct wlr_egl *egl;
struct wl_egl_window *egl_window; struct wl_egl_window *egl_window;
struct wlr_egl_surface *egl_surface; struct wlr_egl_surface *egl_surface;
struct zwp_locked_pointer_v1* locked_pointer; struct zwp_locked_pointer_v1* locked_pointer;
@ -32,7 +32,7 @@ enum {
struct wl_region *regions[3]; struct wl_region *regions[3];
static void draw(void) { static void draw(void) {
eglMakeCurrent(egl->display, egl_surface, egl_surface, egl->context); eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context);
float color[] = {1.0, 1.0, 0.0, 1.0}; float color[] = {1.0, 1.0, 0.0, 1.0};
@ -40,7 +40,7 @@ static void draw(void) {
glClearColor(color[0], color[1], color[2], 1.0); glClearColor(color[0], color[1], color[2], 1.0);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(egl->display, egl_surface); eglSwapBuffers(egl_display, egl_surface);
} }
static void pointer_handle_button(void *data, struct wl_pointer *pointer, static void pointer_handle_button(void *data, struct wl_pointer *pointer,
@ -211,8 +211,7 @@ int main(int argc, char **argv) {
wl_region_add(joint_region, 256, 256, 256, 256); wl_region_add(joint_region, 256, 256, 256, 256);
regions[REGION_TYPE_JOINT] = joint_region; regions[REGION_TYPE_JOINT] = joint_region;
EGLint attribs[] = { EGL_NONE }; egl_init(display);
egl = wlr_egl_create(EGL_PLATFORM_WAYLAND_EXT, display, attribs);
struct wl_surface *surface = wl_compositor_create_surface(compositor); struct wl_surface *surface = wl_compositor_create_surface(compositor);
struct xdg_surface *xdg_surface = struct xdg_surface *xdg_surface =
@ -241,7 +240,8 @@ int main(int argc, char **argv) {
wl_surface_commit(surface); wl_surface_commit(surface);
egl_window = wl_egl_window_create(surface, width, height); egl_window = wl_egl_window_create(surface, width, height);
egl_surface = wlr_egl_create_surface(egl, egl_window); egl_surface = eglCreatePlatformWindowSurfaceEXT(
egl_display, egl_config, egl_window, NULL);
wl_display_roundtrip(display); wl_display_roundtrip(display);

View file

@ -5,6 +5,7 @@
#include <linux/input-event-codes.h> #include <linux/input-event-codes.h>
#include <wayland-egl.h> #include <wayland-egl.h>
#include <wlr/render/egl.h> #include <wlr/render/egl.h>
#include "egl_common.h"
#include "pointer-constraints-unstable-v1-client-protocol.h" #include "pointer-constraints-unstable-v1-client-protocol.h"
#include "relative-pointer-unstable-v1-client-protocol.h" #include "relative-pointer-unstable-v1-client-protocol.h"
#include "xdg-shell-client-protocol.h" #include "xdg-shell-client-protocol.h"
@ -17,7 +18,6 @@
*/ */
struct egl_info { struct egl_info {
struct wlr_egl *egl;
struct wl_egl_window *egl_window; struct wl_egl_window *egl_window;
struct wlr_egl_surface *egl_surface; struct wlr_egl_surface *egl_surface;
uint32_t width; uint32_t width;
@ -58,8 +58,8 @@ static struct wl_callback_listener surface_callback_listener = {
}; };
static void draw_init(struct egl_info *e) { static void draw_init(struct egl_info *e) {
eglMakeCurrent(e->egl->display, e->egl_surface, eglMakeCurrent(egl_display, e->egl_surface,
e->egl_surface, e->egl->context); e->egl_surface, egl_context);
glViewport(0, 0, e->width, e->height); glViewport(0, 0, e->width, e->height);
} }
@ -88,7 +88,7 @@ static void draw_end(struct egl_info *e) {
e->frame_callback = wl_surface_frame(e->surface); e->frame_callback = wl_surface_frame(e->surface);
wl_callback_add_listener(e->frame_callback, &surface_callback_listener, e); wl_callback_add_listener(e->frame_callback, &surface_callback_listener, e);
eglSwapBuffers(e->egl->display, e->egl_surface); eglSwapBuffers(egl_display, e->egl_surface);
} }
@ -170,8 +170,7 @@ static void xdg_toplevel_handle_configure(void *data,
static void xdg_toplevel_handle_close(void *data, static void xdg_toplevel_handle_close(void *data,
struct xdg_toplevel *xdg_toplevel) { struct xdg_toplevel *xdg_toplevel) {
struct egl_info *e = data; egl_finish();
wlr_egl_destroy(e->egl);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
@ -442,8 +441,7 @@ int main(int argc, char **argv) {
struct egl_info *e = calloc(1, sizeof(struct egl_info)); struct egl_info *e = calloc(1, sizeof(struct egl_info));
e->width = e->height = 512; e->width = e->height = 512;
EGLint attribs[] = { EGL_NONE }; egl_init(display);
e->egl = wlr_egl_create(EGL_PLATFORM_WAYLAND_EXT, display, attribs);
/* Create the surface and xdg_toplevels, and set listeners */ /* Create the surface and xdg_toplevels, and set listeners */
@ -460,7 +458,8 @@ int main(int argc, char **argv) {
wl_surface_commit(surface); wl_surface_commit(surface);
e->egl_window = wl_egl_window_create(surface, e->width, e->height); e->egl_window = wl_egl_window_create(surface, e->width, e->height);
e->egl_surface = wlr_egl_create_surface(e->egl, e->egl_window); e->egl_surface = eglCreatePlatformWindowSurfaceEXT(
egl_display, egl_config, e->egl_window, NULL);
e->surface = surface; e->surface = surface;
wl_display_roundtrip(display); wl_display_roundtrip(display);

View file

@ -7,6 +7,7 @@
#include <wayland-client.h> #include <wayland-client.h>
#include <wayland-egl.h> #include <wayland-egl.h>
#include <wlr/render/egl.h> #include <wlr/render/egl.h>
#include "egl_common.h"
#include "text-input-unstable-v3-client-protocol.h" #include "text-input-unstable-v3-client-protocol.h"
#include "xdg-shell-client-protocol.h" #include "xdg-shell-client-protocol.h"
@ -63,12 +64,11 @@ static struct xdg_wm_base *wm_base = NULL;
static struct zwp_text_input_manager_v3 *text_input_manager = NULL; static struct zwp_text_input_manager_v3 *text_input_manager = NULL;
static struct zwp_text_input_v3 *text_input = NULL; static struct zwp_text_input_v3 *text_input = NULL;
struct wlr_egl *egl;
struct wl_egl_window *egl_window; struct wl_egl_window *egl_window;
struct wlr_egl_surface *egl_surface; struct wlr_egl_surface *egl_surface;
static void draw(void) { static void draw(void) {
eglMakeCurrent(egl->display, egl_surface, egl_surface, egl->context); eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context);
float color[] = {1.0, 1.0, 0.0, 1.0}; float color[] = {1.0, 1.0, 0.0, 1.0};
color[0] = enabled * 1.0; color[0] = enabled * 1.0;
@ -78,7 +78,7 @@ static void draw(void) {
glClearColor(color[0], color[1], color[2], 1.0); glClearColor(color[0], color[1], color[2], 1.0);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(egl->display, egl_surface); eglSwapBuffers(egl_display, egl_surface);
} }
static size_t utf8_strlen(char *str) { static size_t utf8_strlen(char *str) {
@ -363,8 +363,7 @@ int main(int argc, char **argv) {
zwp_text_input_v3_add_listener(text_input, &text_input_listener, NULL); zwp_text_input_v3_add_listener(text_input, &text_input_listener, NULL);
EGLint attribs[] = { EGL_NONE }; egl_init(display);
egl = wlr_egl_create(EGL_PLATFORM_WAYLAND_EXT, display, attribs);
struct wl_surface *surface = wl_compositor_create_surface(compositor); struct wl_surface *surface = wl_compositor_create_surface(compositor);
struct xdg_surface *xdg_surface = struct xdg_surface *xdg_surface =
@ -377,7 +376,8 @@ int main(int argc, char **argv) {
wl_surface_commit(surface); wl_surface_commit(surface);
egl_window = wl_egl_window_create(surface, width, height); egl_window = wl_egl_window_create(surface, width, height);
egl_surface = wlr_egl_create_surface(egl, egl_window); egl_surface = eglCreatePlatformWindowSurfaceEXT(
egl_display, egl_config, egl_window, NULL);
wl_display_roundtrip(display); wl_display_roundtrip(display);

View file

@ -5,6 +5,7 @@
#include <wayland-client.h> #include <wayland-client.h>
#include <wayland-egl.h> #include <wayland-egl.h>
#include <wlr/render/egl.h> #include <wlr/render/egl.h>
#include "egl_common.h"
#include "xdg-shell-client-protocol.h" #include "xdg-shell-client-protocol.h"
#include "xdg-decoration-unstable-v1-client-protocol.h" #include "xdg-decoration-unstable-v1-client-protocol.h"
@ -20,7 +21,6 @@ static struct wl_compositor *compositor = NULL;
static struct xdg_wm_base *wm_base = NULL; static struct xdg_wm_base *wm_base = NULL;
static struct zxdg_decoration_manager_v1 *decoration_manager = NULL; static struct zxdg_decoration_manager_v1 *decoration_manager = NULL;
struct wlr_egl *egl;
struct wl_egl_window *egl_window; struct wl_egl_window *egl_window;
struct wlr_egl_surface *egl_surface; struct wlr_egl_surface *egl_surface;
@ -53,7 +53,7 @@ static void request_preferred_mode(void) {
} }
static void draw(void) { static void draw(void) {
eglMakeCurrent(egl->display, egl_surface, egl_surface, egl->context); eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context);
float color[] = {1.0, 1.0, 0.0, 1.0}; float color[] = {1.0, 1.0, 0.0, 1.0};
if (current_mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE) { if (current_mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE) {
@ -64,7 +64,7 @@ static void draw(void) {
glClearColor(color[0], color[1], color[2], 1.0); glClearColor(color[0], color[1], color[2], 1.0);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(egl->display, egl_surface); eglSwapBuffers(egl_display, egl_surface);
} }
static void xdg_surface_handle_configure(void *data, static void xdg_surface_handle_configure(void *data,
@ -218,8 +218,7 @@ int main(int argc, char **argv) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
EGLint attribs[] = { EGL_NONE }; egl_init(display);
egl = wlr_egl_create(EGL_PLATFORM_WAYLAND_EXT, display, attribs);
struct wl_surface *surface = wl_compositor_create_surface(compositor); struct wl_surface *surface = wl_compositor_create_surface(compositor);
struct xdg_surface *xdg_surface = struct xdg_surface *xdg_surface =
@ -238,7 +237,8 @@ int main(int argc, char **argv) {
wl_surface_commit(surface); wl_surface_commit(surface);
egl_window = wl_egl_window_create(surface, width, height); egl_window = wl_egl_window_create(surface, width, height);
egl_surface = wlr_egl_create_surface(egl, egl_window); egl_surface = eglCreatePlatformWindowSurfaceEXT(
egl_display, egl_config, egl_window, NULL);
wl_display_roundtrip(display); wl_display_roundtrip(display);