summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/glsl/glsl_parser_extras.h1
-rw-r--r--src/gallium/drivers/radeonsi/si_pipe.c8
-rw-r--r--src/mesa/drivers/dri/i915/intel_context.c2
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.c2
-rw-r--r--src/mesa/drivers/dri/nouveau/nouveau_context.c2
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_common_context.c2
-rw-r--r--src/mesa/drivers/osmesa/osmesa.c8
-rw-r--r--src/mesa/drivers/x11/xm_api.c4
-rw-r--r--src/mesa/main/context.c7
-rw-r--r--src/mesa/main/context.h2
-rw-r--r--src/mesa/state_tracker/st_context.c8
11 files changed, 29 insertions, 17 deletions
diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
index f92d2160aac..edc6fc06c77 100644
--- a/src/compiler/glsl/glsl_parser_extras.h
+++ b/src/compiler/glsl/glsl_parser_extras.h
@@ -997,6 +997,7 @@ extern "C" {
#endif
struct glcpp_parser;
+struct _mesa_glsl_parse_state;
typedef void (*glcpp_extension_iterator)(
struct _mesa_glsl_parse_state *state,
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index fa96ce34224..e9e1bd0aa38 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -150,6 +150,9 @@ static void si_destroy_context(struct pipe_context *context)
struct si_context *sctx = (struct si_context *)context;
int i;
+ util_queue_finish(&sctx->screen->shader_compiler_queue);
+ util_queue_finish(&sctx->screen->shader_compiler_queue_low_priority);
+
/* Unreference the framebuffer normally to disable related logic
* properly.
*/
@@ -702,6 +705,9 @@ static void si_destroy_screen(struct pipe_screen* pscreen)
if (!sscreen->ws->unref(sscreen->ws))
return;
+ mtx_destroy(&sscreen->aux_context_lock);
+ sscreen->aux_context->destroy(sscreen->aux_context);
+
util_queue_destroy(&sscreen->shader_compiler_queue);
util_queue_destroy(&sscreen->shader_compiler_queue_low_priority);
@@ -728,8 +734,6 @@ static void si_destroy_screen(struct pipe_screen* pscreen)
si_gpu_load_kill_thread(sscreen);
mtx_destroy(&sscreen->gpu_load_mutex);
- mtx_destroy(&sscreen->aux_context_lock);
- sscreen->aux_context->destroy(sscreen->aux_context);
slab_destroy_parent(&sscreen->pool_transfers);
diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c
index c23e5ffb26e..aa3175816cf 100644
--- a/src/mesa/drivers/dri/i915/intel_context.c
+++ b/src/mesa/drivers/dri/i915/intel_context.c
@@ -599,7 +599,7 @@ intelDestroyContext(__DRIcontext * driContextPriv)
driDestroyOptionCache(&intel->optionCache);
/* free the Mesa context */
- _mesa_free_context_data(&intel->ctx);
+ _mesa_free_context_data(&intel->ctx, true);
_math_matrix_dtr(&intel->ViewportMatrix);
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index ab637ddf721..df12f373f22 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -1226,7 +1226,7 @@ intelDestroyContext(__DRIcontext * driContextPriv)
driDestroyOptionCache(&brw->optionCache);
/* free the Mesa context */
- _mesa_free_context_data(&brw->ctx);
+ _mesa_free_context_data(&brw->ctx, true);
ralloc_free(brw);
driContextPriv->driverPrivate = NULL;
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c
index 93f6ce473a1..8fec35237c0 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_context.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c
@@ -217,7 +217,7 @@ nouveau_context_deinit(struct gl_context *ctx)
nouveau_object_del(&nctx->hw.chan);
nouveau_scratch_destroy(ctx);
- _mesa_free_context_data(ctx);
+ _mesa_free_context_data(ctx, true);
}
void
diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c
index 47719baa575..689304aa4fc 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common_context.c
+++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c
@@ -270,7 +270,7 @@ void radeonDestroyContext(__DRIcontext *driContextPriv )
/* free atom list */
/* free the Mesa context data */
- _mesa_free_context_data(&radeon->glCtx);
+ _mesa_free_context_data(&radeon->glCtx, true);
/* free the option cache */
driDestroyOptionCache(&radeon->optionCache);
diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c
index 44374a2e917..a065161b89e 100644
--- a/src/mesa/drivers/osmesa/osmesa.c
+++ b/src/mesa/drivers/osmesa/osmesa.c
@@ -854,7 +854,7 @@ OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual);
if (!osmesa->gl_buffer) {
_mesa_destroy_visual( osmesa->gl_visual );
- _mesa_free_context_data( &osmesa->mesa );
+ _mesa_free_context_data(&osmesa->mesa, true);
free(osmesa);
return NULL;
}
@@ -891,7 +891,7 @@ OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
!_tnl_CreateContext( ctx ) ||
!_swsetup_CreateContext( ctx )) {
_mesa_destroy_visual(osmesa->gl_visual);
- _mesa_free_context_data(ctx);
+ _mesa_free_context_data(ctx, true);
free(osmesa);
return NULL;
}
@@ -919,7 +919,7 @@ OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
if (ctx->Version < version_major * 10 + version_minor) {
_mesa_destroy_visual(osmesa->gl_visual);
- _mesa_free_context_data(ctx);
+ _mesa_free_context_data(ctx, true);
free(osmesa);
return NULL;
}
@@ -955,7 +955,7 @@ OSMesaDestroyContext( OSMesaContext osmesa )
_mesa_destroy_visual( osmesa->gl_visual );
_mesa_reference_framebuffer( &osmesa->gl_buffer, NULL );
- _mesa_free_context_data( &osmesa->mesa );
+ _mesa_free_context_data(&osmesa->mesa, true);
free( osmesa );
}
}
diff --git a/src/mesa/drivers/x11/xm_api.c b/src/mesa/drivers/x11/xm_api.c
index e8405950656..90f89a36221 100644
--- a/src/mesa/drivers/x11/xm_api.c
+++ b/src/mesa/drivers/x11/xm_api.c
@@ -945,7 +945,7 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
!_vbo_CreateContext( mesaCtx ) ||
!_tnl_CreateContext( mesaCtx ) ||
!_swsetup_CreateContext( mesaCtx )) {
- _mesa_free_context_data(&c->mesa);
+ _mesa_free_context_data(&c->mesa, true);
free(c);
return NULL;
}
@@ -982,7 +982,7 @@ void XMesaDestroyContext( XMesaContext c )
_swrast_DestroyContext( mesaCtx );
_tnl_DestroyContext( mesaCtx );
_vbo_DestroyContext( mesaCtx );
- _mesa_free_context_data( mesaCtx );
+ _mesa_free_context_data(mesaCtx, true);
free( c );
}
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
index 7300d2f3c46..2c3d9a11ce3 100644
--- a/src/mesa/main/context.c
+++ b/src/mesa/main/context.c
@@ -1310,7 +1310,7 @@ fail:
* \sa _mesa_initialize_context() and init_attrib_groups().
*/
void
-_mesa_free_context_data( struct gl_context *ctx )
+_mesa_free_context_data(struct gl_context *ctx, bool destroy_compiler_types)
{
if (!_mesa_get_current_context()){
/* No current context, but we may need one in order to delete
@@ -1385,7 +1385,8 @@ _mesa_free_context_data( struct gl_context *ctx )
free(ctx->VersionString);
- _mesa_destroy_shader_compiler_types();
+ if (destroy_compiler_types)
+ _mesa_destroy_shader_compiler_types();
/* unbind the context if it's currently bound */
if (ctx == _mesa_get_current_context()) {
@@ -1405,7 +1406,7 @@ void
_mesa_destroy_context( struct gl_context *ctx )
{
if (ctx) {
- _mesa_free_context_data(ctx);
+ _mesa_free_context_data(ctx, true);
free( (void *) ctx );
}
}
diff --git a/src/mesa/main/context.h b/src/mesa/main/context.h
index 7de10e9924b..e9b270df14c 100644
--- a/src/mesa/main/context.h
+++ b/src/mesa/main/context.h
@@ -115,7 +115,7 @@ _mesa_initialize_context( struct gl_context *ctx,
const struct dd_function_table *driverFunctions);
extern void
-_mesa_free_context_data( struct gl_context *ctx );
+_mesa_free_context_data(struct gl_context *ctx, bool destroy_compiler_types);
extern void
_mesa_destroy_context( struct gl_context *ctx );
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 41239067084..8f2acafbca3 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -85,6 +85,7 @@
#include "util/u_upload_mgr.h"
#include "util/u_vbuf.h"
#include "cso_cache/cso_context.h"
+#include "compiler/glsl/glsl_parser_extras.h"
DEBUG_GET_ONCE_BOOL_OPTION(mesa_mvp_dp4, "MESA_MVP_DP4", FALSE)
@@ -977,13 +978,18 @@ st_destroy_context(struct st_context *st)
st_destroy_program_variants(st);
- _mesa_free_context_data(ctx);
+ _mesa_free_context_data(ctx, false);
/* This will free the st_context too, so 'st' must not be accessed
* afterwards. */
st_destroy_context_priv(st, true);
st = NULL;
+ /* This must be called after st_destroy_context_priv() to avoid a race
+ * condition between any shader compiler threads and context destruction.
+ */
+ _mesa_destroy_shader_compiler_types();
+
free(ctx);
if (save_ctx == ctx) {