glthread: handle gl{Push,Pop}ClientAttrib{DefaultEXT} for glthread states
authorMarek Olšák <marek.olsak@amd.com>
Sat, 21 Mar 2020 06:58:51 +0000 (02:58 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 30 Apr 2020 22:01:55 +0000 (22:01 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4314>

src/mapi/glapi/gen/EXT_direct_state_access.xml
src/mapi/glapi/gen/gl_API.xml
src/mesa/main/glthread.h
src/mesa/main/glthread_varray.c

index d570f688e53b330cd661550fa4ab857d8add5662..4314973cc01c751f47a8b225949972c5b6062729 100644 (file)
 
    <!-- OpenGL 1.1 -->
 
 
    <!-- OpenGL 1.1 -->
 
-    <function name="ClientAttribDefaultEXT">
+    <function name="ClientAttribDefaultEXT"
+              marshal_call_after="if (COMPAT) _mesa_glthread_ClientAttribDefault(ctx, mask);">
        <param name="mask" type="GLbitfield" />
     </function>
 
        <param name="mask" type="GLbitfield" />
     </function>
 
-    <function name="PushClientAttribDefaultEXT">
+    <function name="PushClientAttribDefaultEXT"
+              marshal_call_after="if (COMPAT) _mesa_glthread_PushClientAttrib(ctx, mask, true);">
        <param name="mask" type="GLbitfield" />
     </function>
 
        <param name="mask" type="GLbitfield" />
     </function>
 
index 2ee1c7f9edac3d308d52ae0c59d129bd1f268eef..42857e4fc6844707a7310c1c3270355c1e5876e3 100644 (file)
         <glx rop="194"/>
     </function>
 
         <glx rop="194"/>
     </function>
 
-    <function name="PopClientAttrib" deprecated="3.1">
+    <function name="PopClientAttrib" deprecated="3.1"
+              marshal_call_after="if (COMPAT) _mesa_glthread_PopClientAttrib(ctx);">
         <glx handcode="true"/>
     </function>
 
         <glx handcode="true"/>
     </function>
 
-    <function name="PushClientAttrib" deprecated="3.1">
+    <function name="PushClientAttrib" deprecated="3.1"
+              marshal_call_after="if (COMPAT) _mesa_glthread_PushClientAttrib(ctx, mask, false);">
         <param name="mask" type="GLbitfield"/>
         <glx handcode="true"/>
     </function>
         <param name="mask" type="GLbitfield"/>
         <glx handcode="true"/>
     </function>
index 35b5f1981bedadd26c0ec05a61808cdc81d6d1a6..db733723e1581bd6d3c70b7ef4433eed0ec2d02f 100644 (file)
@@ -51,6 +51,7 @@
 #include "util/u_queue.h"
 #include "GL/gl.h"
 #include "compiler/shader_enums.h"
 #include "util/u_queue.h"
 #include "GL/gl.h"
 #include "compiler/shader_enums.h"
+#include "main/config.h"
 
 struct gl_context;
 struct gl_buffer_object;
 
 struct gl_context;
 struct gl_buffer_object;
@@ -99,6 +100,18 @@ struct glthread_batch
    uint8_t buffer[MARSHAL_MAX_CMD_SIZE];
 };
 
    uint8_t buffer[MARSHAL_MAX_CMD_SIZE];
 };
 
+struct glthread_client_attrib {
+   struct glthread_vao VAO;
+   GLuint CurrentArrayBufferName;
+   int ClientActiveTexture;
+   GLuint RestartIndex;
+   bool PrimitiveRestart;
+   bool PrimitiveRestartFixedIndex;
+
+   /** Whether this element of the client attrib stack contains saved state. */
+   bool Valid;
+};
+
 struct glthread_state
 {
    /** Multithreaded queue. */
 struct glthread_state
 {
    /** Multithreaded queue. */
@@ -143,6 +156,8 @@ struct glthread_state
    struct glthread_vao *CurrentVAO;
    struct glthread_vao *LastLookedUpVAO;
    struct glthread_vao DefaultVAO;
    struct glthread_vao *CurrentVAO;
    struct glthread_vao *LastLookedUpVAO;
    struct glthread_vao DefaultVAO;
+   struct glthread_client_attrib ClientAttribStack[MAX_CLIENT_ATTRIB_STACK_DEPTH];
+   int ClientAttribStackTop;
    int ClientActiveTexture;
 
    /** Currently-bound buffer object IDs. */
    int ClientActiveTexture;
 
    /** Currently-bound buffer object IDs. */
@@ -188,5 +203,9 @@ void _mesa_glthread_DSAAttribPointer(struct gl_context *ctx, GLuint vao,
                                      GLuint buffer, gl_vert_attrib attrib,
                                      GLint size, GLenum type, GLsizei stride,
                                      GLintptr offset);
                                      GLuint buffer, gl_vert_attrib attrib,
                                      GLint size, GLenum type, GLsizei stride,
                                      GLintptr offset);
+void _mesa_glthread_PushClientAttrib(struct gl_context *ctx, GLbitfield mask,
+                                     bool set_default);
+void _mesa_glthread_PopClientAttrib(struct gl_context *ctx);
+void _mesa_glthread_ClientAttribDefault(struct gl_context *ctx, GLbitfield mask);
 
 #endif /* _GLTHREAD_H*/
 
 #endif /* _GLTHREAD_H*/
index ff333af00790f0db82cc85aa5408774037f1454e..8fae4af3123c39353c1cee8248434eca81a48c7f 100644 (file)
@@ -308,3 +308,89 @@ _mesa_glthread_DSAAttribPointer(struct gl_context *ctx, GLuint vaobj,
    attrib_pointer(glthread, vao, buffer, attrib, size, type, stride,
                   (const void*)offset);
 }
    attrib_pointer(glthread, vao, buffer, attrib, size, type, stride,
                   (const void*)offset);
 }
+
+void
+_mesa_glthread_PushClientAttrib(struct gl_context *ctx, GLbitfield mask,
+                                bool set_default)
+{
+   struct glthread_state *glthread = &ctx->GLThread;
+
+   if (glthread->ClientAttribStackTop >= MAX_CLIENT_ATTRIB_STACK_DEPTH)
+      return;
+
+   struct glthread_client_attrib *top =
+      &glthread->ClientAttribStack[glthread->ClientAttribStackTop];
+
+   if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
+      top->VAO = *glthread->CurrentVAO;
+      top->CurrentArrayBufferName = glthread->CurrentArrayBufferName;
+      top->ClientActiveTexture = glthread->ClientActiveTexture;
+      top->RestartIndex = glthread->RestartIndex;
+      top->PrimitiveRestart = glthread->PrimitiveRestart;
+      top->PrimitiveRestartFixedIndex = glthread->PrimitiveRestartFixedIndex;
+      top->Valid = true;
+   } else {
+      top->Valid = false;
+   }
+
+   glthread->ClientAttribStackTop++;
+
+   if (set_default)
+      _mesa_glthread_ClientAttribDefault(ctx, mask);
+}
+
+void
+_mesa_glthread_PopClientAttrib(struct gl_context *ctx)
+{
+   struct glthread_state *glthread = &ctx->GLThread;
+
+   if (glthread->ClientAttribStackTop == 0)
+      return;
+
+   glthread->ClientAttribStackTop--;
+
+   struct glthread_client_attrib *top =
+      &glthread->ClientAttribStack[glthread->ClientAttribStackTop];
+
+   if (!top->Valid)
+      return;
+
+   /* Popping a delete VAO is an error. */
+   struct glthread_vao *vao = NULL;
+   if (top->VAO.Name) {
+      vao = lookup_vao(ctx, top->VAO.Name);
+      if (!vao)
+         return;
+   }
+
+   /* Restore states. */
+   glthread->CurrentArrayBufferName = top->CurrentArrayBufferName;
+   glthread->ClientActiveTexture = top->ClientActiveTexture;
+   glthread->RestartIndex = top->RestartIndex;
+   glthread->PrimitiveRestart = top->PrimitiveRestart;
+   glthread->PrimitiveRestartFixedIndex = top->PrimitiveRestartFixedIndex;
+
+   if (!vao)
+      vao = &glthread->DefaultVAO;
+
+   assert(top->VAO.Name == vao->Name);
+   *vao = top->VAO; /* Copy all fields. */
+   glthread->CurrentVAO = vao;
+}
+
+void
+_mesa_glthread_ClientAttribDefault(struct gl_context *ctx, GLbitfield mask)
+{
+   struct glthread_state *glthread = &ctx->GLThread;
+
+   if (!(mask & GL_CLIENT_VERTEX_ARRAY_BIT))
+      return;
+
+   glthread->CurrentArrayBufferName = 0;
+   glthread->ClientActiveTexture = 0;
+   glthread->RestartIndex = 0;
+   glthread->PrimitiveRestart = false;
+   glthread->PrimitiveRestartFixedIndex = false;
+   glthread->CurrentVAO = &glthread->DefaultVAO;
+   _mesa_glthread_reset_vao(glthread->CurrentVAO);
+}