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

Kristian Høgsberg hoegsberg at gmail.com
Fri Oct 11 22:28:22 CEST 2013


On Fri, Oct 11, 2013 at 05:07:27PM +0300, 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. It also has an extra flags field
> for specifying that the module be loaded with RTLD_GLOBAL. This works
> around having unresolved symbols when loading the dri drivers.
> 
> The gl renderer interface is changed so that there is only one symbol
> that needs to be dlsym()'d. This symbol contains pointer 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.
> 
> ---
> 
> Hi,
> 
> I'm not sure about the RTLD_GLOBAL change. There is a workaround in EGL
> that dlopens libglapi.so with RTLD_GLOBAL specifically to avoid failing
> to load the dri driver because of missing symbols. However, that work
> around does not work when using gbm because it uses its own loader code
> and also doesn't work when mesa is compiled without a shared glapi.

In current mesa, the DRI drivers link to libglapi, but not in mesa
9.2.  I'm not sure what change or when this was fixed, it's no longer
necessary.  Either way, with or without the gbm changes to not load
the dri driver, next mesa will work fine.  If we do want to work
around it (I think we do), we could instead have a

	dlopen("libglapi.so.0", RTLD_LAZY | RTLD_GLOBAL);

before gbm_create_device() in gl-renderer.c.  That's fairly hacky, of
course, but I'd like to avoid opening the renderer with RTLD_GLOBAL.

> Also, I didn't test the change with the fbdev backend.
> 
> Thanks,
> Ander
> 
> ---
>  configure.ac             |  2 +-
>  src/Makefile.am          | 28 ++++++++++-----
>  src/compositor-drm.c     | 20 +++++++----
>  src/compositor-fbdev.c   | 19 +++++++---
>  src/compositor-wayland.c | 21 +++++++----
>  src/compositor-x11.c     | 31 ++++++++++++----
>  src/compositor.c         | 16 ++++++---
>  src/compositor.h         |  5 +++
>  src/gl-renderer.c        | 31 +++++++++++-----
>  src/gl-renderer.h        | 93 ++++++++++++++----------------------------------
>  10 files changed, 155 insertions(+), 111 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 5abf65f..0b91e57 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"

We need

	COMPOSITOR_MODULES="$COMPOSITOR_MODULES libdrm"

instead for the libdrm usage in launcher-util.c.

The rest looks good.

Kristian

> +	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..3699f34 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -193,6 +193,8 @@ struct drm_sprite {
>  	uint32_t formats[];
>  };
>  
> +static struct gl_renderer_interface *gl_renderer;
> +
>  static const char default_seat[] = "seat0";
>  
>  static void
> @@ -1083,7 +1085,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 +1176,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 +1244,20 @@ 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",
> +					 WESTON_LOAD_MODULE_GLOBAL);
> +	if (!gl_renderer)
> +		return -1;
> +
>  	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 +1459,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..d386c3a 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,17 @@ 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",
> +						 WESTON_LOAD_MODULE_GLOBAL);
> +		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..b1e8bdf 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,15 @@ 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",
> +					 WESTON_LOAD_MODULE_GLOBAL);
> +	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 +768,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..a8ffd24 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,22 @@ 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",
> +					 WESTON_LOAD_MODULE_GLOBAL);
> +	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 +1518,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..4955b02 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -3222,11 +3222,12 @@ 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, int flags)
>  {
>  	char path[PATH_MAX];
>  	void *module, *init;
> +	int mode;
>  
>  	if (name[0] != '/')
>  		snprintf(path, sizeof path, "%s/%s", MODULEDIR, name);
> @@ -3240,8 +3241,13 @@ load_module(const char *name, const char *entrypoint)
>  		return NULL;
>  	}
>  
> +	mode = RTLD_NOW;
> +
> +	if (flags & WESTON_LOAD_MODULE_GLOBAL)
> +		mode |= RTLD_GLOBAL;
> +
>  	weston_log("Loading module '%s'\n", path);
> -	module = dlopen(path, RTLD_NOW);
> +	module = dlopen(path, mode);
>  	if (!module) {
>  		weston_log("Failed to load module: %s\n", dlerror());
>  		return NULL;
> @@ -3273,7 +3279,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", 0);
>  		if (module_init)
>  			module_init(ec, argc, argv);
>  		p = end;
> @@ -3507,7 +3513,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", 0);
>  	if (!backend_init)
>  		exit(EXIT_FAILURE);
>  
> diff --git a/src/compositor.h b/src/compositor.h
> index a19d966..0619496 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -1241,6 +1241,11 @@ weston_transformed_rect(int width, int height,
>  			int32_t scale,
>  			pixman_box32_t rect);
>  
> +#define WESTON_LOAD_MODULE_GLOBAL 1
> +
> +void *
> +weston_load_module(const char *name, const char *entrypoint, int flags);
> +
>  #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;
> -- 
> 1.8.1.2
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list