diff options
-rw-r--r-- | src/mesa/main/context.c | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 544cc142fde..02875ba2a06 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -883,6 +883,19 @@ update_default_objects(struct gl_context *ctx) } +/* XXX this is temporary and should be removed at some point in the + * future when there's a reasonable expectation that the libGL library + * contains the _glapi_new_nop_table() and _glapi_set_nop_handler() + * functions which were added in Mesa 10.6. + */ +#if !defined(_WIN32) +/* Avoid libGL / driver ABI break */ +#define USE_GLAPI_NOP_FEATURES 0 +#else +#define USE_GLAPI_NOP_FEATURES 1 +#endif + + /** * This function is called by the glapi no-op functions. For each OpenGL * function/entrypoint there's a simple no-op function. These "no-op" @@ -898,6 +911,7 @@ update_default_objects(struct gl_context *ctx) * * \param name the name of the OpenGL function */ +#if USE_GLAPI_NOP_FEATURES static void nop_handler(const char *name) { @@ -914,6 +928,7 @@ nop_handler(const char *name) } #endif } +#endif /** @@ -923,7 +938,45 @@ nop_handler(const char *name) static void GLAPIENTRY nop_glFlush(void) { - /* don't record an error like we do in _mesa_generic_nop() */ + /* don't record an error like we do in nop_handler() */ +} +#endif + + +#if !USE_GLAPI_NOP_FEATURES +static int +generic_nop(void) +{ + GET_CURRENT_CONTEXT(ctx); + _mesa_error(ctx, GL_INVALID_OPERATION, + "unsupported function called " + "(unsupported extension or deprecated function?)"); + return 0; +} +#endif + + +/** + * Create a new API dispatch table in which all entries point to the + * generic_nop() function. This will not work on Windows because of + * the __stdcall convention which requires the callee to clean up the + * call stack. That's impossible with one generic no-op function. + */ +#if !USE_GLAPI_NOP_FEATURES +static struct _glapi_table * +new_nop_table(unsigned numEntries) +{ + struct _glapi_table *table; + + table = malloc(numEntries * sizeof(_glapi_proc)); + if (table) { + _glapi_proc *entry = (_glapi_proc *) table; + unsigned i; + for (i = 0; i < numEntries; i++) { + entry[i] = (_glapi_proc) generic_nop; + } + } + return table; } #endif @@ -941,7 +994,11 @@ alloc_dispatch_table(void) * Mesa we do this to accommodate different versions of libGL and various * DRI drivers. */ - GLint numEntries = MAX2(_glapi_get_dispatch_table_size(), _gloffset_COUNT); + int numEntries = MAX2(_glapi_get_dispatch_table_size(), _gloffset_COUNT); + +#if !USE_GLAPI_NOP_FEATURES + struct _glapi_table *table = new_nop_table(numEntries); +#else struct _glapi_table *table = _glapi_new_nop_table(numEntries); #if defined(_WIN32) @@ -967,6 +1024,7 @@ alloc_dispatch_table(void) #endif _glapi_set_nop_handler(nop_handler); +#endif return table; } |