diff options
-rw-r--r-- | include/wlr/render/gles2.h | 1 | ||||
-rw-r--r-- | render/gles2/renderer.c | 27 |
2 files changed, 28 insertions, 0 deletions
diff --git a/include/wlr/render/gles2.h b/include/wlr/render/gles2.h index 5a3e9d5c..5bdf6edb 100644 --- a/include/wlr/render/gles2.h +++ b/include/wlr/render/gles2.h @@ -15,6 +15,7 @@ struct wlr_egl; +struct wlr_renderer *wlr_gles2_renderer_create_with_drm_fd(int drm_fd); struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl); struct wlr_egl *wlr_gles2_renderer_get_egl(struct wlr_renderer *renderer); diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index 5f1dfa4a..212289e6 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -1,5 +1,6 @@ #include <assert.h> #include <drm_fourcc.h> +#include <gbm.h> #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> #include <stdint.h> @@ -717,6 +718,32 @@ extern const GLchar tex_fragment_src_rgba[]; extern const GLchar tex_fragment_src_rgbx[]; extern const GLchar tex_fragment_src_external[]; +struct wlr_renderer *wlr_gles2_renderer_create_with_drm_fd(int drm_fd) { + struct gbm_device *gbm_device = gbm_create_device(drm_fd); + if (!gbm_device) { + wlr_log(WLR_ERROR, "Failed to create GBM device"); + return NULL; + } + + struct wlr_egl *egl = wlr_egl_create(EGL_PLATFORM_GBM_KHR, gbm_device); + if (egl == NULL) { + wlr_log(WLR_ERROR, "Could not initialize EGL"); + gbm_device_destroy(gbm_device); + return NULL; + } + + egl->gbm_device = gbm_device; + + struct wlr_renderer *renderer = wlr_gles2_renderer_create(egl); + if (!renderer) { + wlr_log(WLR_ERROR, "Failed to create GLES2 renderer"); + wlr_egl_destroy(egl); + return NULL; + } + + return renderer; +} + struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) { if (!wlr_egl_make_current(egl)) { return NULL; |