From dbdd7231c252cbed52a196c86725730c07cd8006 Mon Sep 17 00:00:00 2001
From: Timothy Arceri <tarceri@itsqueeze.com>
Date: Fri, 31 Mar 2017 11:45:34 +1100
Subject: mesa: disable glthread when DEBUG_OUTPUT_SYNCHRONOUS is enabled
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

We could re-enable it also but I haven't tested that yet, and I'm
not sure we care much anyway.

V2: don't disable it from with the call itself. We need a custom
    marshalling function or we get stuck waiting for thread to
    finish.

V3: tidy up redundant code copied from generated version.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
---
 src/mapi/glapi/gen/gl_API.xml |  2 +-
 src/mesa/main/marshal.c       | 37 +++++++++++++++++++++++++++++++++++++
 src/mesa/main/marshal.h       |  8 ++++++++
 3 files changed, 46 insertions(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
index 8392e3a520b..af482707d03 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -2361,7 +2361,7 @@
         <glx rop="138" handcode="client"/>
     </function>
 
-    <function name="Enable" es1="1.0" es2="2.0">
+    <function name="Enable" es1="1.0" es2="2.0" marshal="custom">
         <param name="cap" type="GLenum"/>
         <glx rop="139" handcode="client"/>
     </function>
diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c
index b01c0739972..ae32d257e93 100644
--- a/src/mesa/main/marshal.c
+++ b/src/mesa/main/marshal.c
@@ -67,6 +67,43 @@ _mesa_marshal_Flush(void)
    _mesa_glthread_flush_batch(ctx);
 }
 
+/* Enable: marshalled asynchronously */
+struct marshal_cmd_Enable
+{
+   struct marshal_cmd_base cmd_base;
+   GLenum cap;
+};
+
+void
+_mesa_unmarshal_Enable(struct gl_context *ctx,
+                       const struct marshal_cmd_Enable *cmd)
+{
+   const GLenum cap = cmd->cap;
+   CALL_Enable(ctx->CurrentServerDispatch, (cap));
+}
+
+void GLAPIENTRY
+_mesa_marshal_Enable(GLenum cap)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct marshal_cmd_Enable *cmd;
+   debug_print_marshal("Enable");
+
+   if (cap == GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB) {
+      _mesa_glthread_finish(ctx);
+      _mesa_glthread_restore_dispatch(ctx);
+   } else {
+      cmd = _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_Enable,
+                                            sizeof(*cmd));
+      cmd->cap = cap;
+      _mesa_post_marshal_hook(ctx);
+      return;
+   }
+
+   _mesa_glthread_finish(ctx);
+   debug_print_sync_fallback("Enable");
+   CALL_Enable(ctx->CurrentServerDispatch, (cap));
+}
 
 struct marshal_cmd_ShaderSource
 {
diff --git a/src/mesa/main/marshal.h b/src/mesa/main/marshal.h
index 3d104240afe..2f1509b2d55 100644
--- a/src/mesa/main/marshal.h
+++ b/src/mesa/main/marshal.h
@@ -197,6 +197,7 @@ _mesa_glthread_is_compat_bind_vertex_array(const struct gl_context *ctx)
    return ctx->API != API_OPENGL_CORE;
 }
 
+struct marshal_cmd_Enable;
 struct marshal_cmd_ShaderSource;
 struct marshal_cmd_Flush;
 struct marshal_cmd_BindBuffer;
@@ -204,6 +205,13 @@ struct marshal_cmd_BufferData;
 struct marshal_cmd_BufferSubData;
 struct marshal_cmd_ClearBufferfv;
 
+void
+_mesa_unmarshal_Enable(struct gl_context *ctx,
+                       const struct marshal_cmd_Enable *cmd);
+
+void GLAPIENTRY
+_mesa_marshal_Enable(GLenum cap);
+
 void GLAPIENTRY
 _mesa_marshal_ShaderSource(GLuint shader, GLsizei count,
                            const GLchar * const *string, const GLint *length);
-- 
cgit v1.2.3