[Mesa-dev] [PATCH] mesa: do not use _glapi_new_nop_table() for DRI builds
Emil Velikov
emil.l.velikov at gmail.com
Fri May 15 10:14:23 PDT 2015
On 15/05/15 15:13, Brian Paul wrote:
> 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
> DRI 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.
> ---
> src/mesa/main/context.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 59 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index 544cc14..0649708 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(GLX_DIRECT_RENDERING)
I'd say that this should be WIN32, similar to the original code. The
code is indirectly used by gbm/egl as well, so introducing
GLX_{IN,}DIRECT_RENDERING here might not fair so well.
> +/* 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
>
>
> /**
> @@ -928,6 +943,44 @@ nop_glFlush(void)
Seems like the macro guarding nop_glFlush() should be
USE_GLAPI_NOP_FEATURES ? Then we can drop the explicit
!USE_GLAPI_NOP_FEATURES below and use #else.
The comment within nop_glFlush could use an update as well.
> #endif
>
>
> +#if !USE_GLAPI_NOP_FEATURES
Fold this and the follow up function new_nop_table() into #if block ?
> +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;
> + }
Bikeshed: One could use memset, analogous to the memcpy() in
_glapi_new_nop_table.
> + }
> + return table;
> +}
> +#endif
> +
> +
> /**
> * Allocate and initialize a new dispatch table. The table will be
> * populated with pointers to "no-op" functions. In turn, the no-op
> @@ -936,12 +989,16 @@ nop_glFlush(void)
> static struct _glapi_table *
> alloc_dispatch_table(void)
> {
> + int numEntries = MAX2(_glapi_get_dispatch_table_size(), _gloffset_COUNT);
> +
> +#if !USE_GLAPI_NOP_FEATURES
> + struct _glapi_table *table = new_nop_table(numEntries);
> +#else
> /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
> * In practice, this'll be the same for stand-alone Mesa. But for DRI
> * Mesa we do this to accommodate different versions of libGL and various
> * DRI drivers.
> */
Move the comment as well as numEntries.
> - GLint numEntries = MAX2(_glapi_get_dispatch_table_size(), _gloffset_COUNT);
> 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;
> }
>
Should we revert commit 627991dbf74(dri: add _glapi_set_nop_handler(),
_glapi_new_nop_table() to dri_test.c) now that the new symbols are no
longer around ?
src/mesa/main/tests/dispatch_sanity.cpp should be updated as well imho.
In one hand we can restore the original behaviour (!WIN32 only) on the
other we can extend it to cover USE_GLAPI_NOP_FEATURES.
Cheers,
Emil
More information about the mesa-dev
mailing list