struct wcore_window* wgbm_window_create(struct wcore_platform *wc_plat, struct wcore_config *wc_config, int32_t width, int32_t height, const intptr_t attrib_list[]) { struct wgbm_display *dpy = wgbm_display(wc_config->display); struct wgbm_platform *plat = wgbm_platform(wegl_platform(wc_plat)); struct wgbm_window *self; uint32_t gbm_format; bool ok = true; if (width == -1 && height == -1) { wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM, "fullscreen window not supported"); return NULL; } if (wcore_attrib_list_length(attrib_list) > 0) { wcore_error_bad_attribute(attrib_list[0]); return NULL; } self = wcore_calloc(sizeof(*self)); if (self == NULL) return NULL; gbm_format = wgbm_config_get_gbm_format(wc_plat, wc_config->display, wc_config); assert(gbm_format != 0); self->gbm_surface = plat->gbm_surface_create(dpy->gbm_device, width, height, gbm_format, GBM_BO_USE_RENDERING); if (!self->gbm_surface) { wcore_errorf(WAFFLE_ERROR_UNKNOWN, "gbm_surface_create failed"); goto error; } ok = wegl_window_init(&self->wegl, wc_config, (intptr_t) self->gbm_surface); if (!ok) goto error; return &self->wegl.wcore; error: wgbm_window_destroy(&self->wegl.wcore); return NULL; }
static union waffle_native_context* wgbm_context_get_native(struct wcore_context *wc_ctx) { struct wgbm_display *dpy = wgbm_display(wc_ctx->display); struct wegl_context *ctx = wegl_context(wc_ctx); union waffle_native_context *n_ctx; WCORE_CREATE_NATIVE_UNION(n_ctx, gbm); if (!n_ctx) return NULL; wgbm_display_fill_native(dpy, &n_ctx->gbm->display); n_ctx->gbm->egl_context = ctx->egl; return n_ctx; }
union waffle_native_window* wgbm_window_get_native(struct wcore_window *wc_self) { struct wgbm_window *self = wgbm_window(wc_self); struct wgbm_display *dpy = wgbm_display(wc_self->display); union waffle_native_window *n_window; WCORE_CREATE_NATIVE_UNION(n_window, gbm); if (n_window == NULL) return NULL; wgbm_display_fill_native(dpy, &n_window->gbm->display); n_window->gbm->egl_surface = self->wegl.egl; n_window->gbm->gbm_surface = self->gbm_surface; return n_window; }
bool wgbm_display_destroy(struct wcore_display *wc_self) { struct wgbm_display *self = wgbm_display(wc_self); struct wcore_platform *wc_plat = wc_self->platform; struct wgbm_platform *plat = wgbm_platform(wegl_platform(wc_plat)); bool ok = true; int fd; if (!self) return ok; ok &= wegl_display_teardown(&self->wegl); if (self->gbm_device) { fd = plat->gbm_device_get_fd(self->gbm_device); plat->gbm_device_destroy(self->gbm_device); close(fd); } free(self); return ok; }