#pragma once #include #include #include #include "cglm/types.h" #include "glad.h" #include "utils.h" #include "window.h" enum graphics_error_e : u8 { GRAPHICS_ERROR_NONE = 0, GRAPHICS_ERROR_ACQUIRE_DISPLAY, GRAPHICS_ERROR_SELECT_CONFIG, GRAPHICS_ERROR_USE_DESKTOP, GRAPHICS_ERROR_CREATE_CONTEXT, }; struct graphics_s { EGLDisplay display; EGLContext context; EGLConfig config; }; enum graphics_error_e wayc_graphics_init(struct graphics_s* graphics, struct wlstate_s* state); void wayc_graphics_deinit(struct graphics_s* graphics); enum renderer_error_e : u8 { RENDERER_ERROR_NONE = 0, RENDERER_ERROR_WINDOW_CREATION, RENDERER_ERROR_SURFACE_CREATION, RENDERER_ERROR_LOAD_FUNCTIONS, }; struct renderer_s { struct graphics_s* graphics; wl_egl_window_t ewindow; EGLSurface esurface; i32 width, height; vec4 ccolor; }; enum renderer_error_e wayc_renderer_init(struct renderer_s* renderer, struct window_s* window, struct graphics_s* graphics, i32 width, i32 height, vec4 ccolor); static inline void wayc_renderer_resize(struct renderer_s* renderer, i32 width, i32 height) { wayc_notnull(renderer); u32 safe_width = wayc_max(width, 1); u32 safe_height = wayc_max(height, 1); renderer->width = safe_width; renderer->height = safe_height; wl_egl_window_resize(renderer->ewindow, safe_width, safe_height, 0, 0); glViewport(0, 0, safe_width, safe_height); } static inline void wayc_renderer_use(struct renderer_s* renderer) { wayc_notnull(renderer); struct graphics_s* graphics = renderer->graphics; EGLDisplay display = graphics->display; eglMakeCurrent(display, renderer->esurface, renderer->esurface, graphics->context); } void wayc_renderer_begin(struct renderer_s* renderer); void wayc_renderer_end(struct renderer_s* renderer); void wayc_renderer_deinit(struct renderer_s* renderer);