[PATCH] RFC, weston: Use eglGetProcAddress to retrieve GLESv2 functions

Pekka Paalanen ppaalanen at gmail.com
Mon Sep 12 11:19:07 UTC 2016


On Sat, 10 Sep 2016 22:23:14 +0200
Armin Krezović <krezovic.armin at gmail.com> wrote:

> It appears that in current Mesa git master, GLESv2 function
> prototypes are hidden.
> 
> Per Emil's suggestion on [1], use eglGetProcAdddress to get
> the functions and update the code to use such functions.
> 
> [1] https://patchwork.freedesktop.org/patch/108369/
> 
> Signed-off-by: Armin Krezović <krezovic.armin at gmail.com>
> ---
>  clients/simple-egl.c      |  56 +++++-----
>  clients/subsurfaces.c     |  56 +++++-----
>  libweston/gl-renderer.c   | 264 +++++++++++++++++++++++-----------------------
>  shared/platform.h         | 142 +++++++++++++++++++++++++
>  tests/buffer-count-test.c |   6 +-
>  5 files changed, 337 insertions(+), 187 deletions(-)
> 

Hi Armin,

I appreciate the effort, but I've been thinking of using libepoxy for
this, to avoid all the manual labour.


> diff --git a/shared/platform.h b/shared/platform.h
> index 1eb96fd..294a948 100644
> --- a/shared/platform.h
> +++ b/shared/platform.h
> @@ -33,6 +33,7 @@
>  #include <wayland-egl.h>
>  #include <EGL/egl.h>
>  #include <EGL/eglext.h>
> +#include <GLES2/gl2.h>
>  #endif
>  
>  #include "weston-egl-ext.h"
> @@ -43,6 +44,52 @@ extern "C" {
>  
>  #ifdef ENABLE_EGL
>  
> +static PFNGLACTIVETEXTUREPROC weston_glActiveTexture;
> +static PFNGLATTACHSHADERPROC weston_glAttachShader;
> +static PFNGLBINDATTRIBLOCATIONPROC weston_glBindAttribLocation;
> +static PFNGLBINDFRAMEBUFFERPROC weston_glBindFramebuffer;
> +static PFNGLBINDTEXTUREPROC weston_glBindTexture;
> +static PFNGLBLENDFUNCPROC weston_glBlendFunc;
> +static PFNGLCHECKFRAMEBUFFERSTATUSPROC weston_glCheckFramebufferStatus;
> +static PFNGLCLEARPROC weston_glClear;
> +static PFNGLCLEARCOLORPROC weston_glClearColor;
> +static PFNGLCOMPILESHADERPROC weston_glCompileShader;
> +static PFNGLCREATEPROGRAMPROC weston_glCreateProgram;
> +static PFNGLCREATESHADERPROC weston_glCreateShader;
> +static PFNGLDELETEFRAMEBUFFERSPROC weston_glDeleteFramebuffers;
> +static PFNGLDELETEPROGRAMPROC weston_glDeleteProgram;
> +static PFNGLDELETESHADERPROC weston_glDeleteShader;
> +static PFNGLDELETETEXTURESPROC weston_glDeleteTextures;
> +static PFNGLDISABLEPROC weston_glDisable;
> +static PFNGLDISABLEVERTEXATTRIBARRAYPROC weston_glDisableVertexAttribArray;
> +static PFNGLDRAWARRAYSPROC weston_glDrawArrays;
> +static PFNGLDRAWELEMENTSPROC weston_glDrawElements;
> +static PFNGLENABLEPROC weston_glEnable;
> +static PFNGLENABLEVERTEXATTRIBARRAYPROC weston_glEnableVertexAttribArray;
> +static PFNGLFRAMEBUFFERTEXTURE2DPROC weston_glFramebufferTexture2D;
> +static PFNGLGENFRAMEBUFFERSPROC weston_glGenFramebuffers;
> +static PFNGLGENTEXTURESPROC weston_glGenTextures;
> +static PFNGLGETPROGRAMINFOLOGPROC weston_glGetProgramInfoLog;
> +static PFNGLGETPROGRAMIVPROC weston_glGetProgramiv;
> +static PFNGLGETSHADERINFOLOGPROC weston_glGetShaderInfoLog;
> +static PFNGLGETSHADERIVPROC weston_glGetShaderiv;
> +static PFNGLGETSTRINGPROC weston_glGetString;
> +static PFNGLGETUNIFORMLOCATIONPROC weston_glGetUniformLocation;
> +static PFNGLLINKPROGRAMPROC weston_glLinkProgram;
> +static PFNGLPIXELSTOREIPROC weston_glPixelStorei;
> +static PFNGLREADPIXELSPROC weston_glReadPixels;
> +static PFNGLSHADERSOURCEPROC weston_glShaderSource;
> +static PFNGLTEXIMAGE2DPROC weston_glTexImage2D;
> +static PFNGLTEXPARAMETERIPROC weston_glTexParameteri;
> +static PFNGLTEXSUBIMAGE2DPROC weston_glTexSubImage2D;
> +static PFNGLUNIFORM1FPROC weston_glUniform1f;
> +static PFNGLUNIFORM1IPROC weston_glUniform1i;
> +static PFNGLUNIFORM4FVPROC weston_glUniform4fv;
> +static PFNGLUNIFORMMATRIX4FVPROC weston_glUniformMatrix4fv;
> +static PFNGLUSEPROGRAMPROC weston_glUseProgram;
> +static PFNGLVERTEXATTRIBPOINTERPROC weston_glVertexAttribPointer;
> +static PFNGLVIEWPORTPROC weston_glViewport;
> +
>  static bool
>  weston_check_egl_extension(const char *extensions, const char *extension)
>  {
> @@ -128,6 +175,101 @@ weston_platform_create_egl_surface(EGLDisplay dpy, EGLConfig config,
>  				      attrib_list);
>  }
>  
> +static inline void
> +weston_gles2_api_init(void)
> +{
> +	weston_glActiveTexture =
> +		(void *) weston_platform_get_egl_proc_address("glActiveTexture");

weston_platform_get_egl_proc_address() is meant to used by EGL/Wayland
clients only, because it first checks that the EGL implementation
supports the Wayland platform. The compositor however is not running on
the Wayland platform if not using the wayland-backend.

Another thing is that the availability of GL ES core (not extension)
functions via eglGetProcAddress depends on
https://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_get_all_proc_addresses.txt
which we cannot assume is always present, so it needs to be checked
first.

If EGL_KHR_get_all_proc_addresses is not supported, then we need to use
dlopen/dlsym to fetch the function pointers. In this case the
implementation exports the functions from libGLESv2.so as before, we
just need the pointers to them without causing a start-up link-time
dependency on them, hence the need for dlsym().

And now I noticed that EGL_KHR_get_all_proc_addresses has another name
EGL_KHR_client_get_all_proc_addresses for a slightly different
environment/implementation...

So, as this is a problem all projects will be hitting, I'd prefer we
concentrate efforts to a common solution, which at this time seems to
be libepoxy.

I also wrote about it here:
https://bugs.freedesktop.org/show_bug.cgi?id=97773


Thanks,
pq

> +	weston_glAttachShader =
> +		(void *) weston_platform_get_egl_proc_address("glAttachShader");
> +	weston_glBindAttribLocation =
> +		(void *) weston_platform_get_egl_proc_address("glBindAttribLocation");
> +	weston_glBindFramebuffer =
> +		(void *) weston_platform_get_egl_proc_address("glBindFramebuffer");
> +	weston_glBindTexture =
> +		(void *) weston_platform_get_egl_proc_address("glBindTexture");
> +	weston_glBlendFunc =
> +		(void *)  weston_platform_get_egl_proc_address("glBlendFunc");
> +	weston_glCheckFramebufferStatus =
> +		(void *) weston_platform_get_egl_proc_address("glCheckFramebufferStatus");
> +	weston_glClear =
> +		(void *) weston_platform_get_egl_proc_address("glClear");
> +	weston_glClearColor =
> +		(void *) weston_platform_get_egl_proc_address("glClearColor");
> +	weston_glCompileShader =
> +		(void *) weston_platform_get_egl_proc_address("glCompileShader");
> +	weston_glCreateProgram =
> +		(void *) weston_platform_get_egl_proc_address("glCreateProgram");
> +	weston_glCreateShader =
> +		(void *) weston_platform_get_egl_proc_address("glCreateShader");
> +	weston_glDeleteFramebuffers =
> +		(void *) weston_platform_get_egl_proc_address("glDeleteFramebuffers");
> +	weston_glDeleteProgram =
> +		(void *) weston_platform_get_egl_proc_address("glDeleteProgram");
> +	weston_glDeleteShader =
> +		(void *) weston_platform_get_egl_proc_address("glDeleteShader");
> +	weston_glDeleteTextures =
> +		(void *) weston_platform_get_egl_proc_address("glDeleteTextures");
> +	weston_glDisable =
> +		(void *) weston_platform_get_egl_proc_address("glDisable");
> +	weston_glDisableVertexAttribArray =
> +		(void *) weston_platform_get_egl_proc_address("glDisableVertexAttribArray");
> +	weston_glDrawArrays =
> +		(void *) weston_platform_get_egl_proc_address("glDrawArrays");
> +	weston_glDrawElements =
> +		(void *) weston_platform_get_egl_proc_address("glDrawElements");
> +	weston_glEnable =
> +		(void *) weston_platform_get_egl_proc_address("glEnable");
> +	weston_glEnableVertexAttribArray =
> +		(void *) weston_platform_get_egl_proc_address("glEnableVertexAttribArray");
> +	weston_glFramebufferTexture2D =
> +		(void *) weston_platform_get_egl_proc_address("glFramebufferTexture2D");
> +	weston_glGenFramebuffers =
> +		(void *) weston_platform_get_egl_proc_address("glGenFramebuffers");
> +	weston_glGenTextures =
> +		(void *) weston_platform_get_egl_proc_address("glGenTextures");
> +	weston_glGetProgramInfoLog =
> +		(void *) weston_platform_get_egl_proc_address("glGetProgramInfoLog");
> +	weston_glGetProgramiv =
> +		(void *) weston_platform_get_egl_proc_address("glGetProgramiv");
> +	weston_glGetShaderInfoLog =
> +		(void *) weston_platform_get_egl_proc_address("glGetShaderInfoLog");
> +	weston_glGetShaderiv =
> +		(void *) weston_platform_get_egl_proc_address("glGetShaderiv");
> +	weston_glGetString =
> +		(void *) weston_platform_get_egl_proc_address("glGetString");
> +	weston_glGetUniformLocation =
> +		(void *) weston_platform_get_egl_proc_address("glGetUniformLocation");
> +	weston_glLinkProgram =
> +		(void *) weston_platform_get_egl_proc_address("glLinkProgram");
> +	weston_glPixelStorei =
> +		(void *) weston_platform_get_egl_proc_address("glPixelStorei");
> +	weston_glReadPixels =
> +		(void *) weston_platform_get_egl_proc_address("glReadPixels");
> +	weston_glShaderSource =
> +		(void *) weston_platform_get_egl_proc_address("glShaderSource");
> +	weston_glTexImage2D =
> +		(void *) weston_platform_get_egl_proc_address("glTexImage2D");
> +	weston_glTexParameteri =
> +		(void *) weston_platform_get_egl_proc_address("glTexParameteri");
> +	weston_glTexSubImage2D =
> +		(void *) weston_platform_get_egl_proc_address("glTexSubImage2D");
> +	weston_glUniform1f =
> +		(void *) weston_platform_get_egl_proc_address("glUniform1f");
> +	weston_glUniform1i =
> +		(void *) weston_platform_get_egl_proc_address("glUniform1i");
> +	weston_glUniform4fv =
> +		(void *) weston_platform_get_egl_proc_address("glUniform4fv");
> +	weston_glUniformMatrix4fv =
> +		(void *) weston_platform_get_egl_proc_address("glUniformMatrix4fv");
> +	weston_glUseProgram =
> +		(void *) weston_platform_get_egl_proc_address("glUseProgram");
> +	weston_glVertexAttribPointer =
> +		(void *) weston_platform_get_egl_proc_address("glVertexAttribPointer");
> +	weston_glViewport =
> +		(void *) weston_platform_get_egl_proc_address("glViewport");
> +}
> +
>  #else /* ENABLE_EGL */
>  
>  static inline void *
> diff --git a/tests/buffer-count-test.c b/tests/buffer-count-test.c
> index e7d8ca7..d342826 100644
> --- a/tests/buffer-count-test.c
> +++ b/tests/buffer-count-test.c
> @@ -110,7 +110,7 @@ init_egl(struct test_data *test_data)
>  
>  	/* This test is specific to mesa 10.1 and later, which is the
>  	 * first release that doesn't accidentally triple-buffer. */
> -	str = (const char *) glGetString(GL_VERSION);
> +	str = (const char *) weston_glGetString(GL_VERSION);
>  	mesa = strstr(str, "Mesa ");
>  	if (mesa == NULL)
>  		skip("unknown EGL implementation (%s)\n", str);
> @@ -132,6 +132,8 @@ TEST(test_buffer_count)
>  	if (!test_data.client->has_wl_drm)
>  		skip("compositor has not bound its display to EGL\n");
>  
> +	weston_gles2_api_init();
> +
>  	if (init_egl(&test_data) < 0)
>  		skip("could not initialize egl, "
>  		     "possibly using the headless backend\n");
> @@ -144,7 +146,7 @@ TEST(test_buffer_count)
>  	 * doing */
>  
>  	for (i = 0; i < 10; i++) {
> -		glClear(GL_COLOR_BUFFER_BIT);
> +		weston_glClear(GL_COLOR_BUFFER_BIT);
>  		eglSwapBuffers(test_data.egl_dpy, test_data.egl_surface);
>  	}
>  

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 811 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160912/4e4953c0/attachment.sig>


More information about the wayland-devel mailing list