The new target installs client API modules to EGL_DRIVER_INSTALL_DIR. They are used by st/egl. The client APIs are built from OpenGL and OpenVG state trackers. For this to work, st/vega is modified to produce a static library, libvega.a, instead. st/es is also not needed any more. It is removed and --with-state-trackers=es is replaced by --enable-gles-overlay. As st/egl now has its own client API modules, this solves the ABI issue between st/egl and client APIs, as long as the client API modules are distributed with st/egl. Plus, this allows st/egl to support OpenGL with non-Gallium libGL.so.undefined
| @@ -101,6 +101,7 @@ PROGRAM_DIRS = @PROGRAM_DIRS@ | |||
| # Driver specific build vars | |||
| DRI_DIRS = @DRI_DIRS@ | |||
| EGL_DISPLAYS = @EGL_DISPLAYS@ | |||
| EGL_CLIENT_APIS = @EGL_CLIENT_APIS@ | |||
| # Dependencies | |||
| X11_INCLUDES = @X11_INCLUDES@ | |||
| @@ -116,6 +116,7 @@ GALLIUM_STATE_TRACKERS_DIRS = glx vega | |||
| # native displays EGL should support | |||
| EGL_DISPLAYS = x11 | |||
| EGL_CLIENT_APIS = $(GL_LIB) | |||
| # Library dependencies | |||
| #EXTRA_LIB_PATH ?= | |||
| @@ -749,6 +749,11 @@ AC_ARG_ENABLE([gles2], | |||
| [enable support for OpenGL ES 2.x API @<:@default=no@:>@])], | |||
| [enable_gles2="$enableval"], | |||
| [enable_gles2=no]) | |||
| AC_ARG_ENABLE([gles-overlay], | |||
| [AS_HELP_STRING([--enable-gles-overlay], | |||
| [build separate OpenGL ES only libraries @<:@default=no@:>@])], | |||
| [enable_gles_overlay="$enableval"], | |||
| [enable_gles_overlay=no]) | |||
| API_DEFINES="" | |||
| APIS="" | |||
| @@ -766,8 +771,12 @@ if test "x$enable_gles2" = xyes; then | |||
| API_DEFINES="$API_DEFINES -DFEATURE_ES2=1" | |||
| APIS="$APIS es2" | |||
| fi | |||
| if test "x$enable_gles1" = xyes -o "x$enable_gles2" = xyes; then | |||
| if test "x$enable_gles_overlay" = xyes -o \ | |||
| "x$enable_gles1" = xyes -o "x$enable_gles2" = xyes; then | |||
| CORE_DIRS="mapi/es1api mapi/es2api $CORE_DIRS" | |||
| if test "x$enable_gles_overlay" = xyes; then | |||
| CORE_DIRS="$CORE_DIRS mesa/es" | |||
| fi | |||
| fi | |||
| AC_SUBST([API_DEFINES]) | |||
| AC_SUBST([APIS]) | |||
| @@ -1253,6 +1262,10 @@ AC_SUBST([LLVM_LDFLAGS]) | |||
| AC_SUBST([LLVM_VERSION]) | |||
| VG_LIB_DEPS="" | |||
| EGL_CLIENT_APIS='$(GL_LIB)' | |||
| if test "x$enable_gles_overlay" = xyes; then | |||
| EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(GLESv1_CM_LIB) $(GLESv2_LIB)' | |||
| fi | |||
| dnl | |||
| dnl Gallium state trackers configuration | |||
| @@ -1290,11 +1303,9 @@ yes) | |||
| ;; | |||
| *) | |||
| # verify the requested state tracker exist | |||
| state_trackers=`IFS=', '; echo $with_state_trackers` | |||
| for tracker in $state_trackers; do | |||
| test -d "$srcdir/src/gallium/state_trackers/$tracker" || \ | |||
| AC_MSG_ERROR([state tracker '$tracker' doesn't exist]) | |||
| state_trackers="" | |||
| _state_trackers=`IFS=', '; echo $with_state_trackers` | |||
| for tracker in $_state_trackers; do | |||
| case "$tracker" in | |||
| dri) | |||
| if test "x$mesa_driver" != xdri; then | |||
| @@ -1314,23 +1325,44 @@ yes) | |||
| HAVE_ST_XORG="yes" | |||
| ;; | |||
| es) | |||
| if test "x$enable_gles1" != xyes -a "x$enable_gles2" != xyes; then | |||
| CORE_DIRS="mapi/es1api mapi/es2api $CORE_DIRS" | |||
| AC_MSG_WARN([state tracker 'es' has been replaced by --enable-gles-overlay]) | |||
| if test "x$enable_gles_overlay" != xyes; then | |||
| if test "x$enable_gles1" != xyes -a "x$enable_gles2" != xyes; then | |||
| CORE_DIRS="mapi/es1api mapi/es2api $CORE_DIRS" | |||
| fi | |||
| CORE_DIRS="$CORE_DIRS mesa/es" | |||
| EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(GLESv1_CM_LIB) $(GLESv2_LIB)' | |||
| fi | |||
| # mesa/es is required to build es state tracker | |||
| CORE_DIRS="$CORE_DIRS mesa/es" | |||
| tracker="" | |||
| ;; | |||
| vega) | |||
| CORE_DIRS="$CORE_DIRS mapi/vgapi" | |||
| VG_LIB_DEPS="$VG_LIB_DEPS -lpthread" | |||
| EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(VG_LIB)' | |||
| ;; | |||
| esac | |||
| if test -n "$tracker"; then | |||
| test -d "$srcdir/src/gallium/state_trackers/$tracker" || \ | |||
| AC_MSG_ERROR([state tracker '$tracker' doesn't exist]) | |||
| if test -n "$state_trackers"; then | |||
| state_trackers="$state_trackers $tracker" | |||
| else | |||
| state_trackers="$tracker" | |||
| fi | |||
| fi | |||
| done | |||
| GALLIUM_STATE_TRACKERS_DIRS="$state_trackers" | |||
| ;; | |||
| esac | |||
| AC_SUBST([VG_LIB_DEPS]) | |||
| AC_SUBST([EGL_CLIENT_APIS]) | |||
| if test "x$HAVE_ST_EGL" = xyes; then | |||
| GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS egl-apis" | |||
| fi | |||
| if test "x$HAVE_ST_XORG" = xyes; then | |||
| PKG_CHECK_MODULES(XEXT, [xextproto >= 7.0.99.1], | |||
| @@ -1587,6 +1619,9 @@ if echo "$SRC_DIRS" | grep 'gallium' >/dev/null 2>&1; then | |||
| echo " Winsys dirs: $GALLIUM_WINSYS_DIRS" | |||
| echo " Driver dirs: $GALLIUM_DRIVERS_DIRS" | |||
| echo " Trackers dirs: $GALLIUM_STATE_TRACKERS_DIRS" | |||
| if test "x$HAVE_ST_EGL" = xyes; then | |||
| echo " EGL client APIs: $EGL_CLIENT_APIS" | |||
| fi | |||
| else | |||
| echo " Gallium: no" | |||
| fi | |||
| @@ -1597,6 +1632,7 @@ echo " Shared libs: $enable_shared" | |||
| echo " Static libs: $enable_static" | |||
| if test "$enable_egl" = yes; then | |||
| echo " EGL: $EGL_DRIVERS_DIRS" | |||
| echo " EGL displays: $EGL_DISPLAYS" | |||
| else | |||
| echo " EGL: no" | |||
| fi | |||
| @@ -1,85 +0,0 @@ | |||
| # src/gallium/state_trackers/es/Makefile | |||
| # Build the ES 1/2 state tracker libraries | |||
| # This consists of core Mesa ES, plus GL/gallium state tracker. | |||
| TOP = ../../../.. | |||
| include $(TOP)/configs/current | |||
| GLES_1_VERSION_MAJOR = 1 | |||
| GLES_1_VERSION_MINOR = 1 | |||
| GLES_1_VERSION_PATCH = 0 | |||
| GLES_2_VERSION_MAJOR = 2 | |||
| GLES_2_VERSION_MINOR = 0 | |||
| GLES_2_VERSION_PATCH = 0 | |||
| # Maybe move these into configs/default: | |||
| GLES_1_LIB = GLESv1_CM | |||
| GLES_1_LIB_NAME = lib$(GLES_1_LIB).so | |||
| GLES_2_LIB = GLESv2 | |||
| GLES_2_LIB_NAME = lib$(GLES_2_LIB).so | |||
| # These two objects indirectly reference all public functions thanks to the use | |||
| # of _glapi_get_proc_address. | |||
| ES1_OBJECTS = st_es1.o | |||
| ES2_OBJECTS = st_es2.o | |||
| ES1_LIBS = \ | |||
| $(TOP)/src/mesa/es/libes1gallium.a \ | |||
| $(TOP)/src/mapi/es1api/libes1api.a | |||
| ES2_LIBS = \ | |||
| $(TOP)/src/mesa/es/libes2gallium.a \ | |||
| $(TOP)/src/mapi/es2api/libes2api.a | |||
| SYS_LIBS = -lm -pthread | |||
| INCLUDE_DIRS = \ | |||
| -I$(TOP)/include \ | |||
| -I$(TOP)/src/mapi \ | |||
| -I$(TOP)/src/mesa \ | |||
| -I$(TOP)/src/gallium/include | |||
| .c.o: | |||
| $(CC) -c $(INCLUDE_DIRS) $(DEFINES) $(CFLAGS) $< -o $@ | |||
| # Default: make both GL ES 1.1 and GL ES 2.0 libraries | |||
| default: $(TOP)/$(LIB_DIR)/$(GLES_1_LIB_NAME) $(TOP)/$(LIB_DIR)/$(GLES_2_LIB_NAME) | |||
| # Make the shared libs | |||
| $(TOP)/$(LIB_DIR)/$(GLES_1_LIB_NAME): $(ES1_OBJECTS) $(ES1_LIBS) $(GALLIUM_AUXILIARIES) | |||
| $(MKLIB) -o $(GLES_1_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ | |||
| -major $(GLES_1_VERSION_MAJOR) \ | |||
| -minor $(GLES_1_VERSION_MINOR) \ | |||
| -patch $(GLES_1_VERSION_PATCH) \ | |||
| -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \ | |||
| $(ES1_OBJECTS) $(ES1_LIBS) $(GALLIUM_AUXILIARIES) $(SYS_LIBS) | |||
| $(TOP)/$(LIB_DIR)/$(GLES_2_LIB_NAME): $(ES2_OBJECTS) $(ES1_LIBS) $(GALLIUM_AUXILIARIES) | |||
| $(MKLIB) -o $(GLES_2_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ | |||
| -major $(GLES_2_VERSION_MAJOR) \ | |||
| -minor $(GLES_2_VERSION_MINOR) \ | |||
| -patch $(GLES_2_VERSION_PATCH) \ | |||
| -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \ | |||
| $(ES2_OBJECTS) $(ES2_LIBS) $(GALLIUM_AUXILIARIES) $(SYS_LIBS) | |||
| install: default | |||
| $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/GLES | |||
| $(INSTALL) -m 644 $(TOP)/include/GLES/*.h $(DESTDIR)$(INSTALL_DIR)/include/GLES | |||
| $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/GLES2 | |||
| $(INSTALL) -m 644 $(TOP)/include/GLES2/*.h $(DESTDIR)$(INSTALL_DIR)/include/GLES2 | |||
| $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) | |||
| $(MINSTALL) $(TOP)/$(LIB_DIR)/libGLESv1* $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) | |||
| $(MINSTALL) $(TOP)/$(LIB_DIR)/libGLESv2* $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) | |||
| clean: | |||
| -rm -f *.o *~ | |||
| -rm -f $(TOP)/$(LIB_DIR)/$(GLES_1_LIB_NAME)* $(TOP)/$(LIB_DIR)/$(GLES_2_LIB_NAME)* | |||
| depend: | |||
| @@ -3,16 +3,13 @@ | |||
| TOP = ../../../.. | |||
| include $(TOP)/configs/current | |||
| VG_LIB = OpenVG | |||
| VG_LIB_NAME = lib$(VG_LIB).so | |||
| LIBNAME = vega | |||
| VG_MAJOR = 1 | |||
| VG_MINOR = 0 | |||
| VG_TINY = 0 | |||
| ### Lists of source files, included by Makefiles | |||
| LIBRARY_INCLUDES = \ | |||
| -I$(TOP)/include \ | |||
| -I$(TOP)/src/mapi | |||
| VG_SOURCES = \ | |||
| C_SOURCES = \ | |||
| api.c \ | |||
| api_context.c \ | |||
| api_filters.c \ | |||
| @@ -41,56 +38,4 @@ VG_SOURCES = \ | |||
| shader.c \ | |||
| shaders_cache.c | |||
| VG_OBJECTS = $(VG_SOURCES:.c=.o) | |||
| VG_LIBS = $(GALLIUM_AUXILIARIES) $(TOP)/src/mapi/vgapi/libvgapi.a | |||
| VG_LIB_DEPS = $(EXTRA_LIB_PATH) -lm | |||
| ### Include directories | |||
| INCLUDE_DIRS = \ | |||
| -I$(TOP)/include \ | |||
| -I$(TOP)/src/mapi \ | |||
| -I$(TOP)/src/gallium/include \ | |||
| -I$(TOP)/src/gallium/auxiliary | |||
| .c.o: | |||
| $(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@ | |||
| default: depend $(TOP)/$(LIB_DIR)/$(VG_LIB_NAME) | |||
| # Make the OpenVG library | |||
| $(TOP)/$(LIB_DIR)/$(VG_LIB_NAME): $(VG_OBJECTS) $(VG_LIBS) | |||
| $(MKLIB) -o $(VG_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ | |||
| -major $(VG_MAJOR) \ | |||
| -minor $(VG_MINOR) \ | |||
| -patch $(VG_TINY) \ | |||
| -install $(TOP)/$(LIB_DIR) \ | |||
| $(VG_OBJECTS) $(VG_LIBS) $(VG_LIB_DEPS) | |||
| ###################################################################### | |||
| # Generic stuff | |||
| depend: $(VG_SOURCES) | |||
| @ echo "running $(MKDEP)" | |||
| @ rm -f depend # workaround oops on gutsy?!? | |||
| @ touch depend | |||
| @ $(MKDEP) $(MKDEP_OPTIONS) $(DEFINES) $(INCLUDE_DIRS) $(VG_SOURCES) \ | |||
| > /dev/null 2>/dev/null | |||
| install: default | |||
| $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/VG | |||
| $(INSTALL) -m 644 $(TOP)/include/VG/*.h $(DESTDIR)$(INSTALL_DIR)/include/VG | |||
| $(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) | |||
| $(MINSTALL) $(TOP)/$(LIB_DIR)/libOpenVG* $(DESTDIR)$(INSTALL_DIR)/$(LIB_DIR) | |||
| # Emacs tags | |||
| tags: | |||
| etags `find . -name \*.[ch]` $(TOP)/include/VG/*.h | |||
| clean: | |||
| rm -f $(VG_OBJECTS) | |||
| rm -f depend depend.bak | |||
| sinclude depend | |||
| include ../../Makefile.template | |||
| @@ -0,0 +1,37 @@ | |||
| /* | |||
| * Mesa 3-D graphics library | |||
| * Version: 7.9 | |||
| * | |||
| * Copyright (C) 2010 LunarG Inc. | |||
| * | |||
| * Permission is hereby granted, free of charge, to any person obtaining a | |||
| * copy of this software and associated documentation files (the "Software"), | |||
| * to deal in the Software without restriction, including without limitation | |||
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
| * and/or sell copies of the Software, and to permit persons to whom the | |||
| * Software is furnished to do so, subject to the following conditions: | |||
| * | |||
| * The above copyright notice and this permission notice shall be included | |||
| * in all copies or substantial portions of the Software. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||
| * DEALINGS IN THE SOFTWARE. | |||
| * | |||
| * Authors: | |||
| * Chia-I Wu <olv@lunarg.com> | |||
| */ | |||
| #ifndef VG_API_H | |||
| #define VG_API_H | |||
| struct st_api; | |||
| const struct st_api * | |||
| vg_api_get(void); | |||
| #endif /* VG_API_H */ | |||
| @@ -36,6 +36,7 @@ | |||
| #include "util/u_format.h" | |||
| #include "util/u_sampler.h" | |||
| #include "vg_api.h" | |||
| #include "vg_manager.h" | |||
| #include "vg_context.h" | |||
| #include "image.h" | |||
| @@ -543,10 +544,9 @@ vg_api_get_proc_address(struct st_api *stapi, const char *procname) | |||
| static void | |||
| vg_api_destroy(struct st_api *stapi) | |||
| { | |||
| free(stapi); | |||
| } | |||
| struct st_api st_vg_api = { | |||
| static const struct st_api vg_api = { | |||
| vg_api_destroy, | |||
| vg_api_get_proc_address, | |||
| vg_api_is_visual_supported, | |||
| @@ -555,8 +555,8 @@ struct st_api st_vg_api = { | |||
| vg_api_get_current, | |||
| }; | |||
| struct st_api * | |||
| st_api_create_OpenVG(void) | |||
| const struct st_api * | |||
| vg_api_get(void) | |||
| { | |||
| return &st_vg_api; | |||
| return &vg_api; | |||
| } | |||
| @@ -0,0 +1,67 @@ | |||
| # src/gallium/targets/egl-apis | |||
| TOP = ../../../.. | |||
| include $(TOP)/configs/current | |||
| OUTPUT_PREFIX := api_ | |||
| OUTPUT_PATH := $(TOP)/$(LIB_DIR)/egl | |||
| OUTPUTS := $(addsuffix .so, $(EGL_CLIENT_APIS)) | |||
| OUTPUTS := $(addprefix $(OUTPUT_PATH)/$(OUTPUT_PREFIX), $(OUTPUTS)) | |||
| # include dirs | |||
| GL_INCLUDES := -I$(TOP)/src/mesa -I$(TOP)/src/gallium/include | |||
| GLESv1_CM_INCLUDES := $(GL_INCLUDES) | |||
| GLESv2_INCLUDES := $(GL_INCLUDES) | |||
| OpenVG_INCLUDES := -I$(TOP)/src/gallium/state_trackers/vega -I$(TOP)/src/gallium/include | |||
| # system libs | |||
| GL_SYS := -lpthread -lm -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) | |||
| GLESv1_CM_SYS := -lpthread -lm -L$(TOP)/$(LIB_DIR) -l$(GLESv1_CM_LIB) | |||
| GLESv2_SYS := -lpthread -lm -L$(TOP)/$(LIB_DIR) -l$(GLESv2_LIB) | |||
| OpenVG_SYS := -lm -L$(TOP)/$(LIB_DIR) -l$(VG_LIB) | |||
| # project libs | |||
| GL_LIBS := $(TOP)/src/mesa/libmesagallium.a | |||
| GLESv1_CM_LIBS := $(TOP)/src/mesa/es/libes1gallium.a | |||
| GLESv2_LIBS := $(TOP)/src/mesa/es/libes2gallium.a | |||
| OpenVG_LIBS := $(TOP)/src/gallium/state_trackers/vega/libvega.a | |||
| # objects | |||
| GL_OBJECTS := api_GL.o | |||
| GLESv1_CM_OBJECTS := api_GLESv1_CM.o | |||
| GLESv2_OBJECTS := api_GLESv2.o | |||
| OpenVG_OBJECTS := api_OpenVG.o | |||
| default: $(OUTPUTS) | |||
| api_%.o: api_%.c | |||
| $(CC) -c -o $@ $< $($*_INCLUDES) $(DEFINES) $(CFLAGS) | |||
| define mklib | |||
| $(MKLIB) -o $(notdir $@) -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \ | |||
| -install $(OUTPUT_PATH) $(MKLIB_OPTIONS) \ | |||
| $($(1)_OBJECTS) $($(1)_LIBS) $(GALLIUM_AUXILIARIES) $($(1)_SYS) | |||
| endef | |||
| $(OUTPUT_PATH)/$(OUTPUT_PREFIX)$(GL_LIB).so: $(GL_OBJECTS) $(GL_LIBS) | |||
| $(call mklib,GL) | |||
| $(OUTPUT_PATH)/$(OUTPUT_PREFIX)$(GLESv1_CM_LIB).so: $(GLESv1_CM_OBJECTS) $(GLESv1_CM_LIBS) | |||
| $(call mklib,GLESv1_CM) | |||
| $(OUTPUT_PATH)/$(OUTPUT_PREFIX)$(GLESv2_LIB).so: $(GLESv2_OBJECTS) $(GLESv2_LIBS) | |||
| $(call mklib,GLESv2) | |||
| $(OUTPUT_PATH)/$(OUTPUT_PREFIX)$(VG_LIB).so: $(OpenVG_OBJECTS) $(OpenVG_LIBS) | |||
| $(call mklib,OpenVG) | |||
| install: $(OUTPUTS) | |||
| $(INSTALL) -d $(DESTDIR)$(EGL_DRIVER_INSTALL_DIR) | |||
| for out in $(OUTPUTS); do \ | |||
| $(MINSTALL) -m 755 "$$out" $(DESTDIR)$(EGL_DRIVER_INSTALL_DIR); \ | |||
| done | |||
| clean: | |||
| -rm -f $(OUTPUTS) | |||
| -rm -f *.o | |||
| @@ -0,0 +1,7 @@ | |||
| #include "state_tracker/st_gl_api.h" | |||
| PUBLIC struct st_api * | |||
| st_api_create_OpenGL() | |||
| { | |||
| return st_gl_api_create(); | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| #include "state_tracker/st_api.h" | |||
| #include "vg_api.h" | |||
| PUBLIC struct st_api * | |||
| st_api_create_OpenVG() | |||
| { | |||
| return (struct st_api *) vg_api_get(); | |||
| } | |||