[Mesa-stable] [PATCH] mesa: do not use _glapi_new_nop_table() for DRI builds
Mark Janes
mark.a.janes at intel.com
Tue May 26 16:49:54 PDT 2015
This patch fixes `make check` for me, but v2 has been pushed, so...
Who gets to make a patch to fix master?
Tested-by: Mark Janes <mark.a.janes at intel.com>
Ian Romanick <idr at freedesktop.org> writes:
> From: Brian Paul <brianp at vmware.com>
>
> Commit 4bdbb588a9d38 introduced new _glapi_new_nop_table() and
> _glapi_set_nop_handler() functions in the glapi dispatcher (which
> live in libGL.so). The calls to those functions from context.c
> would be undefined (i.e. an ABI break) if the libGL used at runtime
> was older.
>
> For the time being, use the old single generic_nop() function for
> non-Windows builds to avoid this problem. At some point in the future
> it should be safe to remove this work-around. See comments for more
> details.
>
> v2: Incorporate feedback from Emil. Use _WIN32 instead of
> GLX_DIRECT_RENDERING to control behavior, move comments.
>
> v3 (idr): Encapsulate the knowledge about how to build the nop table in
> a new _mesa_new_nop_table function. This makes it easier for
> dispatch_sanity to keep working.
>
> Cc: 10.6 <mesa-stable at lists.freedesktop.org>
> Reviewed-and-tested-by: Ian Romanick <ian.d.romanick at intel.com> [v2]
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com> [v3]
> ---
> src/mesa/main/api_exec.h | 3 ++
> src/mesa/main/context.c | 64 +++++++++++++++++++++++++++++++--
> src/mesa/main/tests/dispatch_sanity.cpp | 2 +-
> 3 files changed, 65 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/main/api_exec.h b/src/mesa/main/api_exec.h
> index 12249fe..655cb32 100644
> --- a/src/mesa/main/api_exec.h
> +++ b/src/mesa/main/api_exec.h
> @@ -38,6 +38,9 @@ _mesa_initialize_exec_table(struct gl_context *ctx);
> extern void
> _mesa_initialize_dispatch_tables(struct gl_context *ctx);
>
> +extern struct _glapi_table *
> +_mesa_new_nop_table(unsigned numEntries);
> +
> #ifdef __cplusplus
> } // extern "C"
> #endif
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index 544cc14..e4faf3d 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,11 +938,51 @@ 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.
> + */
> +struct _glapi_table *
> +_mesa_new_nop_table(unsigned numEntries)
> +{
> + struct _glapi_table *table;
> +
> +#if !USE_GLAPI_NOP_FEATURES
> + 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;
> + }
> + }
> +#else
> + table = _glapi_new_nop_table(numEntries);
> +#endif
> + return table;
> +}
> +
> +
> /**
> * Allocate and initialize a new dispatch table. The table will be
> * populated with pointers to "no-op" functions. In turn, the no-op
> @@ -941,8 +996,9 @@ 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);
> - struct _glapi_table *table = _glapi_new_nop_table(numEntries);
> + int numEntries = MAX2(_glapi_get_dispatch_table_size(), _gloffset_COUNT);
> +
> + struct _glapi_table *table = _mesa_new_nop_table(numEntries);
>
> #if defined(_WIN32)
> if (table) {
> @@ -966,7 +1022,9 @@ alloc_dispatch_table(void)
> }
> #endif
>
> +#if USE_GLAPI_NOP_FEATURES
> _glapi_set_nop_handler(nop_handler);
> +#endif
>
> return table;
> }
> diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
> index d38b68d..c6f3c39 100644
> --- a/src/mesa/main/tests/dispatch_sanity.cpp
> +++ b/src/mesa/main/tests/dispatch_sanity.cpp
> @@ -96,7 +96,7 @@ DispatchSanity_test::SetUp()
> _mesa_init_driver_functions(&driver_functions);
>
> const unsigned size = _glapi_get_dispatch_table_size();
> - nop_table = (_glapi_proc *) _glapi_new_nop_table(size);
> + nop_table = (_glapi_proc *) _mesa_new_nop_table(size);
> }
>
> void
> --
> 2.1.0
>
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-stable
More information about the mesa-stable
mailing list