Prettify error handling
This commit is contained in:
parent
a3ac9664b7
commit
775adfdd66
1 changed files with 46 additions and 73 deletions
119
wayland.c
119
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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue