diff options
author | Chia-I Wu <[email protected]> | 2010-12-26 18:24:13 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2011-01-20 17:15:50 +0800 |
commit | e8c7d7598fb48237508f566204c71ba8f74d544f (patch) | |
tree | 7265601e9bddd2d5afd6e55637ae9efcf42b7fa2 /src/glx | |
parent | 9767d3b5ad08640737e9d8dd4feb046478ae1f4b (diff) |
glapi: Fix OpenGL and OpenGL ES interop.
When --enable-shared-glapi is specified, libGL will share libglapi with
OpenGL ES instead of defining its own copy of glapi. This makes sure an
app will get only one copy of glapi in its address space.
The new option is disabled by default. When enabled, libGL and libglapi
must be built from the same source tree and distributed together. This
requirement comes from the fact that the dispatch offsets used by these
libraries are re-assigned whenever GLAPI XMLs are changed.
For GLX, indirect rendering for has_different_protocol() functions is
tricky. A has_different_protocol() function is assigned only one
dispatch offset, yet each entry point needs a different protocol opcode.
It cannot be supported by the shared glapi. The fix to this is to make
glXGetProcAddress handle such functions specially before calling
_glapi_get_proc_address.
Note that these files are automatically generated/re-generated
src/glx/indirect.c
src/glx/indirect.h
src/mapi/glapi/glapi_mapi_tmp.h
Diffstat (limited to 'src/glx')
-rw-r--r-- | src/glx/Makefile | 6 | ||||
-rw-r--r-- | src/glx/glxcmds.c | 7 | ||||
-rw-r--r-- | src/glx/indirect.c | 64 | ||||
-rw-r--r-- | src/glx/indirect.h | 4 |
4 files changed, 78 insertions, 3 deletions
diff --git a/src/glx/Makefile b/src/glx/Makefile index 2c94ef1cd4f..3d92ebbe038 100644 --- a/src/glx/Makefile +++ b/src/glx/Makefile @@ -46,6 +46,12 @@ 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 OBJECTS = $(SOURCES:.c=.o) diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index 4f7e84ef5f9..d12ff9684e2 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -36,6 +36,7 @@ #include "glxclient.h" #include "glapi.h" #include "glxextensions.h" +#include "indirect.h" #ifdef GLX_DIRECT_RENDERING #ifdef GLX_USE_APPLEGL @@ -2514,7 +2515,11 @@ _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')) { - f = (gl_function) _glapi_get_proc_address((const char *) procName); +#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); } #endif return f; diff --git a/src/glx/indirect.c b/src/glx/indirect.c index 49938a167a5..f79175b760d 100644 --- a/src/glx/indirect.c +++ b/src/glx/indirect.c @@ -10657,5 +10657,65 @@ __indirect_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, } -# undef FASTCALL -# undef NOINLINE +#ifdef GLX_SHARED_GLAPI + +static const struct proc_pair { + const char *name; + _glapi_proc proc; +} proc_pairs[20] = { + { + "AreTexturesResidentEXT", (_glapi_proc) glAreTexturesResidentEXT}, { + "DeleteTexturesEXT", (_glapi_proc) glDeleteTexturesEXT}, { + "GenTexturesEXT", (_glapi_proc) glGenTexturesEXT}, { + "GetColorTableEXT", (_glapi_proc) glGetColorTableEXT}, { + "GetColorTableParameterfvEXT", + (_glapi_proc) glGetColorTableParameterfvEXT}, { + "GetColorTableParameterfvSGI", + (_glapi_proc) glGetColorTableParameterfvEXT}, { + "GetColorTableParameterivEXT", + (_glapi_proc) glGetColorTableParameterivEXT}, { + "GetColorTableParameterivSGI", + (_glapi_proc) glGetColorTableParameterivEXT}, { + "GetColorTableSGI", (_glapi_proc) glGetColorTableEXT}, { + "GetConvolutionFilterEXT", (_glapi_proc) gl_dispatch_stub_356}, { + "GetConvolutionParameterfvEXT", (_glapi_proc) gl_dispatch_stub_357}, { + "GetConvolutionParameterivEXT", (_glapi_proc) gl_dispatch_stub_358}, { + "GetHistogramEXT", (_glapi_proc) gl_dispatch_stub_361}, { + "GetHistogramParameterfvEXT", (_glapi_proc) gl_dispatch_stub_362}, { + "GetHistogramParameterivEXT", (_glapi_proc) gl_dispatch_stub_363}, { + "GetMinmaxEXT", (_glapi_proc) gl_dispatch_stub_364}, { + "GetMinmaxParameterfvEXT", (_glapi_proc) gl_dispatch_stub_365}, { + "GetMinmaxParameterivEXT", (_glapi_proc) gl_dispatch_stub_366}, { + "GetSeparableFilterEXT", (_glapi_proc) gl_dispatch_stub_359}, { + "IsTextureEXT", (_glapi_proc) glIsTextureEXT} +}; + +static int +__indirect_get_proc_compare(const void *key, const void *memb) +{ + const struct proc_pair *pair = (const struct proc_pair *) memb; + return strcmp((const char *) key, pair->name); +} + +_glapi_proc +__indirect_get_proc_address(const char *name) +{ + const struct proc_pair *pair; + + /* skip "gl" */ + name += 2; + + pair = (const struct proc_pair *) bsearch((const void *) name, + (const void *) proc_pairs, + ARRAY_SIZE(proc_pairs), + sizeof(proc_pairs[0]), + __indirect_get_proc_compare); + + 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 f3222077bf5..b610cc20279 100644 --- a/src/glx/indirect.h +++ b/src/glx/indirect.h @@ -715,6 +715,10 @@ extern HIDDEN void __indirect_glRenderbufferStorageEXT(GLenum target, GLenum int extern 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 HIDDEN void __indirect_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#ifdef GLX_SHARED_GLAPI +extern HIDDEN void (*__indirect_get_proc_address(const char *name))(void); +#endif + # undef HIDDEN # undef FASTCALL # undef NOINLINE |