mesa/glthread: restore the dispatch table when incompatible gl calls are detected

While a context only has a single glthread, the context itself can be
attached to several threads. Therefore the dispatch table must be
updated in all threads before the destruction of glthread. In others
words, glthread can only be destroyed safely when the context is deleted.

Fixes remaining crashes in the glx-multithread-makecurrent* tests.

V2: (Timothy Arceri) updated gl_API.dtd marshal_fail description.

Signed-off-by: Gregory Hainaut <gregory.hainaut@gmail.com>
Acked-by: Timothy Arceri <tarceri@itsqueeze.com>
Acked-by: Marek Olšák <maraeo@gmail.com>
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Tested-by: Mike Lothian <mike@fireburn.co.uk>
This commit is contained in:
Gregory Hainaut 2017-02-12 15:21:47 +01:00 committed by Timothy Arceri
parent 70e715eea6
commit 93bdad3253
4 changed files with 18 additions and 4 deletions

View File

@ -131,9 +131,9 @@ param:
If "draw", it will follow the "async" rules except that "indices" are
ignored (since they may come from a VBO).
marshal_fail - an expression that, if it evaluates true, causes glthread
to finish and tear down before the Mesa implementation is called
directly. Used to disable glthread for GL compatibility interactions
that we don't want to track state for.
to switch back to the Mesa implementation and call it directly. Used
to disable glthread for GL compatibility interactions that we don't
want to track state for.
glx:
rop - Opcode value for "render" commands

View File

@ -239,7 +239,8 @@ class PrintCode(gl_XML.gl_print_base):
if func.marshal_fail:
out('if ({0}) {{'.format(func.marshal_fail))
with indent():
out('_mesa_glthread_destroy(ctx);')
out('_mesa_glthread_finish(ctx);')
out('_mesa_glthread_restore_dispatch(ctx);')
self.print_sync_dispatch(func)
out('return;')
out('}')

View File

@ -173,6 +173,12 @@ _mesa_glthread_destroy(struct gl_context *ctx)
free(glthread);
ctx->GLThread = NULL;
_mesa_glthread_restore_dispatch(ctx);
}
void
_mesa_glthread_restore_dispatch(struct gl_context *ctx)
{
/* Remove ourselves from the dispatch table except if another ctx/thread
* already installed a new dispatch table.
*

View File

@ -119,6 +119,7 @@ struct glthread_batch
void _mesa_glthread_init(struct gl_context *ctx);
void _mesa_glthread_destroy(struct gl_context *ctx);
void _mesa_glthread_restore_dispatch(struct gl_context *ctx);
void _mesa_glthread_flush_batch(struct gl_context *ctx);
void _mesa_glthread_finish(struct gl_context *ctx);
@ -138,5 +139,11 @@ static inline void
_mesa_glthread_finish(struct gl_context *ctx)
{
}
static inline void
_mesa_glthread_restore_dispatch(struct gl_context *ctx);
{
}
#endif /* !HAVE_PTHREAD */
#endif /* _GLTHREAD_H*/