summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mesa/main/glthread.c49
-rw-r--r--src/mesa/main/glthread.h3
-rw-r--r--src/mesa/main/glthread_marshal.h13
3 files changed, 48 insertions, 17 deletions
diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c
index dfeaac8dffe..0fa42de1d51 100644
--- a/src/mesa/main/glthread.c
+++ b/src/mesa/main/glthread.c
@@ -203,18 +203,15 @@ _mesa_glthread_init(struct gl_context *ctx)
}
glthread->next_batch = &glthread->batches[glthread->next];
glthread->used = 0;
-
- glthread->enabled = true;
glthread->stats.queue = &glthread->queue;
- ctx->CurrentClientDispatch = ctx->MarshalExec;
-
glthread->LastDListChangeBatchIndex = -1;
/* glthread takes over all L3 pinning */
ctx->st->pin_thread_counter = ST_L3_PINNING_DISABLED;
_mesa_glthread_update_draw_always_async(ctx);
+ _mesa_glthread_enable(ctx);
/* Execute the thread initialization function in the thread. */
struct util_queue_fence fence;
@@ -236,23 +233,47 @@ _mesa_glthread_destroy(struct gl_context *ctx)
{
struct glthread_state *glthread = &ctx->GLThread;
- if (!glthread->enabled)
+ _mesa_glthread_disable(ctx);
+
+ if (util_queue_is_initialized(&glthread->queue)) {
+ util_queue_destroy(&glthread->queue);
+
+ for (unsigned i = 0; i < MARSHAL_MAX_BATCHES; i++)
+ util_queue_fence_destroy(&glthread->batches[i].fence);
+
+ _mesa_HashDeleteAll(glthread->VAOs, free_vao, NULL);
+ _mesa_DeleteHashTable(glthread->VAOs);
+ _mesa_glthread_release_upload_buffer(ctx);
+ }
+}
+
+void _mesa_glthread_enable(struct gl_context *ctx)
+{
+ if (ctx->GLThread.enabled ||
+ ctx->CurrentServerDispatch == ctx->ContextLost ||
+ ctx->GLThread.DebugOutputSynchronous)
return;
- _mesa_glthread_finish(ctx);
- util_queue_destroy(&glthread->queue);
+ ctx->GLThread.enabled = true;
+ ctx->CurrentClientDispatch = ctx->MarshalExec;
- for (unsigned i = 0; i < MARSHAL_MAX_BATCHES; i++)
- util_queue_fence_destroy(&glthread->batches[i].fence);
+ /* Update the dispatch only if the dispatch is current. */
+ if (_glapi_get_dispatch() == ctx->CurrentServerDispatch) {
+ _glapi_set_dispatch(ctx->CurrentClientDispatch);
+ }
+}
- _mesa_HashDeleteAll(glthread->VAOs, free_vao, NULL);
- _mesa_DeleteHashTable(glthread->VAOs);
- _mesa_glthread_release_upload_buffer(ctx);
+void _mesa_glthread_disable(struct gl_context *ctx)
+{
+ if (!ctx->GLThread.enabled)
+ return;
+
+ _mesa_glthread_finish(ctx);
ctx->GLThread.enabled = false;
ctx->CurrentClientDispatch = ctx->CurrentServerDispatch;
- /* Update the dispatch only if the context is current. */
+ /* Update the dispatch only if the dispatch is current. */
if (_glapi_get_dispatch() == ctx->MarshalExec) {
_glapi_set_dispatch(ctx->CurrentClientDispatch);
}
@@ -266,7 +287,7 @@ _mesa_glthread_flush_batch(struct gl_context *ctx)
return;
if (ctx->CurrentServerDispatch == ctx->ContextLost) {
- _mesa_glthread_destroy(ctx);
+ _mesa_glthread_disable(ctx);
return;
}
diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h
index f9af4038ac4..9099567aa8c 100644
--- a/src/mesa/main/glthread.h
+++ b/src/mesa/main/glthread.h
@@ -264,6 +264,7 @@ struct glthread_state
bool Blend;
bool DepthTest;
bool CullFace;
+ bool DebugOutputSynchronous;
bool Lighting;
bool PolygonStipple;
@@ -296,6 +297,8 @@ void _mesa_glthread_init_dispatch6(struct gl_context *ctx,
void _mesa_glthread_init_dispatch7(struct gl_context *ctx,
struct _glapi_table *table);
+void _mesa_glthread_enable(struct gl_context *ctx);
+void _mesa_glthread_disable(struct gl_context *ctx);
void _mesa_glthread_flush_batch(struct gl_context *ctx);
void _mesa_glthread_finish(struct gl_context *ctx);
void _mesa_glthread_finish_before(struct gl_context *ctx, const char *func);
diff --git a/src/mesa/main/glthread_marshal.h b/src/mesa/main/glthread_marshal.h
index 25093eeab07..e070efd848e 100644
--- a/src/mesa/main/glthread_marshal.h
+++ b/src/mesa/main/glthread_marshal.h
@@ -433,12 +433,13 @@ _mesa_glthread_Enable(struct gl_context *ctx, GLenum cap)
case GL_PRIMITIVE_RESTART_FIXED_INDEX:
_mesa_glthread_set_prim_restart(ctx, cap, true);
break;
- case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
- _mesa_glthread_destroy(ctx);
- break;
case GL_BLEND:
ctx->GLThread.Blend = true;
break;
+ case GL_DEBUG_OUTPUT_SYNCHRONOUS:
+ _mesa_glthread_disable(ctx);
+ ctx->GLThread.DebugOutputSynchronous = true;
+ break;
case GL_DEPTH_TEST:
ctx->GLThread.DepthTest = true;
break;
@@ -483,6 +484,10 @@ _mesa_glthread_Disable(struct gl_context *ctx, GLenum cap)
case GL_CULL_FACE:
ctx->GLThread.CullFace = false;
break;
+ case GL_DEBUG_OUTPUT_SYNCHRONOUS:
+ ctx->GLThread.DebugOutputSynchronous = false;
+ _mesa_glthread_enable(ctx);
+ break;
case GL_DEPTH_TEST:
ctx->GLThread.DepthTest = false;
break;
@@ -519,6 +524,8 @@ _mesa_glthread_IsEnabled(struct gl_context *ctx, GLenum cap)
return ctx->GLThread.Blend;
case GL_CULL_FACE:
return ctx->GLThread.CullFace;
+ case GL_DEBUG_OUTPUT_SYNCHRONOUS:
+ return ctx->GLThread.DebugOutputSynchronous;
case GL_DEPTH_TEST:
return ctx->GLThread.DepthTest;
case GL_LIGHTING: