[PATCH weston 2/2] gl-renderer: Build as a loadable module

Ander Conselvan de Oliveira conselvan2 at gmail.com
Mon Oct 14 17:09:32 CEST 2013


On 10/14/2013 03:57 PM, Ander Conselvan de Oliveira wrote:
> The time spent loading EGL and GLES libraries from disk can be a
> considerable hit in some embedded use cases. If Weston is compiled
> with EGL support, the binary will depend on those libraries, even if
> a software renderer is in use.
>
> This patch splits the GL renderer into a separate loadable module,
> and moves the dependency on EGL and GLES to it. The backends still
> need the EGL headers for the native types and EGLint. The function
> load_module() is renamed to weston_load_module() and exported, so
> that it can be used by the backends.
>
> The gl renderer interface is changed so that there is only one symbol
> that needs to be dlsym()'d. This symbol contains pointers to all the
> functions and data necessary to interact with the renderer. As a side
> effect, this change simplifies gl-renderer.h a great deal.

I forgot to include the changes since last version. The only difference 
is the hack to dlopen libglapi before creating the gbm device, instead 
of opening the renderer module with RTLD_GLOBAL.


Ander

> ---
>   configure.ac             |  2 +-
>   src/Makefile.am          | 28 ++++++++++-----
>   src/compositor-drm.c     | 27 ++++++++++----
>   src/compositor-fbdev.c   | 18 +++++++---
>   src/compositor-wayland.c | 20 +++++++----
>   src/compositor-x11.c     | 30 ++++++++++++----
>   src/compositor.c         |  8 ++---
>   src/compositor.h         |  3 ++
>   src/gl-renderer.c        | 31 +++++++++++-----
>   src/gl-renderer.h        | 93 ++++++++++++++----------------------------------
>   10 files changed, 150 insertions(+), 110 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index 234f098..9500128 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -62,7 +62,7 @@ AC_ARG_ENABLE(egl, [  --disable-egl],,
>   AM_CONDITIONAL(ENABLE_EGL, test x$enable_egl = xyes)
>   if test x$enable_egl = xyes; then
>   	AC_DEFINE([ENABLE_EGL], [1], [Build Weston with EGL support])
> -	COMPOSITOR_MODULES="$COMPOSITOR_MODULES egl >= 7.10 glesv2"
> +	PKG_CHECK_MODULES(EGL, [egl >= 7.10 glesv2])
>   fi
>
>   AC_ARG_ENABLE(xkbcommon,
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 749c074..b0eae7c 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -40,7 +40,6 @@ weston_SOURCES =				\
>   	subsurface-server-protocol.h		\
>   	bindings.c				\
>   	animation.c				\
> -	gl-renderer.h				\
>   	noop-renderer.c				\
>   	pixman-renderer.c			\
>   	pixman-renderer.h			\
> @@ -50,13 +49,6 @@ weston_SOURCES =				\
>   	weston-launch.h				\
>   	weston-egl-ext.h
>
> -if ENABLE_EGL
> -weston_SOURCES +=				\
> -	gl-renderer.c				\
> -	vertex-clipping.c			\
> -	vertex-clipping.h
> -endif
> -
>   git-version.h : .FORCE
>   	$(AM_V_GEN)(echo "#define BUILD_ID \"$(shell git --git-dir=$(top_srcdir)/.git describe --always --dirty) $(shell git --git-dir=$(top_srcdir)/.git log -1 --format='%s (%ci)')\"" > $@-new; \
>   	cmp -s $@ $@-new || cp $@-new $@; \
> @@ -104,6 +96,7 @@ module_LTLIBRARIES =				\
>   	$(tablet_shell)				\
>   	$(cms_static)				\
>   	$(cms_colord)				\
> +	$(gl_renderer)				\
>   	$(x11_backend)				\
>   	$(drm_backend)				\
>   	$(wayland_backend)			\
> @@ -119,6 +112,21 @@ else
>   noinst_LTLIBRARIES += $(rpi_backend)
>   endif
>
> +if ENABLE_EGL
> +gl_renderer = gl-renderer.la
> +gl_renderer_la_LDFLAGS = -module -avoid-version
> +gl_renderer_la_LIBADD = $(COMPOSITOR_LIBS) $(EGL_LIBS)
> +gl_renderer_la_CFLAGS =				\
> +	$(COMPOSITOR_CFLAGS)			\
> +	$(EGL_CFLAGS)				\
> +	$(GCC_CFLAGS)
> +gl_renderer_la_SOURCES =			\
> +	gl-renderer.h				\
> +	gl-renderer.c				\
> +	vertex-clipping.c			\
> +	vertex-clipping.h
> +endif
> +
>   if ENABLE_X11_COMPOSITOR
>   x11_backend = x11-backend.la
>   x11_backend_la_LDFLAGS = -module -avoid-version
> @@ -126,6 +134,7 @@ x11_backend_la_LIBADD = $(COMPOSITOR_LIBS) $(X11_COMPOSITOR_LIBS) \
>   	../shared/libshared-cairo.la
>   x11_backend_la_CFLAGS =				\
>   	$(COMPOSITOR_CFLAGS)			\
> +	$(EGL_CFLAGS)				\
>   	$(PIXMAN_CFLAGS)			\
>   	$(CAIRO_CFLAGS)				\
>   	$(X11_COMPOSITOR_CFLAGS)		\
> @@ -140,6 +149,7 @@ drm_backend_la_LIBADD = $(COMPOSITOR_LIBS) $(DRM_COMPOSITOR_LIBS) \
>   	../shared/libshared.la -lrt
>   drm_backend_la_CFLAGS =				\
>   	$(COMPOSITOR_CFLAGS)			\
> +	$(EGL_CFLAGS)				\
>   	$(DRM_COMPOSITOR_CFLAGS)		\
>   	$(GCC_CFLAGS)
>   drm_backend_la_SOURCES =			\
> @@ -168,6 +178,7 @@ wayland_backend_la_LIBADD = $(COMPOSITOR_LIBS) $(WAYLAND_COMPOSITOR_LIBS) \
>   	../shared/libshared-cairo.la
>   wayland_backend_la_CFLAGS =			\
>   	$(COMPOSITOR_CFLAGS)			\
> +	$(EGL_CFLAGS)				\
>   	$(PIXMAN_CFLAGS)			\
>   	$(CAIRO_CFLAGS)				\
>   	$(WAYLAND_COMPOSITOR_CFLAGS)		\
> @@ -219,6 +230,7 @@ fbdev_backend_la_LIBADD = \
>   	../shared/libshared.la
>   fbdev_backend_la_CFLAGS = \
>   	$(COMPOSITOR_CFLAGS) \
> +	$(EGL_CFLAGS) \
>   	$(FBDEV_COMPOSITOR_CFLAGS) \
>   	$(PIXMAN_CFLAGS) \
>   	$(GCC_CFLAGS)
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index 0ac5efa..0a02962 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -33,6 +33,7 @@
>   #include <linux/vt.h>
>   #include <assert.h>
>   #include <sys/mman.h>
> +#include <dlfcn.h>
>   #include <time.h>
>
>   #include <xf86drm.h>
> @@ -193,6 +194,8 @@ struct drm_sprite {
>   	uint32_t formats[];
>   };
>
> +static struct gl_renderer_interface *gl_renderer;
> +
>   static const char default_seat[] = "seat0";
>
>   static void
> @@ -1083,7 +1086,7 @@ drm_output_destroy(struct weston_output *output_base)
>   	if (c->use_pixman) {
>   		drm_output_fini_pixman(output);
>   	} else {
> -		gl_renderer_output_destroy(output_base);
> +		gl_renderer->output_destroy(output_base);
>   		gbm_surface_destroy(output->surface);
>   	}
>
> @@ -1174,7 +1177,7 @@ drm_output_switch_mode(struct weston_output *output_base, struct weston_mode *mo
>   			return -1;
>   		}
>   	} else {
> -		gl_renderer_output_destroy(&output->base);
> +		gl_renderer->output_destroy(&output->base);
>   		gbm_surface_destroy(output->surface);
>
>   		if (drm_output_init_egl(output, ec) < 0) {
> @@ -1242,14 +1245,26 @@ init_drm(struct drm_compositor *ec, struct udev_device *device)
>   static int
>   init_egl(struct drm_compositor *ec)
>   {
> +	gl_renderer = weston_load_module("gl-renderer.so",
> +					 "gl_renderer_interface");
> +	if (!gl_renderer)
> +		return -1;
> +
> +	/* GBM will load a dri driver, but even though they need symbols from
> +	 * libglapi, in some version of Mesa they are not linked to it. Since
> +	 * only the gl-renderer module links to it, the call above won't make
> +	 * these symbols globally available, and loading the DRI driver fails.
> +	 * Workaround this by dlopen()'ing libglapi with RTLD_GLOBAL. */
> +	dlopen("libglapi.so.0", RTLD_LAZY | RTLD_GLOBAL);
> +
>   	ec->gbm = gbm_create_device(ec->drm.fd);
>
>   	if (!ec->gbm)
>   		return -1;
>
> -	if (gl_renderer_create(&ec->base, ec->gbm,
> -			       gl_renderer_opaque_attribs,
> -			       &ec->format) < 0) {
> +	if (gl_renderer->create(&ec->base, ec->gbm,
> +				gl_renderer->opaque_attribs,
> +				&ec->format) < 0) {
>   		gbm_device_destroy(ec->gbm);
>   		return -1;
>   	}
> @@ -1451,7 +1466,7 @@ drm_output_init_egl(struct drm_output *output, struct drm_compositor *ec)
>   		return -1;
>   	}
>
> -	if (gl_renderer_output_create(&output->base, output->surface) < 0) {
> +	if (gl_renderer->output_create(&output->base, output->surface) < 0) {
>   		weston_log("failed to create gl renderer output state\n");
>   		gbm_surface_destroy(output->surface);
>   		return -1;
> diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c
> index 3d2819b..002ce0b 100644
> --- a/src/compositor-fbdev.c
> +++ b/src/compositor-fbdev.c
> @@ -95,6 +95,8 @@ struct fbdev_parameters {
>   	int use_gl;
>   };
>
> +struct gl_renderer_interface *gl_renderer;
> +
>   static const char default_seat[] = "seat0";
>
>   static inline struct fbdev_output *
> @@ -623,7 +625,7 @@ fbdev_output_create(struct fbdev_compositor *compositor,
>   			goto out_shadow_surface;
>   	} else {
>   		setenv("HYBRIS_EGLPLATFORM", "wayland", 1);
> -		if (gl_renderer_output_create(&output->base,
> +		if (gl_renderer->output_create(&output->base,
>   					(EGLNativeWindowType)NULL) < 0) {
>   			weston_log("gl_renderer_output_create failed.\n");
>   			goto out_shadow_surface;
> @@ -684,7 +686,7 @@ fbdev_output_destroy(struct weston_output *base)
>   			output->shadow_buf = NULL;
>   		}
>   	} else {
> -		gl_renderer_output_destroy(base);
> +		gl_renderer->output_destroy(base);
>   	}
>
>   	/* Remove the output. */
> @@ -923,8 +925,16 @@ fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[],
>   		if (pixman_renderer_init(&compositor->base) < 0)
>   			goto out_launcher;
>   	} else {
> -		if (gl_renderer_create(&compositor->base, EGL_DEFAULT_DISPLAY,
> -			gl_renderer_opaque_attribs, NULL) < 0) {
> +		gl_renderer = weston_load_module("gl-renderer.so",
> +						 "gl_renderer_interface");
> +		if (!gl_renderer) {
> +			weston_log("could not load gl renderer\n");
> +			goto out_launcher;
> +		}
> +
> +		if (gl_renderer->create(&compositor->base, EGL_DEFAULT_DISPLAY,
> +					gl_renderer->opaque_attribs,
> +					NULL) < 0) {
>   			weston_log("gl_renderer_create failed.\n");
>   			goto out_launcher;
>   		}
> diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
> index 77b2a2c..7b670d9 100644
> --- a/src/compositor-wayland.c
> +++ b/src/compositor-wayland.c
> @@ -89,6 +89,8 @@ struct wayland_input {
>   	struct wayland_output *output;
>   };
>
> +struct gl_renderer_interface *gl_renderer;
> +
>   static void
>   create_border(struct wayland_compositor *c)
>   {
> @@ -106,7 +108,7 @@ create_border(struct wayland_compositor *c)
>   	edges[2] = c->border.top;
>   	edges[3] = c->border.bottom;
>
> -	gl_renderer_set_border(&c->base, pixman_image_get_width(image),
> +	gl_renderer->set_border(&c->base, pixman_image_get_width(image),
>   		pixman_image_get_height(image),
>   		pixman_image_get_data(image), edges);
>
> @@ -233,7 +235,7 @@ wayland_output_destroy(struct weston_output *output_base)
>   {
>   	struct wayland_output *output = (struct wayland_output *) output_base;
>
> -	gl_renderer_output_destroy(output_base);
> +	gl_renderer->output_destroy(output_base);
>
>   	wl_egl_window_destroy(output->parent.egl_window);
>   	free(output);
> @@ -283,7 +285,7 @@ wayland_compositor_create_output(struct wayland_compositor *c,
>   		goto cleanup_output;
>   	}
>
> -	if (gl_renderer_output_create(&output->base,
> +	if (gl_renderer->output_create(&output->base,
>   			output->parent.egl_window) < 0)
>   		goto cleanup_window;
>
> @@ -742,8 +744,14 @@ wayland_compositor_create(struct wl_display *display,
>   	wl_display_dispatch(c->parent.wl_display);
>
>   	c->base.wl_display = display;
> -	if (gl_renderer_create(&c->base, c->parent.wl_display,
> -			gl_renderer_alpha_attribs,
> +
> +	gl_renderer = weston_load_module("gl-renderer.so",
> +					 "gl_renderer_interface");
> +	if (!gl_renderer)
> +		goto err_display;
> +
> +	if (gl_renderer->create(&c->base, c->parent.wl_display,
> +			gl_renderer->alpha_attribs,
>   			NULL) < 0)
>   		goto err_display;
>
> @@ -759,7 +767,7 @@ wayland_compositor_create(struct wl_display *display,
>   	if (wayland_compositor_create_output(c, width, height) < 0)
>   		goto err_gl;
>
> -	/* requires gl_renderer_output_state_create called
> +	/* requires gl_renderer->output_state_create called
>   	 * by wayland_compositor_create_output */
>   	create_border(c);
>
> diff --git a/src/compositor-x11.c b/src/compositor-x11.c
> index 704e751..44e92ba 100644
> --- a/src/compositor-x11.c
> +++ b/src/compositor-x11.c
> @@ -115,6 +115,8 @@ struct x11_output {
>   	int32_t                 scale;
>   };
>
> +struct gl_renderer_interface *gl_renderer;
> +
>   static struct xkb_keymap *
>   x11_compositor_get_keymap(struct x11_compositor *c)
>   {
> @@ -519,7 +521,7 @@ x11_output_destroy(struct weston_output *output_base)
>   		pixman_renderer_output_destroy(output_base);
>   		x11_output_deinit_shm(compositor, output);
>   	} else
> -		gl_renderer_output_destroy(output_base);
> +		gl_renderer->output_destroy(output_base);
>
>   	xcb_destroy_window(compositor->conn, output->window);
>
> @@ -785,6 +787,7 @@ x11_compositor_create_output(struct x11_compositor *c, int x, int y,
>   	struct wm_normal_hints normal_hints;
>   	struct wl_event_loop *loop;
>   	int output_width, output_height;
> +	int ret;
>   	uint32_t mask = XCB_CW_EVENT_MASK | XCB_CW_CURSOR;
>   	xcb_atom_t atom_list[1];
>   	uint32_t values[2] = {
> @@ -905,7 +908,9 @@ x11_compositor_create_output(struct x11_compositor *c, int x, int y,
>   			return NULL;
>   		}
>   	} else {
> -		if (gl_renderer_output_create(&output->base, (EGLNativeWindowType)output->window) < 0)
> +		ret = gl_renderer->output_create(&output->base,
> +						 (EGLNativeWindowType) output->window);
> +		if (ret < 0)
>   			return NULL;
>   	}
>
> @@ -1441,6 +1446,21 @@ parse_transform(const char *transform, const char *output_name)
>   	return WL_OUTPUT_TRANSFORM_NORMAL;
>   }
>
> +static int
> +init_gl_renderer(struct x11_compositor *c)
> +{
> +	int ret;
> +
> +	gl_renderer = weston_load_module("gl-renderer.so",
> +					 "gl_renderer_interface");
> +	if (!gl_renderer)
> +		return -1;
> +
> +	ret = gl_renderer->create(&c->base, (EGLNativeDisplayType) c->dpy,
> +				  gl_renderer->opaque_attribs, NULL);
> +
> +	return ret;
> +}
>   static struct weston_compositor *
>   x11_compositor_create(struct wl_display *display,
>   		      int fullscreen,
> @@ -1497,10 +1517,8 @@ x11_compositor_create(struct wl_display *display,
>   		if (pixman_renderer_init(&c->base) < 0)
>   			goto err_xdisplay;
>   	}
> -	else {
> -		if (gl_renderer_create(&c->base, (EGLNativeDisplayType)c->dpy, gl_renderer_opaque_attribs,
> -				NULL) < 0)
> -			goto err_xdisplay;
> +	else if (init_gl_renderer(c) < 0) {
> +		goto err_xdisplay;
>   	}
>   	weston_log("Using %s renderer\n", use_pixman ? "pixman" : "gl");
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 376ddfd..04e192b 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -3222,8 +3222,8 @@ on_caught_signal(int s, siginfo_t *siginfo, void *context)
>   	raise(SIGTRAP);
>   }
>
> -static void *
> -load_module(const char *name, const char *entrypoint)
> +WL_EXPORT void *
> +weston_load_module(const char *name, const char *entrypoint)
>   {
>   	char path[PATH_MAX];
>   	void *module, *init;
> @@ -3273,7 +3273,7 @@ load_modules(struct weston_compositor *ec, const char *modules,
>   	while (*p) {
>   		end = strchrnul(p, ',');
>   		snprintf(buffer, sizeof buffer, "%.*s", (int) (end - p), p);
> -		module_init = load_module(buffer, "module_init");
> +		module_init = weston_load_module(buffer, "module_init");
>   		if (module_init)
>   			module_init(ec, argc, argv);
>   		p = end;
> @@ -3507,7 +3507,7 @@ int main(int argc, char *argv[])
>   	section = weston_config_get_section(config, "core", NULL, NULL);
>   	weston_config_section_get_string(section, "modules", &modules, "");
>
> -	backend_init = load_module(backend, "backend_init");
> +	backend_init = weston_load_module(backend, "backend_init");
>   	if (!backend_init)
>   		exit(EXIT_FAILURE);
>
> diff --git a/src/compositor.h b/src/compositor.h
> index a19d966..e2c53a0 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -1241,6 +1241,9 @@ weston_transformed_rect(int width, int height,
>   			int32_t scale,
>   			pixman_box32_t rect);
>
> +void *
> +weston_load_module(const char *name, const char *entrypoint);
> +
>   #ifdef  __cplusplus
>   }
>   #endif
> diff --git a/src/gl-renderer.c b/src/gl-renderer.c
> index ae69f22..f02445b 100644
> --- a/src/gl-renderer.c
> +++ b/src/gl-renderer.c
> @@ -170,7 +170,7 @@ egl_error_string(EGLint code)
>   #undef MYERRCODE
>   }
>
> -WL_EXPORT void
> +static void
>   gl_renderer_print_egl_error_state(void)
>   {
>   	EGLint code;
> @@ -1440,7 +1440,7 @@ output_apply_border(struct weston_output *output, struct gl_renderer *gr)
>   	output->border.right = gr->border.right;
>   }
>
> -WL_EXPORT void
> +static void
>   gl_renderer_set_border(struct weston_compositor *ec, int32_t width, int32_t height, void *data,
>   			  int32_t *edges)
>   {
> @@ -1475,7 +1475,7 @@ gl_renderer_set_border(struct weston_compositor *ec, int32_t width, int32_t heig
>   static int
>   gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface);
>
> -WL_EXPORT int
> +static int
>   gl_renderer_output_create(struct weston_output *output,
>   				    EGLNativeWindowType window)
>   {
> @@ -1514,7 +1514,7 @@ gl_renderer_output_create(struct weston_output *output,
>   	return 0;
>   }
>
> -WL_EXPORT void
> +static void
>   gl_renderer_output_destroy(struct weston_output *output)
>   {
>   	struct gl_renderer *gr = get_renderer(output->compositor);
> @@ -1529,7 +1529,7 @@ gl_renderer_output_destroy(struct weston_output *output)
>   	free(go);
>   }
>
> -WL_EXPORT EGLSurface
> +static EGLSurface
>   gl_renderer_output_surface(struct weston_output *output)
>   {
>   	return get_output_state(output)->egl_surface;
> @@ -1602,7 +1602,7 @@ out:
>   	return -1;
>   }
>
> -WL_EXPORT const EGLint gl_renderer_opaque_attribs[] = {
> +static const EGLint gl_renderer_opaque_attribs[] = {
>   	EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
>   	EGL_RED_SIZE, 1,
>   	EGL_GREEN_SIZE, 1,
> @@ -1612,7 +1612,7 @@ WL_EXPORT const EGLint gl_renderer_opaque_attribs[] = {
>   	EGL_NONE
>   };
>
> -WL_EXPORT const EGLint gl_renderer_alpha_attribs[] = {
> +static const EGLint gl_renderer_alpha_attribs[] = {
>   	EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
>   	EGL_RED_SIZE, 1,
>   	EGL_GREEN_SIZE, 1,
> @@ -1622,7 +1622,7 @@ WL_EXPORT const EGLint gl_renderer_alpha_attribs[] = {
>   	EGL_NONE
>   };
>
> -WL_EXPORT int
> +static int
>   gl_renderer_create(struct weston_compositor *ec, EGLNativeDisplayType display,
>   	const EGLint *attribs, const EGLint *visual_id)
>   {
> @@ -1673,7 +1673,7 @@ err_egl:
>   	return -1;
>   }
>
> -WL_EXPORT EGLDisplay
> +static EGLDisplay
>   gl_renderer_display(struct weston_compositor *ec)
>   {
>   	return get_renderer(ec)->egl_display;
> @@ -1863,3 +1863,16 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface)
>
>   	return 0;
>   }
> +
> +WL_EXPORT struct gl_renderer_interface gl_renderer_interface = {
> +	.opaque_attribs = gl_renderer_opaque_attribs,
> +	.alpha_attribs = gl_renderer_alpha_attribs,
> +
> +	.create = gl_renderer_create,
> +	.display = gl_renderer_display,
> +	.output_create = gl_renderer_output_create,
> +	.output_destroy = gl_renderer_output_destroy,
> +	.output_surface = gl_renderer_output_surface,
> +	.set_border = gl_renderer_set_border,
> +	.print_egl_error_state = gl_renderer_print_egl_error_state
> +};
> diff --git a/src/gl-renderer.h b/src/gl-renderer.h
> index 4919a1e..1656491 100644
> --- a/src/gl-renderer.h
> +++ b/src/gl-renderer.h
> @@ -28,27 +28,6 @@
>
>   #include <EGL/egl.h>
>
> -extern const EGLint gl_renderer_opaque_attribs[];
> -extern const EGLint gl_renderer_alpha_attribs[];
> -
> -int
> -gl_renderer_create(struct weston_compositor *ec, EGLNativeDisplayType display,
> -	const EGLint *attribs, const EGLint *visual_id);
> -EGLDisplay
> -gl_renderer_display(struct weston_compositor *ec);
> -int
> -gl_renderer_output_create(struct weston_output *output,
> -				    EGLNativeWindowType window);
> -void
> -gl_renderer_output_destroy(struct weston_output *output);
> -EGLSurface
> -gl_renderer_output_surface(struct weston_output *output);
> -void
> -gl_renderer_set_border(struct weston_compositor *ec, int32_t width, int32_t height, void *data,
> -			  int32_t *edges);
> -
> -void
> -gl_renderer_print_egl_error_state(void);
>   #else
>
>   typedef int EGLint;
> @@ -57,49 +36,31 @@ typedef void *EGLSurface;
>   typedef intptr_t EGLNativeDisplayType;
>   typedef intptr_t EGLNativeWindowType;
>
> -static const EGLint gl_renderer_opaque_attribs[];
> -static const EGLint gl_renderer_alpha_attribs[];
> -
> -inline static int
> -gl_renderer_create(struct weston_compositor *ec, EGLNativeDisplayType display,
> -	const EGLint *attribs, const EGLint *visual_id)
> -{
> -	return -1;
> -}
> -
> -inline static EGLDisplay
> -gl_renderer_display(struct weston_compositor *ec)
> -{
> -	return 0;
> -}
> -
> -inline static int
> -gl_renderer_output_create(struct weston_output *output,
> -				    EGLNativeWindowType window)
> -{
> -	return -1;
> -}
> -
> -inline static void
> -gl_renderer_output_destroy(struct weston_output *output)
> -{
> -}
> -
> -inline static EGLSurface
> -gl_renderer_output_surface(struct weston_output *output)
> -{
> -	return 0;
> -}
> -
> -inline static void
> -gl_renderer_set_border(struct weston_compositor *ec, int32_t width, int32_t height, void *data,
> -			  int32_t *edges)
> -{
> -}
> -
> -inline static void
> -gl_renderer_print_egl_error_state(void)
> -{
> -}
> -
>   #endif
> +
> +struct gl_renderer_interface {
> +	const EGLint *opaque_attribs;
> +	const EGLint *alpha_attribs;
> +
> +	int (*create)(struct weston_compositor *ec,
> +		      EGLNativeDisplayType display,
> +		      const EGLint *attribs,
> +		      const EGLint *visual_id);
> +
> +	EGLDisplay (*display)(struct weston_compositor *ec);
> +
> +	int (*output_create)(struct weston_output *output,
> +			     EGLNativeWindowType window);
> +
> +	void (*output_destroy)(struct weston_output *output);
> +
> +	EGLSurface (*output_surface)(struct weston_output *output);
> +
> +	void (*set_border)(struct weston_compositor *ec,
> +			   int32_t width, int32_t height,
> +			   void *data, int32_t *edges);
> +
> +	void (*print_egl_error_state)(void);
> +};
> +
> +struct gl_renderer_interface gl_renderer_interface;
>



More information about the wayland-devel mailing list