From 948e3fa27ca9112b903a180d1a18c61cfb2928dc Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 10 Sep 2010 12:59:43 +0800 Subject: st/egl: Use profiles to create OpenGL ES contexts. Replace all uses of ST_API_OPENGL_ES{1,2} by profiles. Having 3 st_api's to provide OpenGL, OpenGL ES 1.1, and OpenGL ES 2.0 is not a sane abstraction, since all of them share glapi for current context/dispatch management. --- src/gallium/targets/egl/Makefile | 3 +- src/gallium/targets/egl/egl.c | 92 ++++++++++++++-------------------- src/gallium/targets/egl/st_GL.c | 18 ------- src/gallium/targets/egl/st_GLESv1_CM.c | 4 +- src/gallium/targets/egl/st_GLESv2.c | 4 +- 5 files changed, 43 insertions(+), 78 deletions(-) (limited to 'src/gallium/targets/egl') diff --git a/src/gallium/targets/egl/Makefile b/src/gallium/targets/egl/Makefile index 2784fd0d10..78f7241199 100644 --- a/src/gallium/targets/egl/Makefile +++ b/src/gallium/targets/egl/Makefile @@ -126,7 +126,8 @@ endif # OpenGL state tracker GL_CPPFLAGS := -I$(TOP)/src/mesa $(API_DEFINES) -GL_SYS := $(DRI_LIB_DEPS) -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) +# do not link to $(GL_LIB) as the it supports GLES too +GL_SYS := $(DRI_LIB_DEPS) GL_LIBS := $(TOP)/src/mesa/libmesagallium.a # OpenGL ES 1.x state tracker diff --git a/src/gallium/targets/egl/egl.c b/src/gallium/targets/egl/egl.c index a573b21217..7c6bb58aec 100644 --- a/src/gallium/targets/egl/egl.c +++ b/src/gallium/targets/egl/egl.c @@ -98,6 +98,8 @@ load_st_module(struct st_module *stmod, { struct st_api *(*create_api)(void); + _eglLog(_EGL_DEBUG, "searching for st module %s", name); + stmod->name = loader_strdup(name); if (stmod->name) _eglSearchPathForEach(dlopen_st_module_cb, (void *) stmod); @@ -187,7 +189,7 @@ load_pipe_module(struct pipe_module *pmod, const char *name) } static struct st_api * -get_st_api(enum st_api_type api) +get_st_api_full(enum st_api_type api, enum st_profile_type profile) { struct st_module *stmod = &st_modules[api]; const char *names[8], *symbol; @@ -199,17 +201,19 @@ get_st_api(enum st_api_type api) switch (api) { case ST_API_OPENGL: symbol = ST_CREATE_OPENGL_SYMBOL; - names[count++] = "GL"; - break; - case ST_API_OPENGL_ES1: - symbol = ST_CREATE_OPENGL_ES1_SYMBOL; - names[count++] = "GLESv1_CM"; - names[count++] = "GL"; - break; - case ST_API_OPENGL_ES2: - symbol = ST_CREATE_OPENGL_ES2_SYMBOL; - names[count++] = "GLESv2"; - names[count++] = "GL"; + switch (profile) { + case ST_PROFILE_OPENGL_ES1: + names[count++] = "GLESv1_CM"; + names[count++] = "GL"; + break; + case ST_PROFILE_OPENGL_ES2: + names[count++] = "GLESv2"; + names[count++] = "GL"; + break; + default: + names[count++] = "GL"; + break; + } break; case ST_API_OPENVG: symbol = ST_CREATE_OPENVG_SYMBOL; @@ -230,7 +234,7 @@ get_st_api(enum st_api_type api) } if (!stmod->stapi) { - EGLint level = (egl_g3d_loader.api_mask & (1 << api)) ? + EGLint level = (egl_g3d_loader.profile_masks[api]) ? _EGL_WARNING : _EGL_DEBUG; _eglLog(level, "unable to load " ST_PREFIX "%s" UTIL_DL_EXT, names[0]); } @@ -241,50 +245,31 @@ get_st_api(enum st_api_type api) } static struct st_api * -guess_gl_api(void) +get_st_api(enum st_api_type api) { - struct st_api *stapi; - int gl_apis[] = { - ST_API_OPENGL, - ST_API_OPENGL_ES1, - ST_API_OPENGL_ES2, - -1 - }; - int i, api = -1; - - /* determine the api from the loaded libraries */ - for (i = 0; gl_apis[i] != -1; i++) { - if (st_modules[gl_apis[i]].stapi) { - api = gl_apis[i]; - break; - } - } - /* determine the api from the linked libraries */ - if (api == -1) { - struct util_dl_library *self = util_dl_open(NULL); + enum st_profile_type profile = ST_PROFILE_DEFAULT; + /* determine the profile from the linked libraries */ + if (api == ST_API_OPENGL) { + struct util_dl_library *self; + + self = util_dl_open(NULL); if (self) { - if (util_dl_get_proc_address(self, "glColor4d")) - api = ST_API_OPENGL; - else if (util_dl_get_proc_address(self, "glColor4x")) - api = ST_API_OPENGL_ES1; + if (util_dl_get_proc_address(self, "glColor4x")) + profile = ST_PROFILE_OPENGL_ES1; else if (util_dl_get_proc_address(self, "glShaderBinary")) - api = ST_API_OPENGL_ES2; + profile = ST_PROFILE_OPENGL_ES2; util_dl_close(self); } } - stapi = (api != -1) ? get_st_api(api) : NULL; - if (!stapi) { - for (i = 0; gl_apis[i] != -1; i++) { - api = gl_apis[i]; - stapi = get_st_api(api); - if (stapi) - break; - } - } + return get_st_api_full(api, profile); +} - return stapi; +static struct st_api * +guess_gl_api(enum st_profile_type profile) +{ + return get_st_api_full(ST_API_OPENGL, profile); } static struct pipe_module * @@ -333,23 +318,20 @@ create_sw_screen(struct sw_winsys *ws) static const struct egl_g3d_loader * loader_init(void) { - uint api_mask = 0x0; - /* TODO detect at runtime? */ #if FEATURE_GL - api_mask |= 1 << ST_API_OPENGL; + egl_g3d_loader.profile_masks[ST_API_OPENGL] |= ST_PROFILE_DEFAULT_MASK; #endif #if FEATURE_ES1 - api_mask |= 1 << ST_API_OPENGL_ES1; + egl_g3d_loader.profile_masks[ST_API_OPENGL] |= ST_PROFILE_OPENGL_ES1_MASK; #endif #if FEATURE_ES2 - api_mask |= 1 << ST_API_OPENGL_ES2; + egl_g3d_loader.profile_masks[ST_API_OPENGL] |= ST_PROFILE_OPENGL_ES2_MASK; #endif #if FEATURE_VG - api_mask |= 1 << ST_API_OPENVG; + egl_g3d_loader.profile_masks[ST_API_OPENVG] |= ST_PROFILE_DEFAULT_MASK; #endif - egl_g3d_loader.api_mask = api_mask; egl_g3d_loader.get_st_api = get_st_api; egl_g3d_loader.guess_gl_api = guess_gl_api; egl_g3d_loader.create_drm_screen = create_drm_screen; diff --git a/src/gallium/targets/egl/st_GL.c b/src/gallium/targets/egl/st_GL.c index 17b7bf9d48..69c8f7a83c 100644 --- a/src/gallium/targets/egl/st_GL.c +++ b/src/gallium/targets/egl/st_GL.c @@ -1,26 +1,8 @@ #include "state_tracker/st_gl_api.h" #include "state_tracker/st_api.h" -#if FEATURE_GL PUBLIC struct st_api * st_api_create_OpenGL(void) { return st_gl_api_create(); } -#endif - -#if FEATURE_ES1 -PUBLIC struct st_api * -st_api_create_OpenGL_ES1(void) -{ - return st_gl_api_create_es1(); -} -#endif - -#if FEATURE_ES2 -PUBLIC struct st_api * -st_api_create_OpenGL_ES2(void) -{ - return st_gl_api_create_es2(); -} -#endif diff --git a/src/gallium/targets/egl/st_GLESv1_CM.c b/src/gallium/targets/egl/st_GLESv1_CM.c index c1652d5131..016bb4e9d0 100644 --- a/src/gallium/targets/egl/st_GLESv1_CM.c +++ b/src/gallium/targets/egl/st_GLESv1_CM.c @@ -2,7 +2,7 @@ #include "state_tracker/st_gl_api.h" PUBLIC struct st_api * -st_api_create_OpenGL_ES1(void) +st_api_create_OpenGL(void) { - return st_gl_api_create_es1(); + return st_gl_api_create(); } diff --git a/src/gallium/targets/egl/st_GLESv2.c b/src/gallium/targets/egl/st_GLESv2.c index 9c26989008..016bb4e9d0 100644 --- a/src/gallium/targets/egl/st_GLESv2.c +++ b/src/gallium/targets/egl/st_GLESv2.c @@ -2,7 +2,7 @@ #include "state_tracker/st_gl_api.h" PUBLIC struct st_api * -st_api_create_OpenGL_ES2(void) +st_api_create_OpenGL(void) { - return st_gl_api_create_es2(); + return st_gl_api_create(); } -- cgit v1.2.3