[waffle] [PATCH 2/3] egl: retrieve the libEGL function pointers at wegl_platform_init()
Jordan Justen
jljusten at gmail.com
Tue Sep 2 00:49:17 PDT 2014
On Tue, Aug 26, 2014 at 10:47 AM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
> Which will be used in our next step, to make libEGL free waffle.
> Paving the way of waffle to have little to-no dependencies.
>
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---
> src/waffle/egl/wegl_platform.c | 70 ++++++++++++++++++++++++++++++++++++++++--
> src/waffle/egl/wegl_platform.h | 36 ++++++++++++++++++++++
> 2 files changed, 104 insertions(+), 2 deletions(-)
>
> diff --git a/src/waffle/egl/wegl_platform.c b/src/waffle/egl/wegl_platform.c
> index b67e8d2..5766adb 100644
> --- a/src/waffle/egl/wegl_platform.c
> +++ b/src/waffle/egl/wegl_platform.c
> @@ -23,14 +23,32 @@
> // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>
> +#include <dlfcn.h>
> +
> +#include "wcore_error.h"
> #include "wegl_platform.h"
>
> +// XXX: Use the actual SONAME for linux ?
> +// Should we treat Android the same way as linux ?
> +static const char *libEGL_filename = "libEGL.so";
I think we should use libEGL.so.1 to specify the library ABI version.
(But, waffle only does this on libGL.)
BTW, I tested with gbm and x11_egl. It would be good to test Wayland
and Android too.
> bool
> wegl_platform_teardown(struct wegl_platform *self)
> {
> - bool ok;
> + bool ok = true;
> + int error = 0;
>
> - ok = wcore_platform_teardown(&self->wcore);
> + if (self->eglHandle) {
> + error = dlclose(self->eglHandle);
> + if (error) {
> + ok = false;
> + wcore_errorf(WAFFLE_ERROR_UNKNOWN,
>
> + "dlclose(\"%s\") failed: %s",
> + libEGL_filename, dlerror());
> + }
> + }
> +
> + ok &= wcore_platform_teardown(&self->wcore);
> return ok;
> }
> bool
> @@ -39,6 +57,54 @@ wegl_platform_init(struct wegl_platform *self)
> bool ok;
>
> ok = wcore_platform_init(&self->wcore);
> + if (!ok)
> + goto error;
> +
> + self->eglHandle = dlopen(libEGL_filename, RTLD_LAZY | RTLD_LOCAL);
> + if (!self->eglHandle) {
> + wcore_errorf(WAFFLE_ERROR_UNKNOWN,
Chad, would WAFFLE_ERROR_FATAL be appropriate here (and below)?
-Jordan
> + "dlopen(\"%s\") failed: %s",
> + libEGL_filename, dlerror());
> + goto error;
> + }
> +
> +#define RETREIVE_EGL_SYMBOL(function) \
> + self->function = dlsym(self->eglHandle, #function); \
> + if (!self->function) { \
> + wcore_errorf(WAFFLE_ERROR_UNKNOWN, \
> + "dlsym(\"%s\", \"" #function "\") failed: %s", \
> + libEGL_filename, dlerror()); \
> + goto error; \
> + }
> +
> + RETREIVE_EGL_SYMBOL(eglMakeCurrent);
> + RETREIVE_EGL_SYMBOL(eglGetProcAddress);
> +
> + // display
> + RETREIVE_EGL_SYMBOL(eglGetDisplay);
> + RETREIVE_EGL_SYMBOL(eglInitialize);
> + RETREIVE_EGL_SYMBOL(eglQueryString);
> + RETREIVE_EGL_SYMBOL(eglGetError);
> + RETREIVE_EGL_SYMBOL(eglTerminate);
> +
> + // config
> + RETREIVE_EGL_SYMBOL(eglChooseConfig);
> +
> + // context
> + RETREIVE_EGL_SYMBOL(eglBindAPI);
> + RETREIVE_EGL_SYMBOL(eglCreateContext);
> + RETREIVE_EGL_SYMBOL(eglDestroyContext);
> +
> + // window
> + RETREIVE_EGL_SYMBOL(eglGetConfigAttrib);
> + RETREIVE_EGL_SYMBOL(eglCreateWindowSurface);
> + RETREIVE_EGL_SYMBOL(eglDestroySurface);
> + RETREIVE_EGL_SYMBOL(eglSwapBuffers);
> +
> +#undef RETREIVE_EGL_SYMBOL
>
> +error:
> + // On failure the caller of wegl_platform_init will trigger it's own
> + // destruction which will execute wegl_platform_teardown.
> return ok;
> }
> diff --git a/src/waffle/egl/wegl_platform.h b/src/waffle/egl/wegl_platform.h
> index 43108dc..645c3f8 100644
> --- a/src/waffle/egl/wegl_platform.h
> +++ b/src/waffle/egl/wegl_platform.h
> @@ -25,6 +25,8 @@
>
> #pragma once
>
> +#include <EGL/egl.h>
> +
> #include "wcore_platform.h"
> #include "wcore_util.h"
>
> @@ -32,6 +34,40 @@ struct wegl_platform {
> struct wcore_platform wcore;
>
> // EGL function pointers
> + void *eglHandle;
> +
> + EGLBoolean (*eglMakeCurrent)(EGLDisplay dpy, EGLSurface draw,
> + EGLSurface read, EGLContext ctx);
> + __eglMustCastToProperFunctionPointerType
> + (*eglGetProcAddress)(const char *procname);
> +
> + // display
> + EGLDisplay (*eglGetDisplay)(EGLNativeDisplayType display_id);
> + EGLBoolean (*eglInitialize)(EGLDisplay dpy, EGLint *major, EGLint *minor);
> + const char * (*eglQueryString)(EGLDisplay dpy, EGLint name);
> + EGLint (*eglGetError)(void);
> + EGLBoolean (*eglTerminate)(EGLDisplay dpy);
> +
> + // config
> + EGLBoolean (*eglChooseConfig)(EGLDisplay dpy, const EGLint *attrib_list,
> + EGLConfig *configs, EGLint config_size,
> + EGLint *num_config);
> +
> + // context
> + EGLBoolean (*eglBindAPI)(EGLenum api);
> + EGLContext (*eglCreateContext)(EGLDisplay dpy, EGLConfig config,
> + EGLContext share_context,
> + const EGLint *attrib_list);
> + EGLBoolean (*eglDestroyContext)(EGLDisplay dpy, EGLContext ctx);
> +
> + // window
> + EGLBoolean (*eglGetConfigAttrib)(EGLDisplay dpy, EGLConfig config,
> + EGLint attribute, EGLint *value);
> + EGLSurface (*eglCreateWindowSurface)(EGLDisplay dpy, EGLConfig config,
> + EGLNativeWindowType win,
> + const EGLint *attrib_list);
> + EGLBoolean (*eglDestroySurface)(EGLDisplay dpy, EGLSurface surface);
> + EGLBoolean (*eglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
> };
>
> DEFINE_CONTAINER_CAST_FUNC(wegl_platform,
> --
> 2.0.2
>
> _______________________________________________
> waffle mailing list
> waffle at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/waffle
More information about the waffle
mailing list