diff --git a/wayland.c b/wayland.c index d7165bf..c09b3cd 100644 --- a/wayland.c +++ b/wayland.c @@ -11,17 +11,35 @@ struct wl_compositor *compositor = NULL; struct wl_registry *registry = NULL; struct wl_surface *surface = NULL; -struct xdg_wm_base *wm_base; -struct xdg_surface *xdg_surface; -struct xdg_toplevel *xdg_toplevel; +struct xdg_wm_base *wm_base = NULL; +struct xdg_surface *xdg_surface = NULL; +struct xdg_toplevel *xdg_toplevel = NULL; EGLBoolean errcode = 0; +char *egl_s(int code) +{ + switch (code) + { + case (intptr_t)EGL_NO_SURFACE: return "EGL_NO_SURFACE"; + case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; + case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; + case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; + case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; + case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; + case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; + case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; + case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; + case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; + case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; + case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; + default: return "UNKNOWN"; + } +} - -void registry_handle_global(void *data, struct wl_registry *registry, +void registry_handle_global([[maybe_unused]] void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) { - printf("Wayland interface: '%s', version: %d, name: %d\n", + fprintf(stdout, "Wayland interface: '%s', version: %d, name: %d\n", interface, version, name); if (!strcmp(interface, wl_compositor_interface.name)) { @@ -36,8 +54,8 @@ void registry_handle_global(void *data, struct wl_registry *registry, } -void registry_handle_global_remove(void *data, struct wl_registry *registry, - uint32_t name) +void registry_handle_global_remove([[maybe_unused]]void *data, [[maybe_unused]]struct wl_registry *registry, + [[maybe_unused]]uint32_t name) { // This space deliberately left blank } @@ -54,7 +72,7 @@ int main() struct wl_display *display = wl_display_connect(NULL); if (!display) { - fprintf(stdout, "Cannot retrieve wayland display!\n"); + fprintf(stderr, "Cannot retrieve wayland display!\n"); } registry = wl_display_get_registry(display); @@ -88,32 +106,14 @@ int main() fprintf(stderr, "Could not retrieve EGL display from wayland display\n"); } errcode = eglInitialize(egl_display, NULL, NULL); - switch (errcode) - { - case EGL_FALSE: - case EGL_BAD_DISPLAY: - case EGL_NOT_INITIALIZED: - fprintf(stderr, "Could not initialize EGL display\n"); - break; - case EGL_TRUE: - ; - break; - } + if (errcode != EGL_TRUE) + fprintf(stderr, "ERR %s: Could not initialize EGL display\n", egl_s(errcode)); int config_count; errcode = eglGetConfigs(egl_display, NULL, 0, &config_count); - switch (errcode) - { - case EGL_FALSE: - case EGL_BAD_DISPLAY: - case EGL_NOT_INITIALIZED: - case EGL_BAD_PARAMETER: - fprintf(stderr, "Could not retrieve EGL config number\n"); - break; - case EGL_TRUE: - ; - break; - } + + if (errcode != EGL_TRUE) + fprintf(stderr, "ERR %s: Could not retrieve EGL config number\n", egl_s(errcode)); EGLConfig *configs = calloc(config_count, sizeof(EGLConfig)); @@ -127,18 +127,9 @@ int main() }; int chosen_config_count; errcode = eglChooseConfig(egl_display, attr_list, configs, config_count * sizeof(EGLConfig), &chosen_config_count); - switch (errcode) - { - case EGL_FALSE: - case EGL_BAD_DISPLAY: - case EGL_NOT_INITIALIZED: - case EGL_BAD_PARAMETER: - fprintf(stderr, "Could not choose EGL config parameters\n"); - break; - case EGL_TRUE: - ; - break; - } + + if (errcode != EGL_TRUE) + fprintf(stderr, "ERR %s: Could not choose EGL config parameters\n", egl_s(errcode)); int chosen_config_id = 0; EGLConfig *chosen_config = configs[0]; @@ -219,16 +210,12 @@ int main() case EGL_BAD_ATTRIBUTE: case EGL_BAD_ALLOC: case EGL_BAD_MATCH: - fprintf(stderr, "Could not choose EGL config parameters\n"); - break; - case EGL_TRUE: - ; + fprintf(stderr, "ERR %s: Could not create EGL window surface\n", egl_s((intptr_t)egl_surface)); break; } + /* Even if we ask for a particular OGL version, the driver is likely to choose the latest one, so we do not even bother */ static const EGLint context_attribs[] = { - EGL_CONTEXT_MAJOR_VERSION, 3, - EGL_CONTEXT_MINOR_VERSION, 2, #ifdef DEBUG EGL_CONTEXT_OPENGL_DEBUG, EGL_TRUE, #endif @@ -237,31 +224,15 @@ int main() /* Change from OpenGL ES to regular OpenGL */ errcode = eglBindAPI(EGL_OPENGL_API); - switch (errcode) - { - case EGL_FALSE: - case EGL_BAD_PARAMETER: - fprintf(stderr, "Could not bind OpenGL API to EGL\n"); - break; - } + if (errcode != EGL_TRUE) + fprintf(stderr, "ERR %s: Could not bind OpenGL API to EGL\n", egl_s(errcode)); + // Since we already bound desktop OGL, this is actually making a OGL context instead of an OGL ES one EGLContext egl_context = eglCreateContext(egl_display, chosen_config, EGL_NO_CONTEXT, context_attribs); errcode = eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context); - switch (errcode) - { - case EGL_BAD_CONTEXT: - case EGL_BAD_SURFACE: - case EGL_BAD_MATCH: - case EGL_BAD_NATIVE_WINDOW: - case EGL_BAD_CURRENT_SURFACE: - case EGL_BAD_ALLOC: - case EGL_CONTEXT_LOST: - case EGL_NOT_INITIALIZED: - case EGL_BAD_DISPLAY: - fprintf(stderr, "Could not make EGL context current\n"); - break; - } + if (errcode != EGL_TRUE) + fprintf(stderr, "ERR %s: could not make EGL context current\n", egl_s(errcode)); /* NOTE: It would seem that having a non-zero swap interval can hang the Mesa driver forever, according to this SDL GH issue: https://github.com/libsdl-org/SDL/issues/4335#issuecomment-829789881 @@ -269,18 +240,20 @@ int main() if (eglSwapInterval(egl_display, 0) != EGL_TRUE) fprintf(stderr, "Could not set EGL swap interval\n"); + // necessary before our first eglSwapBuffers wl_surface_commit(surface); - int framecount = 0; // Main event loop + int framecount = 0; while (1) { wl_display_dispatch_pending(display); - //fprintf(stdout, "Frame %d\n", framecount++); + //fprintf(stdout, "Frame %d\n", framecount); glClearColor(0.5, 0.3, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glFlush(); eglSwapBuffers(egl_display, egl_surface); + ++framecount; } wl_display_disconnect(display);