diff options
-rw-r--r-- | configs/autoconf.in | 1 | ||||
-rw-r--r-- | configure.ac | 28 | ||||
-rw-r--r-- | src/egl/drivers/dri2/Android.mk | 1 | ||||
-rw-r--r-- | src/egl/drivers/dri2/Makefile | 4 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 8 | ||||
-rw-r--r-- | src/gallium/targets/egl-static/Makefile | 7 | ||||
-rw-r--r-- | src/gallium/targets/libgl-xlib/Makefile | 2 | ||||
-rw-r--r-- | src/glx/Makefile | 3 | ||||
-rw-r--r-- | src/glx/SConscript | 3 | ||||
-rw-r--r-- | src/glx/glxcmds.c | 2 | ||||
-rw-r--r-- | src/glx/indirect.c | 4 | ||||
-rw-r--r-- | src/glx/indirect.h | 3 | ||||
-rw-r--r-- | src/mapi/glapi/Makefile | 13 | ||||
-rw-r--r-- | src/mapi/glapi/gen/glX_proto_send.py | 6 | ||||
-rw-r--r-- | src/mesa/drivers/x11/Makefile | 2 |
15 files changed, 86 insertions, 1 deletions
diff --git a/configs/autoconf.in b/configs/autoconf.in index 55886ea8895..38fe3179f04 100644 --- a/configs/autoconf.in +++ b/configs/autoconf.in @@ -15,6 +15,7 @@ ASM_FLAGS = @ASM_FLAGS@ PIC_FLAGS = @PIC_FLAGS@ DEFINES = @DEFINES@ API_DEFINES = @API_DEFINES@ +SHARED_GLAPI = @SHARED_GLAPI@ CFLAGS_NOVISIBILITY = @CPPFLAGS@ @CFLAGS@ \ $(OPT_FLAGS) $(PIC_FLAGS) $(ARCH_FLAGS) $(ASM_FLAGS) $(DEFINES) CXXFLAGS_NOVISIBILITY = @CPPFLAGS@ @CXXFLAGS@ \ diff --git a/configure.ac b/configure.ac index f68a54fe5ad..18a40fceade 100644 --- a/configure.ac +++ b/configure.ac @@ -703,6 +703,18 @@ if test "x$enable_gles2" = xyes; then fi AC_SUBST([API_DEFINES]) +AC_ARG_ENABLE([shared-glapi], + [AS_HELP_STRING([--enable-shared-glapi], + [EXPERIMENTAL. Enable shared glapi for OpenGL @<:@default=no@:>@])], + [enable_shared_glapi="$enableval"], + [enable_shared_glapi=no]) + +SHARED_GLAPI="0" +if test "x$enable_shared_glapi" = xyes; then + SHARED_GLAPI="1" +fi +AC_SUBST([SHARED_GLAPI]) + dnl dnl Driver configuration. Options are xlib, dri and osmesa right now. dnl More later: fbdev, ... @@ -788,7 +800,7 @@ dnl Driver specific build directories dnl dnl this variable will be prepended to SRC_DIRS and is not exported -CORE_DIRS="mapi/shared-glapi" +CORE_DIRS="" SRC_DIRS="" GLU_DIRS="sgi" @@ -798,6 +810,13 @@ GALLIUM_WINSYS_DIRS="sw" GALLIUM_DRIVERS_DIRS="galahad trace rbug noop identity" GALLIUM_STATE_TRACKERS_DIRS="" +# build shared-glapi if enabled for OpenGL or if OpenGL ES is enabled +case "x$enable_shared_glapi$enable_gles1$enable_gles2" in +x*yes*) + CORE_DIRS="$CORE_DIRS mapi/shared-glapi" + ;; +esac + # build glapi if OpenGL is enabled if test "x$enable_opengl" = xyes; then CORE_DIRS="$CORE_DIRS mapi/glapi" @@ -1365,6 +1384,13 @@ if test "x$enable_gbm" = xyes; then PKG_CHECK_MODULES([LIBUDEV], [libudev], [], AC_MSG_ERROR([gbm needs udev])) + + if test "x$enable_dri" = xyes; then + GBM_BACKEND_DIRS="$GBM_BACKEND_DIRS dri" + if test "$SHARED_GLAPI" -eq 0; then + AC_MSG_ERROR([gbm_dri requires --enable-shared-glapi]) + fi + fi fi GBM_PC_REQ_PRIV="libudev" GBM_PC_LIB_PRIV="$DLOPEN_LIBS" diff --git a/src/egl/drivers/dri2/Android.mk b/src/egl/drivers/dri2/Android.mk index b120c952127..5c506f83ab2 100644 --- a/src/egl/drivers/dri2/Android.mk +++ b/src/egl/drivers/dri2/Android.mk @@ -34,6 +34,7 @@ LOCAL_SRC_FILES := \ LOCAL_CFLAGS := \ -D_EGL_MAIN=_eglBuiltInDriverDRI2 \ -DDEFAULT_DRIVER_DIR=\"/system/lib/dri\" \ + -DHAVE_SHARED_GLAPI \ -DHAVE_ANDROID_PLATFORM LOCAL_C_INCLUDES := \ diff --git a/src/egl/drivers/dri2/Makefile b/src/egl/drivers/dri2/Makefile index 5780510dca1..d2b1f4f077a 100644 --- a/src/egl/drivers/dri2/Makefile +++ b/src/egl/drivers/dri2/Makefile @@ -21,6 +21,10 @@ EGL_LIBS = $(LIBUDEV_LIBS) $(DLOPEN_LIBS) $(LIBDRM_LIB) EGL_CFLAGS = -D_EGL_MAIN=_eglBuiltInDriverDRI2 EGL_BUILTIN = true +ifeq ($(SHARED_GLAPI),1) +EGL_CFLAGS += -DHAVE_SHARED_GLAPI +endif + ifneq ($(findstring x11, $(EGL_PLATFORMS)),) EGL_SOURCES += platform_x11.c EGL_INCLUDES += -DHAVE_X11_PLATFORM $(XCB_DRI2_CFLAGS) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index a320f351655..80b2e38d9d3 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1362,11 +1362,19 @@ static EGLBoolean dri2_load(_EGLDriver *drv) { struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); +#ifdef HAVE_SHARED_GLAPI #ifdef HAVE_ANDROID_PLATFORM const char *libname = "libglapi.so"; #else const char *libname = "libglapi.so.0"; #endif +#else + /* + * Both libGL.so and libglapi.so are glapi providers. There is no way to + * tell which one to load. + */ + const char *libname = NULL; +#endif void *handle; /* RTLD_GLOBAL to make sure glapi symbols are visible to DRI drivers */ diff --git a/src/gallium/targets/egl-static/Makefile b/src/gallium/targets/egl-static/Makefile index 9e8777402cb..79a098af448 100644 --- a/src/gallium/targets/egl-static/Makefile +++ b/src/gallium/targets/egl-static/Makefile @@ -8,6 +8,7 @@ # EGL_PLATFORMS - platforms to support # EGL_CLIENT_APIS - state trackers to support # GALLIUM_WINSYS_DIRS - pipe drivers to support +# SHARED_GLAPI - st/mesa can be statically linked or not # TOP = ../../../.. @@ -69,8 +70,14 @@ endif # st/mesa ifneq ($(filter $(GL_LIB), $(EGL_CLIENT_APIS)),) egl_CPPFLAGS += -I$(TOP)/src/mesa $(API_DEFINES) +# make st/mesa built-in when there is a single glapi provider +ifeq ($(SHARED_GLAPI),1) egl_LIBS += $(TOP)/src/mesa/libmesagallium.a egl_SYS += -lm -lpthread $(DLOPEN_LIBS) -l$(GLAPI_LIB) +else +egl_CPPFLAGS += -D_EGL_EXTERNAL_GL=1 +OUTPUTS += st_GL +endif # SHARED_GLAPI endif # st/vega diff --git a/src/gallium/targets/libgl-xlib/Makefile b/src/gallium/targets/libgl-xlib/Makefile index 479e0855985..867b2da323b 100644 --- a/src/gallium/targets/libgl-xlib/Makefile +++ b/src/gallium/targets/libgl-xlib/Makefile @@ -58,7 +58,9 @@ GL_LIB_DEPS += $(LLVM_LIBS) LDFLAGS += $(LLVM_LDFLAGS) endif +ifeq ($(SHARED_GLAPI),1) GL_LIB_DEPS := -L$(TOP)/$(LIB_DIR) -l$(GLAPI_LIB) $(GL_LIB_DEPS) +endif .SUFFIXES : .cpp diff --git a/src/glx/Makefile b/src/glx/Makefile index b86bd73be34..f702f952ce7 100644 --- a/src/glx/Makefile +++ b/src/glx/Makefile @@ -49,7 +49,10 @@ SOURCES = \ applegl_glx.c +ifeq ($(SHARED_GLAPI),1) GL_LIB_DEPS := -L$(TOP)/$(LIB_DIR) -l$(GLAPI_LIB) $(GL_LIB_DEPS) +EXTRA_DEFINES += -DGLX_SHARED_GLAPI +endif # override GLAPI_LIB GLAPI_LIB = $(TOP)/src/mapi/glapi/libglapi.a diff --git a/src/glx/SConscript b/src/glx/SConscript index d08ae9e2c50..17a5690ee86 100644 --- a/src/glx/SConscript +++ b/src/glx/SConscript @@ -31,6 +31,9 @@ if env['HAVE_XF86VIDMODE']: env.Append(CPPDEFINES = ['XF86VIDMODE']) env.PkgUseModules('XF86VIDMODE') +if False: # XXX: SHARED_GLAPI + env.Append(CPPDEFINES = ['GLX_SHARED_GLAPI']) + sources = [ 'clientattrib.c', 'clientinfo.c', diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index 35f98a3aca2..37c09336749 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -2647,7 +2647,9 @@ _X_EXPORT void (*glXGetProcAddressARB(const GLubyte * procName)) (void) f = (gl_function) get_glx_proc_address((const char *) procName); if ((f == NULL) && (procName[0] == 'g') && (procName[1] == 'l') && (procName[2] != 'X')) { +#ifdef GLX_SHARED_GLAPI f = (gl_function) __indirect_get_proc_address((const char *) procName); +#endif if (!f) f = (gl_function) _glapi_get_proc_address((const char *) procName); if (!f) { diff --git a/src/glx/indirect.c b/src/glx/indirect.c index b8e14add410..a6b0c0d6dac 100644 --- a/src/glx/indirect.c +++ b/src/glx/indirect.c @@ -10672,6 +10672,8 @@ __indirect_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, } +#ifdef GLX_SHARED_GLAPI + static const struct proc_pair { const char *name; _glapi_proc proc; @@ -10727,6 +10729,8 @@ __indirect_get_proc_address(const char *name) return (pair) ? pair->proc : NULL; } +#endif /* GLX_SHARED_GLAPI */ + #undef FASTCALL #undef NOINLINE diff --git a/src/glx/indirect.h b/src/glx/indirect.h index f76201b64f1..b1fee9fc1a0 100644 --- a/src/glx/indirect.h +++ b/src/glx/indirect.h @@ -711,7 +711,10 @@ extern _X_HIDDEN GLboolean __indirect_glIsRenderbufferEXT(GLuint renderbuffer); extern _X_HIDDEN void __indirect_glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); extern _X_HIDDEN void __indirect_glBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); extern _X_HIDDEN void __indirect_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + +#ifdef GLX_SHARED_GLAPI extern _X_HIDDEN void (*__indirect_get_proc_address(const char *name))(void); +#endif # undef FASTCALL # undef NOINLINE diff --git a/src/mapi/glapi/Makefile b/src/mapi/glapi/Makefile index 37b178eee39..bb4ed6585d9 100644 --- a/src/mapi/glapi/Makefile +++ b/src/mapi/glapi/Makefile @@ -15,6 +15,7 @@ glapi_CPPFLAGS := \ -I$(TOP)/src/mapi \ -I$(TOP)/src/mesa +ifeq ($(SHARED_GLAPI),1) glapi_CPPFLAGS += \ -DMAPI_MODE_BRIDGE \ -DMAPI_ABI_HEADER=\"glapi/glapi_mapi_tmp.h\" @@ -23,6 +24,14 @@ glapi_SOURCES := $(addprefix $(MAPI)/, $(MAPI_BRIDGE_SOURCES)) glapi_GLAPI_OBJECTS := glapi_ASM_OBJECTS := glapi_MAPI_OBJECTS := $(MAPI_BRIDGE_SOURCES:.c=.o) +else +glapi_CPPFLAGS += -DMAPI_MODE_UTIL +glapi_SOURCES := $(GLAPI_SOURCES) $(addprefix $(MAPI)/, $(MAPI_UTIL_SOURCES)) + +glapi_GLAPI_OBJECTS := $(GLAPI_SOURCES:.c=.o) +glapi_ASM_OBJECTS := $(GLAPI_ASM_SOURCES:.S=.o) +glapi_MAPI_OBJECTS := $(MAPI_UTIL_SOURCES:.c=.o) +endif # SHARED_GLAPI glapi_OBJECTS := \ $(glapi_GLAPI_OBJECTS) \ @@ -50,10 +59,14 @@ clean: -rm -f lib$(TARGET).a -rm -f depend depend.bak +ifeq ($(SHARED_GLAPI),1) # workaround a bug in makedepend makedepend_CPPFLAGS := \ $(filter-out -DMAPI_ABI_HEADER=%, $(glapi_CPPFLAGS)) $(glapi_OBJECTS): glapi_mapi_tmp.h +else +makedepend_CPPFLAGS := $(glapi_CPPFLAGS) +endif depend: $(glapi_SOURCES) @ echo "running $(MKDEP)" diff --git a/src/mapi/glapi/gen/glX_proto_send.py b/src/mapi/glapi/gen/glX_proto_send.py index 29bf0808bac..bec0222188f 100644 --- a/src/mapi/glapi/gen/glX_proto_send.py +++ b/src/mapi/glapi/gen/glX_proto_send.py @@ -361,6 +361,8 @@ const GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 }; procs[n] = func.static_glx_name(n) print """ +#ifdef GLX_SHARED_GLAPI + static const struct proc_pair { const char *name; @@ -394,6 +396,8 @@ __indirect_get_proc_address(const char *name) return (pair) ? pair->proc : NULL; } + +#endif /* GLX_SHARED_GLAPI */ """ return @@ -1047,7 +1051,9 @@ extern _X_HIDDEN NOINLINE FASTCALL GLubyte * __glXSetupVendorRequest( break print '' + print '#ifdef GLX_SHARED_GLAPI' print 'extern _X_HIDDEN void (*__indirect_get_proc_address(const char *name))(void);' + print '#endif' def show_usage(): diff --git a/src/mesa/drivers/x11/Makefile b/src/mesa/drivers/x11/Makefile index acb6f082956..412fbfe1aee 100644 --- a/src/mesa/drivers/x11/Makefile +++ b/src/mesa/drivers/x11/Makefile @@ -44,7 +44,9 @@ INCLUDE_DIRS = \ CORE_MESA = $(TOP)/src/mesa/libmesa.a $(TOP)/src/mapi/glapi/libglapi.a +ifeq ($(SHARED_GLAPI),1) GL_LIB_DEPS := -L$(TOP)/$(LIB_DIR) -l$(GLAPI_LIB) $(GL_LIB_DEPS) +endif .c.o: |