summaryrefslogtreecommitdiff
path: root/libweston/renderer-gl/gl-renderer.c
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.com>2019-09-20 14:23:12 +0300
committerPekka Paalanen <pq@iki.fi>2019-10-11 12:16:35 +0000
commit5104d7b2afd4980da71370c27b7f79a441759f30 (patch)
treecbe75d129173dcf8ef3a1dd473506ea6e8dfd65f /libweston/renderer-gl/gl-renderer.c
parent209187491b7a52b8ae735db69499aff2b03cec75 (diff)
downloadweston-5104d7b2afd4980da71370c27b7f79a441759f30.tar.gz
headless, gl-renderer: support pbuffer outputs
Use the surfaceless platform in the headless backend to initialize the GL-renderer and create pbuffer outputs. This allows headless backend to use GL-renderer, even hardware accelerated. This paves way for exercising GL-renderer in CI and using the Weston test suite to test hardware GL ES implementations. Relates to: https://gitlab.freedesktop.org/wayland/weston/issues/278 Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Diffstat (limited to 'libweston/renderer-gl/gl-renderer.c')
-rw-r--r--libweston/renderer-gl/gl-renderer.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
index cc77a345..fa472e03 100644
--- a/libweston/renderer-gl/gl-renderer.c
+++ b/libweston/renderer-gl/gl-renderer.c
@@ -3142,6 +3142,48 @@ gl_renderer_output_window_create(struct weston_output *output,
return ret;
}
+static int
+gl_renderer_output_pbuffer_create(struct weston_output *output,
+ int width,
+ int height,
+ const uint32_t *drm_formats,
+ unsigned drm_formats_count)
+{
+ struct gl_renderer *gr = get_renderer(output->compositor);
+ EGLConfig pbuffer_config;
+ EGLSurface egl_surface;
+ int ret;
+ EGLint pbuffer_attribs[] = {
+ EGL_WIDTH, width,
+ EGL_HEIGHT, height,
+ EGL_NONE
+ };
+
+ pbuffer_config = gl_renderer_get_egl_config(gr, EGL_PBUFFER_BIT,
+ drm_formats,
+ drm_formats_count);
+ if (pbuffer_config == EGL_NO_CONFIG_KHR) {
+ weston_log("failed to choose EGL config for PbufferSurface\n");
+ return -1;
+ }
+
+ log_egl_config_info(gr->egl_display, pbuffer_config);
+
+ egl_surface = eglCreatePbufferSurface(gr->egl_display, pbuffer_config,
+ pbuffer_attribs);
+ if (egl_surface == EGL_NO_SURFACE) {
+ weston_log("failed to create egl surface\n");
+ gl_renderer_print_egl_error_state();
+ return -1;
+ }
+
+ ret = gl_renderer_output_create(output, egl_surface);
+ if (ret < 0)
+ eglDestroySurface(gr->egl_display, egl_surface);
+
+ return ret;
+}
+
static void
gl_renderer_output_destroy(struct weston_output *output)
{
@@ -3728,6 +3770,7 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface)
WL_EXPORT struct gl_renderer_interface gl_renderer_interface = {
.display_create = gl_renderer_display_create,
.output_window_create = gl_renderer_output_window_create,
+ .output_pbuffer_create = gl_renderer_output_pbuffer_create,
.output_destroy = gl_renderer_output_destroy,
.output_set_border = gl_renderer_output_set_border,
.create_fence_fd = gl_renderer_create_fence_fd,